From 95ffc24e56db02109683b8ac0dcf31dd759bb02c Mon Sep 17 00:00:00 2001 From: Piotr Date: Mon, 7 Jan 2019 22:24:51 +0100 Subject: [PATCH 01/12] Use setuptools and don't install in /opt/graphite anymore Don't install in /opt/graphite anymore, this is just strange and causes nothing but trouble. Setuptools does not support it either. Switch to setuptools to get rid of following warnings: UserWarning: Unknown distribution option: 'install_requires' UserWarning: Unknown distribution option: 'long_description_content_type' --- setup.py | 145 ++++++++++++++++++------------------------------------- 1 file changed, 47 insertions(+), 98 deletions(-) diff --git a/setup.py b/setup.py index 245e5c859..4becb8ca6 100644 --- a/setup.py +++ b/setup.py @@ -1,93 +1,45 @@ #!/usr/bin/env python -from __future__ import with_statement - -import os -try: - from ConfigParser import ConfigParser, DuplicateSectionError # Python 2 -except ImportError: - from configparser import ConfigParser, DuplicateSectionError # Python 3 - from glob import glob from collections import defaultdict - -# io.StringIO is strictly unicode only. Python 2 StringIO.StringIO accepts -# bytes, so we'll conveniently ignore decoding and reencoding the file there. -try: - from StringIO import StringIO # Python 2 -except ImportError: - from io import StringIO # Python 3 - -# Graphite historically has an install prefix set in setup.cfg. Being in a -# configuration file, it's not easy to override it or unset it (for installing -# graphite in a virtualenv for instance). -# The prefix is now set by ``setup.py`` and *unset* if an environment variable -# named ``GRAPHITE_NO_PREFIX`` is present. -# While ``setup.cfg`` doesn't contain the prefix anymore, the *unset* step is -# required for installations from a source tarball because running -# ``python setup.py sdist`` will re-add the prefix to the tarball's -# ``setup.cfg``. -with open('setup.cfg', 'r') as f: - orig_setup_cfg = f.read() -cf = ConfigParser() -cf.readfp(StringIO(orig_setup_cfg), 'setup.cfg') - -if os.environ.get('GRAPHITE_NO_PREFIX') or os.environ.get('READTHEDOCS'): - cf.remove_section('install') -else: - try: - cf.add_section('install') - except DuplicateSectionError: - pass - if not cf.has_option('install', 'prefix'): - cf.set('install', 'prefix', '/opt/graphite') - if not cf.has_option('install', 'install-lib'): - cf.set('install', 'install-lib', '%(prefix)s/webapp') - -with open('setup.cfg', 'w') as f: - cf.write(f) - -if os.environ.get('USE_SETUPTOOLS'): - from setuptools import setup - setup_kwargs = dict(zip_safe=0) - -else: - from distutils.core import setup - setup_kwargs = dict() +from setuptools import setup +import os storage_dirs = [] -for subdir in ('whisper/dummy.txt', 'ceres/dummy.txt', 'rrd/dummy.txt', 'log/dummy.txt', 'log/webapp/dummy.txt'): - storage_dirs.append( ('storage/%s' % subdir, []) ) +for subdir in ('whisper/dummy.txt', 'ceres/dummy.txt', 'rrd/dummy.txt', + 'log/dummy.txt', 'log/webapp/dummy.txt'): + storage_dirs.append( ('storage/%s' % subdir, []) ) webapp_content = defaultdict(list) for root, dirs, files in os.walk('webapp/content'): - for filename in files: - filepath = os.path.join(root, filename) - webapp_content[root].append(filepath) + for filename in files: + filepath = os.path.join(root, filename) + webapp_content[root].append(filepath) + +conf_files = [('conf', glob('conf/*.example'))] +examples = [('examples', glob('examples/example-*'))] -conf_files = [ ('conf', glob('conf/*.example')) ] -examples = [ ('examples', glob('examples/example-*')) ] def read(fname): with open(os.path.join(os.path.dirname(__file__), fname)) as f: return f.read() -try: - setup( - name='graphite-web', - version='1.2.0', - url='http://graphiteapp.org/', - author='Chris Davis', - author_email='chrismd@gmail.com', - license='Apache Software License 2.0', - description='Enterprise scalable realtime graphing', - long_description=read('README.md'), - long_description_content_type='text/markdown', - package_dir={'' : 'webapp'}, - packages=[ + +setup( + name='graphite-web', + version='1.2.0', + url='http://graphiteapp.org/', + author='Chris Davis', + author_email='chrismd@gmail.com', + license='Apache Software License 2.0', + description='Enterprise scalable realtime graphing', + long_description=read('README.md'), + long_description_content_type='text/markdown', + package_dir={'' : 'webapp'}, + packages=[ 'graphite', 'graphite.account', 'graphite.account.migrations', @@ -110,29 +62,26 @@ def read(fname): 'graphite.version', 'graphite.whitelist', 'graphite.worker_pool', - ], - package_data={'graphite' : - ['templates/*', 'local_settings.py.example']}, - scripts=glob('bin/*'), - data_files=list(webapp_content.items()) + storage_dirs + conf_files + examples, - install_requires=['Django>=1.8,<2.1', 'django-tagging==0.4.3', 'pytz', 'pyparsing', 'cairocffi', 'urllib3', 'scandir', 'six'], - classifiers=[ - 'Intended Audience :: Developers', - 'Natural Language :: English', - 'License :: OSI Approved :: Apache Software License', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: Implementation :: CPython', - 'Programming Language :: Python :: Implementation :: PyPy', - ], - **setup_kwargs - ) -finally: - with open('setup.cfg', 'w') as f: - f.write(orig_setup_cfg) + ], + package_data={'graphite': ['templates/*', 'local_settings.py.example']}, + scripts=glob('bin/*'), + data_files=list(webapp_content.items()) + storage_dirs + conf_files + examples, + install_requires=['Django>=1.8,<2.1', 'django-tagging==0.4.3', 'pytz', + 'pyparsing', 'cairocffi', 'urllib3', 'scandir', 'six'], + classifiers=[ + 'Intended Audience :: Developers', + 'Natural Language :: English', + 'License :: OSI Approved :: Apache Software License', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: PyPy', + ], + zip_safe=False +) From 41a7eda31a23c043e3d84e68689a74b8255a9237 Mon Sep 17 00:00:00 2001 From: Piotr Date: Fri, 18 Jan 2019 23:55:43 +0100 Subject: [PATCH 02/12] Remove synthesize from installation documentation Synthesize is not being updated anymore (latest version is 1.0.2). Removing it from the docs to not confuse users. And we have an official docker image now. --- docs/install-synthesize.rst | 6 ------ docs/install.rst | 5 ++--- 2 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 docs/install-synthesize.rst diff --git a/docs/install-synthesize.rst b/docs/install-synthesize.rst deleted file mode 100644 index f48b3327c..000000000 --- a/docs/install-synthesize.rst +++ /dev/null @@ -1,6 +0,0 @@ -Installing From Synthesize -========================== - -`Synthesize `_ is a script dedicated to making Graphite easy to install. As of this writing, the default installation provides Graphite 0.9.15 for Ubuntu Linux 14.04 LTS with an experimental release candidate for tracking Graphite ``HEAD``. Users may run the installation script manually, or they can choose to use the provided Vagrantfile. - -For detailed instructions, please refer to the official project documentation on the `Synthesize `_ website. diff --git a/docs/install.rst b/docs/install.rst index a9c4dea0a..352b1d2ee 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -137,7 +137,6 @@ Several installation options exist: install-source install-pip install-virtualenv - install-synthesize Initial Configuration @@ -145,7 +144,7 @@ Initial Configuration .. toctree:: :maxdepth: 2 - + config-database-setup config-webapp config-local-settings @@ -186,7 +185,7 @@ Post-Install Tasks Windows Users ------------- -Unfortunately, native Graphite on Windows is completely unsupported, but you can run Graphite on Windows in `Docker`_ or the :doc:`Installing via Synthesize ` article will help you set up a Vagrant VM that will run Graphite. In order to leverage this, you will need to install `Vagrant `_. +Unfortunately, native Graphite on Windows is unsupported, but you can run Graphite on Windows in `Docker`_. .. _Apache: https://projects.apache.org/project.html?httpd-http_server From c1aa9745f0705ae0763bc0305d33968864c60746 Mon Sep 17 00:00:00 2001 From: Piotr Date: Thu, 31 Jan 2019 14:07:38 +0100 Subject: [PATCH 03/12] Default GRAPHITE_ROOT to sys.prefix The GRAPHITE_ROOT was to be set to the parent directory of the path where graphite-web is installed. The `storage`, `static` and `content` directories are set to be dubdirs of GRAPHITE_ROOT. If installing Graphite in the regular Python path's this would make the directories look something like `/usr/lib/python3.7/{storage,static,conf}`. Which is probably not what the user wants. This sets the default to `sys.prefix`. sys.prefix --- webapp/graphite/settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/graphite/settings.py b/webapp/graphite/settings.py index 0f6b35e01..94ab903aa 100644 --- a/webapp/graphite/settings.py +++ b/webapp/graphite/settings.py @@ -35,9 +35,9 @@ DATE_FORMAT = '%m/%d' # Filesystem layout -WEB_DIR = dirname( abspath(__file__) ) +WEB_DIR = dirname(abspath(__file__)) WEBAPP_DIR = dirname(WEB_DIR) -GRAPHITE_ROOT = dirname(WEBAPP_DIR) +GRAPHITE_ROOT = sys.prefix # Initialize additional path variables # Defaults for these are set after local_settings is imported STATIC_ROOT = '' From f6e57922638ee1a6b8cf56d04a5dd1fb07f55ca6 Mon Sep 17 00:00:00 2001 From: Piotr Date: Thu, 31 Jan 2019 15:15:23 +0100 Subject: [PATCH 04/12] setup.py: update supported django version (2.1) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 4becb8ca6..a7ad6508e 100644 --- a/setup.py +++ b/setup.py @@ -66,7 +66,7 @@ def read(fname): package_data={'graphite': ['templates/*', 'local_settings.py.example']}, scripts=glob('bin/*'), data_files=list(webapp_content.items()) + storage_dirs + conf_files + examples, - install_requires=['Django>=1.8,<2.1', 'django-tagging==0.4.3', 'pytz', + install_requires=['Django>=1.8,<2.2', 'django-tagging==0.4.3', 'pytz', 'pyparsing', 'cairocffi', 'urllib3', 'scandir', 'six'], classifiers=[ 'Intended Audience :: Developers', From f44d8b001feb39d7699eb97e35efd96d10e0969c Mon Sep 17 00:00:00 2001 From: Piotr Date: Thu, 31 Jan 2019 15:39:48 +0100 Subject: [PATCH 05/12] logger.py: create directory if not exists --- webapp/graphite/logger.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/webapp/graphite/logger.py b/webapp/graphite/logger.py index 9cbc46992..c4fa9a143 100644 --- a/webapp/graphite/logger.py +++ b/webapp/graphite/logger.py @@ -12,7 +12,10 @@ See the License for the specific language governing permissions and limitations under the License.""" -import os, logging +import errno +import logging +import os + from logging.handlers import TimedRotatingFileHandler as Rotater try: from logging import NullHandler @@ -28,6 +31,19 @@ def emit(self, record): except ImportError as ie: # py2.6 from logging.handlers import FileHandler, StreamHandler from django.conf import settings +from django.core.exceptions import ImproperlyConfigured + + +# this can't be put in util.py because of circular depency between log.py +# and util.py +def _mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Directory already exists + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: + raise class GraphiteLogger: @@ -73,6 +89,14 @@ def _config_logger(log_file_name, name, activate, formatter = logging.Formatter( fmt='%(asctime)s.%(msecs)03d :: %(message)s', datefmt='%Y-%m-%d,%H:%M:%S') + try: + _mkdir_p(settings.LOG_DIR) + except OSError as exc: + raise ImproperlyConfigured(( + '\n\nCreation of log directory "{}" failed:\n{}\n' + 'Create the directory manually or change `GRAPHITE_ROOT` ' + 'or `LOG_DIR` in local_settings.py\n').format( + settings.LOG_DIR, exc)) log_file = os.path.join(settings.LOG_DIR, log_file_name) if settings.LOG_ROTATION: # if we want to rotate logs handler = Rotater(log_file, when=when, backupCount=backupCount) @@ -103,4 +127,4 @@ def rendering(self,msg,*args,**kwargs): return self.renderingLogger.info(msg,*args,**kwargs) -log = GraphiteLogger() # import-shared logger instance +log = GraphiteLogger() # import-shared logger instance From 89a0d6b226c1703cc15030500c3f18fc29938ca1 Mon Sep 17 00:00:00 2001 From: Piotr Date: Thu, 31 Jan 2019 21:43:45 +0100 Subject: [PATCH 06/12] Move static assets to the project directory Installing the static assets in the project directory instead of an external directory make installation easier. Add whitenoise to requires in setup.py so that the static assets are automatically (without user action) served after installation. Remove package_data from setup.py, you should use package_data or MANIFEST.in to specify which non-python files have to be installed, not both. --- MANIFEST.in | 2 +- setup.py | 16 +++++----------- webapp/graphite/settings.py | 5 ++--- .../{content => graphite/static}/css/darkX.css | 0 .../static}/css/darkX/button-close-focused.png | Bin .../css/darkX/button-maximize-focused.png | Bin .../css/darkX/button-minimize-focused.png | Bin .../css/darkX/frame-bottom-left-focused.png | Bin .../css/darkX/frame-bottom-mid-focused.png | Bin .../css/darkX/frame-bottom-right-focused.png | Bin .../static}/css/darkX/frame-left-focused.png | Bin .../static}/css/darkX/frame-right-focused.png | Bin .../static}/css/darkX/titlebar-left-focused.png | Bin .../static}/css/darkX/titlebar-mid-focused.png | Bin .../css/darkX/titlebar-right-focused.png | Bin .../static}/css/dashboard-default.css | 0 .../static}/css/dashboard-white.css | 0 .../static}/css/dashboard.css | 0 .../static}/css/default.css | 0 .../static}/css/default/bottom_left.gif | Bin .../static}/css/default/bottom_mid.gif | Bin .../static}/css/default/bottom_right.gif | Bin .../static}/css/default/bottom_right_resize.gif | Bin .../static}/css/default/center_left.gif | Bin .../static}/css/default/center_right.gif | Bin .../static}/css/default/clear.gif | Bin .../static}/css/default/close.gif | Bin .../static}/css/default/inspect.gif | Bin .../static}/css/default/maximize.gif | Bin .../static}/css/default/minimize.gif | Bin .../static}/css/default/overlay.png | Bin .../static}/css/default/resize.gif | Bin .../static}/css/default/sizer.gif | Bin .../static}/css/default/top_left.gif | Bin .../static}/css/default/top_mid.gif | Bin .../static}/css/default/top_right.gif | Bin .../{content => graphite/static}/css/table.css | 0 .../static}/html/completerHelp.html | 0 .../static}/html/searchHelp.html | 0 .../{content => graphite/static}/img/blank.gif | Bin .../static}/img/calendar.png | Bin .../static}/img/carbon-fiber.png | Bin .../{content => graphite/static}/img/clock.png | Bin .../static}/img/clock_16.png | Bin .../static}/img/favicon.ico | Bin .../static}/img/graphite-logo.png | Bin .../static}/img/graphite.png | Bin .../static}/img/graphite_short.png | Bin .../{content => graphite/static}/img/leaf.gif | Bin .../static}/img/mini-bottom2.gif | Bin .../static}/img/mini-top2.gif | Bin .../static}/img/move_down.png | Bin .../static}/img/move_up.png | Bin .../static}/img/overview.png | Bin .../static}/img/refresh.png | Bin .../{content => graphite/static}/img/save.png | Bin .../{content => graphite/static}/img/share.png | Bin .../{content => graphite/static}/img/trash.png | Bin .../{content => graphite/static}/img/upload.png | Bin .../{content => graphite/static}/js/ace/ace.js | 0 .../static}/js/ace/keybinding-vim.js | 0 .../static}/js/ace/mode-c_cpp.js | 0 .../static}/js/ace/mode-clojure.js | 0 .../static}/js/ace/mode-coffee.js | 0 .../static}/js/ace/mode-csharp.js | 0 .../static}/js/ace/mode-css.js | 0 .../static}/js/ace/mode-groovy.js | 0 .../static}/js/ace/mode-html.js | 0 .../static}/js/ace/mode-java.js | 0 .../static}/js/ace/mode-javascript.js | 0 .../static}/js/ace/mode-json.js | 0 .../static}/js/ace/theme-textmate.js | 0 .../static}/js/ace/worker-javascript.js | 0 .../{content => graphite/static}/js/browser.js | 0 .../static}/js/completer.js | 0 .../{content => graphite/static}/js/composer.js | 0 .../static}/js/composer_widgets.js | 0 .../static}/js/dashboard.js | 0 .../js/ext/adapter/ext/ext-base-debug.js | 0 .../static}/js/ext/adapter/ext/ext-base.js | 0 .../static}/js/ext/ext-all-debug.js | 0 .../static}/js/ext/ext-all.js | 0 .../static}/js/ext/resources/css/ext-all.css | 0 .../static}/js/ext/resources/icons/fam/SILK.txt | 0 .../js/ext/resources/icons/fam/accept.png | Bin .../static}/js/ext/resources/icons/fam/add.gif | Bin .../static}/js/ext/resources/icons/fam/add.png | Bin .../ext/resources/icons/fam/application_go.png | Bin .../icons/fam/application_view_list.png | Bin .../static}/js/ext/resources/icons/fam/book.png | Bin .../static}/js/ext/resources/icons/fam/cog.png | Bin .../js/ext/resources/icons/fam/cog_edit.png | Bin .../js/ext/resources/icons/fam/connect.gif | Bin .../js/ext/resources/icons/fam/connect.png | Bin .../ext/resources/icons/fam/control_rewind.png | Bin .../js/ext/resources/icons/fam/cross.gif | Bin .../js/ext/resources/icons/fam/delete.gif | Bin .../js/ext/resources/icons/fam/error.png | Bin .../js/ext/resources/icons/fam/feed_add.png | Bin .../js/ext/resources/icons/fam/feed_delete.png | Bin .../js/ext/resources/icons/fam/feed_error.png | Bin .../js/ext/resources/icons/fam/folder_go.png | Bin .../ext/resources/icons/fam/folder_wrench.png | Bin .../static}/js/ext/resources/icons/fam/grid.png | Bin .../js/ext/resources/icons/fam/image_add.png | Bin .../js/ext/resources/icons/fam/information.png | Bin .../js/ext/resources/icons/fam/plugin.gif | Bin .../js/ext/resources/icons/fam/plugin_add.gif | Bin .../js/ext/resources/icons/fam/rss_go.png | Bin .../ext/resources/icons/fam/table_refresh.png | Bin .../static}/js/ext/resources/icons/fam/user.gif | Bin .../static}/js/ext/resources/icons/fam/user.png | Bin .../js/ext/resources/icons/fam/user_add.gif | Bin .../js/ext/resources/icons/fam/user_add.png | Bin .../js/ext/resources/icons/fam/user_comment.png | Bin .../js/ext/resources/icons/fam/user_delete.gif | Bin .../js/ext/resources/icons/fam/user_delete.png | Bin .../js/ext/resources/icons/fam/user_edit.png | Bin .../js/ext/resources/icons/fam/user_female.gif | Bin .../js/ext/resources/icons/fam/user_female.png | Bin .../js/ext/resources/icons/fam/user_gray.png | Bin .../js/ext/resources/icons/fam/user_green.gif | Bin .../js/ext/resources/icons/fam/user_green.png | Bin .../js/ext/resources/icons/fam/user_orange.png | Bin .../js/ext/resources/icons/fam/user_red.png | Bin .../js/ext/resources/icons/fam/user_suit.gif | Bin .../js/ext/resources/icons/fam/user_suit.png | Bin .../images/default/box/corners-blue.gif | Bin .../resources/images/default/box/corners.gif | Bin .../ext/resources/images/default/box/l-blue.gif | Bin .../js/ext/resources/images/default/box/l.gif | Bin .../ext/resources/images/default/box/r-blue.gif | Bin .../js/ext/resources/images/default/box/r.gif | Bin .../resources/images/default/box/tb-blue.gif | Bin .../js/ext/resources/images/default/box/tb.gif | Bin .../resources/images/default/button/arrow.gif | Bin .../ext/resources/images/default/button/btn.gif | Bin .../images/default/button/group-cs.gif | Bin .../images/default/button/group-lr.gif | Bin .../images/default/button/group-tb.gif | Bin .../images/default/button/s-arrow-b-noline.gif | Bin .../images/default/button/s-arrow-b.gif | Bin .../images/default/button/s-arrow-bo.gif | Bin .../images/default/button/s-arrow-noline.gif | Bin .../images/default/button/s-arrow-o.gif | Bin .../resources/images/default/button/s-arrow.gif | Bin .../resources/images/default/dd/drop-add.gif | Bin .../ext/resources/images/default/dd/drop-no.gif | Bin .../resources/images/default/dd/drop-yes.gif | Bin .../images/default/editor/tb-sprite.gif | Bin .../resources/images/default/form/checkbox.gif | Bin .../images/default/form/clear-trigger.gif | Bin .../images/default/form/clear-trigger.psd | Bin .../images/default/form/date-trigger.gif | Bin .../images/default/form/date-trigger.psd | Bin .../images/default/form/error-tip-corners.gif | Bin .../images/default/form/exclamation.gif | Bin .../ext/resources/images/default/form/radio.gif | Bin .../images/default/form/search-trigger.gif | Bin .../images/default/form/search-trigger.psd | Bin .../resources/images/default/form/text-bg.gif | Bin .../images/default/form/trigger-square.gif | Bin .../images/default/form/trigger-square.psd | Bin .../images/default/form/trigger-tpl.gif | Bin .../resources/images/default/form/trigger.gif | Bin .../resources/images/default/form/trigger.psd | Bin .../resources/images/default/gradient-bg.gif | Bin .../images/default/grid/arrow-left-white.gif | Bin .../images/default/grid/arrow-right-white.gif | Bin .../images/default/grid/col-move-bottom.gif | Bin .../images/default/grid/col-move-top.gif | Bin .../resources/images/default/grid/columns.gif | Bin .../ext/resources/images/default/grid/dirty.gif | Bin .../ext/resources/images/default/grid/done.gif | Bin .../resources/images/default/grid/drop-no.gif | Bin .../resources/images/default/grid/drop-yes.gif | Bin .../resources/images/default/grid/footer-bg.gif | Bin .../images/default/grid/grid-blue-hd.gif | Bin .../images/default/grid/grid-blue-split.gif | Bin .../resources/images/default/grid/grid-hrow.gif | Bin .../images/default/grid/grid-loading.gif | Bin .../images/default/grid/grid-split.gif | Bin .../images/default/grid/grid-vista-hd.gif | Bin .../images/default/grid/grid3-hd-btn.gif | Bin .../images/default/grid/grid3-hrow-over.gif | Bin .../images/default/grid/grid3-hrow.gif | Bin .../images/default/grid/grid3-rowheader.gif | Bin .../default/grid/grid3-special-col-bg.gif | Bin .../default/grid/grid3-special-col-sel-bg.gif | Bin .../resources/images/default/grid/group-by.gif | Bin .../images/default/grid/group-collapse.gif | Bin .../images/default/grid/group-expand-sprite.gif | Bin .../images/default/grid/group-expand.gif | Bin .../resources/images/default/grid/hd-pop.gif | Bin .../resources/images/default/grid/hmenu-asc.gif | Bin .../images/default/grid/hmenu-desc.gif | Bin .../images/default/grid/hmenu-lock.gif | Bin .../images/default/grid/hmenu-lock.png | Bin .../images/default/grid/hmenu-unlock.gif | Bin .../images/default/grid/hmenu-unlock.png | Bin .../images/default/grid/invalid_line.gif | Bin .../resources/images/default/grid/loading.gif | Bin .../resources/images/default/grid/mso-hd.gif | Bin .../resources/images/default/grid/nowait.gif | Bin .../images/default/grid/page-first-disabled.gif | Bin .../images/default/grid/page-first.gif | Bin .../images/default/grid/page-last-disabled.gif | Bin .../resources/images/default/grid/page-last.gif | Bin .../images/default/grid/page-next-disabled.gif | Bin .../resources/images/default/grid/page-next.gif | Bin .../images/default/grid/page-prev-disabled.gif | Bin .../resources/images/default/grid/page-prev.gif | Bin .../images/default/grid/pick-button.gif | Bin .../images/default/grid/refresh-disabled.gif | Bin .../resources/images/default/grid/refresh.gif | Bin .../images/default/grid/row-check-sprite.gif | Bin .../images/default/grid/row-expand-sprite.gif | Bin .../resources/images/default/grid/row-over.gif | Bin .../resources/images/default/grid/row-sel.gif | Bin .../resources/images/default/grid/sort-hd.gif | Bin .../resources/images/default/grid/sort_asc.gif | Bin .../resources/images/default/grid/sort_desc.gif | Bin .../ext/resources/images/default/grid/wait.gif | Bin .../images/default/layout/collapse.gif | Bin .../resources/images/default/layout/expand.gif | Bin .../images/default/layout/gradient-bg.gif | Bin .../images/default/layout/mini-bottom.gif | Bin .../images/default/layout/mini-left.gif | Bin .../images/default/layout/mini-right.gif | Bin .../images/default/layout/mini-top.gif | Bin .../images/default/layout/ns-collapse.gif | Bin .../images/default/layout/ns-expand.gif | Bin .../images/default/layout/panel-close.gif | Bin .../images/default/layout/panel-title-bg.gif | Bin .../default/layout/panel-title-light-bg.gif | Bin .../resources/images/default/layout/stick.gif | Bin .../resources/images/default/layout/stuck.gif | Bin .../images/default/layout/tab-close-on.gif | Bin .../images/default/layout/tab-close.gif | Bin .../resources/images/default/menu/checked.gif | Bin .../images/default/menu/group-checked.gif | Bin .../resources/images/default/menu/item-over.gif | Bin .../images/default/menu/menu-parent.gif | Bin .../ext/resources/images/default/menu/menu.gif | Bin .../resources/images/default/menu/unchecked.gif | Bin .../images/default/panel/corners-sprite.gif | Bin .../images/default/panel/left-right.gif | Bin .../resources/images/default/panel/light-hd.gif | Bin .../images/default/panel/tool-sprite-tpl.gif | Bin .../images/default/panel/tool-sprites.gif | Bin .../default/panel/tools-sprites-trans.gif | Bin .../images/default/panel/top-bottom.gif | Bin .../images/default/panel/top-bottom.png | Bin .../default/panel/white-corners-sprite.gif | Bin .../images/default/panel/white-left-right.gif | Bin .../images/default/panel/white-top-bottom.gif | Bin .../images/default/progress/progress-bg.gif | Bin .../js/ext/resources/images/default/qtip/bg.gif | Bin .../ext/resources/images/default/qtip/close.gif | Bin .../images/default/qtip/tip-anchor-sprite.gif | Bin .../images/default/qtip/tip-sprite.gif | Bin .../js/ext/resources/images/default/s.gif | Bin .../ext/resources/images/default/shadow-c.png | Bin .../ext/resources/images/default/shadow-lr.png | Bin .../js/ext/resources/images/default/shadow.png | Bin .../images/default/shared/blue-loading.gif | Bin .../images/default/shared/calendar.gif | Bin .../images/default/shared/glass-bg.gif | Bin .../images/default/shared/hd-sprite.gif | Bin .../images/default/shared/large-loading.gif | Bin .../images/default/shared/left-btn.gif | Bin .../images/default/shared/loading-balls.gif | Bin .../images/default/shared/right-btn.gif | Bin .../resources/images/default/shared/warning.gif | Bin .../images/default/sizer/e-handle-dark.gif | Bin .../resources/images/default/sizer/e-handle.gif | Bin .../images/default/sizer/ne-handle-dark.gif | Bin .../images/default/sizer/ne-handle.gif | Bin .../images/default/sizer/nw-handle-dark.gif | Bin .../images/default/sizer/nw-handle.gif | Bin .../images/default/sizer/s-handle-dark.gif | Bin .../resources/images/default/sizer/s-handle.gif | Bin .../images/default/sizer/se-handle-dark.gif | Bin .../images/default/sizer/se-handle.gif | Bin .../resources/images/default/sizer/square.gif | Bin .../images/default/sizer/sw-handle-dark.gif | Bin .../images/default/sizer/sw-handle.gif | Bin .../images/default/slider/slider-bg.png | Bin .../images/default/slider/slider-thumb.png | Bin .../images/default/slider/slider-v-bg.png | Bin .../images/default/slider/slider-v-thumb.png | Bin .../images/default/tabs/scroll-left.gif | Bin .../images/default/tabs/scroll-right.gif | Bin .../images/default/tabs/scroller-bg.gif | Bin .../default/tabs/tab-btm-inactive-left-bg.gif | Bin .../default/tabs/tab-btm-inactive-right-bg.gif | Bin .../images/default/tabs/tab-btm-left-bg.gif | Bin .../default/tabs/tab-btm-over-left-bg.gif | Bin .../default/tabs/tab-btm-over-right-bg.gif | Bin .../images/default/tabs/tab-btm-right-bg.gif | Bin .../resources/images/default/tabs/tab-close.gif | Bin .../images/default/tabs/tab-strip-bg.gif | Bin .../images/default/tabs/tab-strip-bg.png | Bin .../images/default/tabs/tab-strip-btm-bg.gif | Bin .../images/default/tabs/tabs-sprite.gif | Bin .../ext/resources/images/default/toolbar/bg.gif | Bin .../images/default/toolbar/btn-arrow-light.gif | Bin .../images/default/toolbar/btn-arrow.gif | Bin .../images/default/toolbar/btn-over-bg.gif | Bin .../images/default/toolbar/gray-bg.gif | Bin .../resources/images/default/toolbar/more.gif | Bin .../resources/images/default/toolbar/tb-bg.gif | Bin .../images/default/toolbar/tb-btn-sprite.gif | Bin .../images/default/toolbar/tb-xl-btn-sprite.gif | Bin .../images/default/toolbar/tb-xl-sep.gif | Bin .../resources/images/default/tree/arrows.gif | Bin .../resources/images/default/tree/drop-add.gif | Bin .../images/default/tree/drop-between.gif | Bin .../resources/images/default/tree/drop-no.gif | Bin .../resources/images/default/tree/drop-over.gif | Bin .../images/default/tree/drop-under.gif | Bin .../resources/images/default/tree/drop-yes.gif | Bin .../images/default/tree/elbow-end-minus-nl.gif | Bin .../images/default/tree/elbow-end-minus.gif | Bin .../images/default/tree/elbow-end-plus-nl.gif | Bin .../images/default/tree/elbow-end-plus.gif | Bin .../resources/images/default/tree/elbow-end.gif | Bin .../images/default/tree/elbow-line.gif | Bin .../images/default/tree/elbow-minus-nl.gif | Bin .../images/default/tree/elbow-minus.gif | Bin .../images/default/tree/elbow-plus-nl.gif | Bin .../images/default/tree/elbow-plus.gif | Bin .../ext/resources/images/default/tree/elbow.gif | Bin .../images/default/tree/folder-open.gif | Bin .../resources/images/default/tree/folder.gif | Bin .../ext/resources/images/default/tree/leaf.gif | Bin .../resources/images/default/tree/loading.gif | Bin .../js/ext/resources/images/default/tree/s.gif | Bin .../images/default/window/icon-error.gif | Bin .../images/default/window/icon-info.gif | Bin .../images/default/window/icon-question.gif | Bin .../images/default/window/icon-warning.gif | Bin .../images/default/window/left-corners.png | Bin .../images/default/window/left-corners.psd | Bin .../images/default/window/left-right.png | Bin .../images/default/window/left-right.psd | Bin .../images/default/window/right-corners.png | Bin .../images/default/window/right-corners.psd | Bin .../images/default/window/top-bottom.png | Bin .../images/default/window/top-bottom.psd | Bin .../static}/js/ext/ux/DataViewTransition.js | 0 351 files changed, 8 insertions(+), 15 deletions(-) rename webapp/{content => graphite/static}/css/darkX.css (100%) rename webapp/{content => graphite/static}/css/darkX/button-close-focused.png (100%) rename webapp/{content => graphite/static}/css/darkX/button-maximize-focused.png (100%) rename webapp/{content => graphite/static}/css/darkX/button-minimize-focused.png (100%) rename webapp/{content => graphite/static}/css/darkX/frame-bottom-left-focused.png (100%) rename webapp/{content => graphite/static}/css/darkX/frame-bottom-mid-focused.png (100%) rename webapp/{content => graphite/static}/css/darkX/frame-bottom-right-focused.png (100%) rename webapp/{content => graphite/static}/css/darkX/frame-left-focused.png (100%) rename webapp/{content => graphite/static}/css/darkX/frame-right-focused.png (100%) rename webapp/{content => graphite/static}/css/darkX/titlebar-left-focused.png (100%) rename webapp/{content => graphite/static}/css/darkX/titlebar-mid-focused.png (100%) rename webapp/{content => graphite/static}/css/darkX/titlebar-right-focused.png (100%) rename webapp/{content => graphite/static}/css/dashboard-default.css (100%) rename webapp/{content => graphite/static}/css/dashboard-white.css (100%) rename webapp/{content => graphite/static}/css/dashboard.css (100%) rename webapp/{content => graphite/static}/css/default.css (100%) rename webapp/{content => graphite/static}/css/default/bottom_left.gif (100%) rename webapp/{content => graphite/static}/css/default/bottom_mid.gif (100%) rename webapp/{content => graphite/static}/css/default/bottom_right.gif (100%) rename webapp/{content => graphite/static}/css/default/bottom_right_resize.gif (100%) rename webapp/{content => graphite/static}/css/default/center_left.gif (100%) rename webapp/{content => graphite/static}/css/default/center_right.gif (100%) rename webapp/{content => graphite/static}/css/default/clear.gif (100%) rename webapp/{content => graphite/static}/css/default/close.gif (100%) rename webapp/{content => graphite/static}/css/default/inspect.gif (100%) rename webapp/{content => graphite/static}/css/default/maximize.gif (100%) rename webapp/{content => graphite/static}/css/default/minimize.gif (100%) rename webapp/{content => graphite/static}/css/default/overlay.png (100%) rename webapp/{content => graphite/static}/css/default/resize.gif (100%) rename webapp/{content => graphite/static}/css/default/sizer.gif (100%) rename webapp/{content => graphite/static}/css/default/top_left.gif (100%) rename webapp/{content => graphite/static}/css/default/top_mid.gif (100%) rename webapp/{content => graphite/static}/css/default/top_right.gif (100%) rename webapp/{content => graphite/static}/css/table.css (100%) rename webapp/{content => graphite/static}/html/completerHelp.html (100%) rename webapp/{content => graphite/static}/html/searchHelp.html (100%) rename webapp/{content => graphite/static}/img/blank.gif (100%) rename webapp/{content => graphite/static}/img/calendar.png (100%) rename webapp/{content => graphite/static}/img/carbon-fiber.png (100%) rename webapp/{content => graphite/static}/img/clock.png (100%) rename webapp/{content => graphite/static}/img/clock_16.png (100%) rename webapp/{content => graphite/static}/img/favicon.ico (100%) rename webapp/{content => graphite/static}/img/graphite-logo.png (100%) rename webapp/{content => graphite/static}/img/graphite.png (100%) rename webapp/{content => graphite/static}/img/graphite_short.png (100%) rename webapp/{content => graphite/static}/img/leaf.gif (100%) rename webapp/{content => graphite/static}/img/mini-bottom2.gif (100%) rename webapp/{content => graphite/static}/img/mini-top2.gif (100%) rename webapp/{content => graphite/static}/img/move_down.png (100%) rename webapp/{content => graphite/static}/img/move_up.png (100%) rename webapp/{content => graphite/static}/img/overview.png (100%) rename webapp/{content => graphite/static}/img/refresh.png (100%) rename webapp/{content => graphite/static}/img/save.png (100%) rename webapp/{content => graphite/static}/img/share.png (100%) rename webapp/{content => graphite/static}/img/trash.png (100%) rename webapp/{content => graphite/static}/img/upload.png (100%) rename webapp/{content => graphite/static}/js/ace/ace.js (100%) rename webapp/{content => graphite/static}/js/ace/keybinding-vim.js (100%) rename webapp/{content => graphite/static}/js/ace/mode-c_cpp.js (100%) rename webapp/{content => graphite/static}/js/ace/mode-clojure.js (100%) rename webapp/{content => graphite/static}/js/ace/mode-coffee.js (100%) rename webapp/{content => graphite/static}/js/ace/mode-csharp.js (100%) rename webapp/{content => graphite/static}/js/ace/mode-css.js (100%) rename webapp/{content => graphite/static}/js/ace/mode-groovy.js (100%) rename webapp/{content => graphite/static}/js/ace/mode-html.js (100%) rename webapp/{content => graphite/static}/js/ace/mode-java.js (100%) rename webapp/{content => graphite/static}/js/ace/mode-javascript.js (100%) rename webapp/{content => graphite/static}/js/ace/mode-json.js (100%) rename webapp/{content => graphite/static}/js/ace/theme-textmate.js (100%) rename webapp/{content => graphite/static}/js/ace/worker-javascript.js (100%) rename webapp/{content => graphite/static}/js/browser.js (100%) rename webapp/{content => graphite/static}/js/completer.js (100%) rename webapp/{content => graphite/static}/js/composer.js (100%) rename webapp/{content => graphite/static}/js/composer_widgets.js (100%) rename webapp/{content => graphite/static}/js/dashboard.js (100%) rename webapp/{content => graphite/static}/js/ext/adapter/ext/ext-base-debug.js (100%) rename webapp/{content => graphite/static}/js/ext/adapter/ext/ext-base.js (100%) rename webapp/{content => graphite/static}/js/ext/ext-all-debug.js (100%) rename webapp/{content => graphite/static}/js/ext/ext-all.js (100%) rename webapp/{content => graphite/static}/js/ext/resources/css/ext-all.css (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/SILK.txt (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/accept.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/add.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/add.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/application_go.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/application_view_list.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/book.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/cog.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/cog_edit.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/connect.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/connect.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/control_rewind.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/cross.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/delete.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/error.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/feed_add.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/feed_delete.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/feed_error.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/folder_go.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/folder_wrench.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/grid.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/image_add.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/information.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/plugin.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/plugin_add.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/rss_go.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/table_refresh.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_add.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_add.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_comment.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_delete.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_delete.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_edit.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_female.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_female.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_gray.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_green.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_green.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_orange.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_red.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_suit.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/icons/fam/user_suit.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/box/corners-blue.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/box/corners.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/box/l-blue.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/box/l.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/box/r-blue.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/box/r.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/box/tb-blue.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/box/tb.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/arrow.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/btn.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/group-cs.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/group-lr.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/group-tb.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/s-arrow-b-noline.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/s-arrow-b.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/s-arrow-bo.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/s-arrow-noline.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/s-arrow-o.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/button/s-arrow.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/dd/drop-add.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/dd/drop-no.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/dd/drop-yes.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/editor/tb-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/checkbox.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/clear-trigger.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/clear-trigger.psd (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/date-trigger.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/date-trigger.psd (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/error-tip-corners.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/exclamation.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/radio.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/search-trigger.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/search-trigger.psd (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/text-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/trigger-square.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/trigger-square.psd (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/trigger-tpl.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/trigger.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/form/trigger.psd (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/gradient-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/arrow-left-white.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/arrow-right-white.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/col-move-bottom.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/col-move-top.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/columns.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/dirty.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/done.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/drop-no.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/drop-yes.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/footer-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid-blue-hd.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid-blue-split.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid-hrow.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid-loading.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid-split.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid-vista-hd.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid3-hd-btn.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid3-hrow-over.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid3-hrow.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid3-rowheader.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid3-special-col-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/group-by.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/group-collapse.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/group-expand-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/group-expand.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/hd-pop.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/hmenu-asc.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/hmenu-desc.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/hmenu-lock.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/hmenu-lock.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/hmenu-unlock.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/hmenu-unlock.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/invalid_line.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/loading.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/mso-hd.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/nowait.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/page-first-disabled.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/page-first.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/page-last-disabled.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/page-last.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/page-next-disabled.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/page-next.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/page-prev-disabled.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/page-prev.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/pick-button.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/refresh-disabled.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/refresh.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/row-check-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/row-expand-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/row-over.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/row-sel.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/sort-hd.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/sort_asc.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/sort_desc.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/grid/wait.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/collapse.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/expand.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/gradient-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/mini-bottom.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/mini-left.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/mini-right.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/mini-top.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/ns-collapse.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/ns-expand.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/panel-close.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/panel-title-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/panel-title-light-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/stick.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/stuck.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/tab-close-on.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/layout/tab-close.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/menu/checked.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/menu/group-checked.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/menu/item-over.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/menu/menu-parent.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/menu/menu.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/menu/unchecked.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/corners-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/left-right.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/light-hd.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/tool-sprite-tpl.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/tool-sprites.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/tools-sprites-trans.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/top-bottom.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/top-bottom.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/white-corners-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/white-left-right.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/panel/white-top-bottom.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/progress/progress-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/qtip/bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/qtip/close.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/qtip/tip-anchor-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/qtip/tip-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/s.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shadow-c.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shadow-lr.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shadow.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shared/blue-loading.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shared/calendar.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shared/glass-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shared/hd-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shared/large-loading.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shared/left-btn.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shared/loading-balls.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shared/right-btn.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/shared/warning.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/e-handle-dark.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/e-handle.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/ne-handle-dark.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/ne-handle.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/nw-handle-dark.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/nw-handle.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/s-handle-dark.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/s-handle.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/se-handle-dark.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/se-handle.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/square.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/sw-handle-dark.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/sizer/sw-handle.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/slider/slider-bg.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/slider/slider-thumb.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/slider/slider-v-bg.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/slider/slider-v-thumb.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/scroll-left.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/scroll-right.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/scroller-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tab-btm-left-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tab-btm-over-left-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tab-btm-over-right-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tab-btm-right-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tab-close.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tab-strip-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tab-strip-bg.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tab-strip-btm-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tabs/tabs-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/toolbar/bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/toolbar/btn-arrow-light.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/toolbar/btn-arrow.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/toolbar/btn-over-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/toolbar/gray-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/toolbar/more.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/toolbar/tb-bg.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/toolbar/tb-btn-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/toolbar/tb-xl-btn-sprite.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/toolbar/tb-xl-sep.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/arrows.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/drop-add.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/drop-between.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/drop-no.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/drop-over.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/drop-under.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/drop-yes.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow-end-minus-nl.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow-end-minus.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow-end-plus-nl.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow-end-plus.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow-end.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow-line.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow-minus-nl.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow-minus.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow-plus-nl.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow-plus.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/elbow.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/folder-open.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/folder.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/leaf.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/loading.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/tree/s.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/icon-error.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/icon-info.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/icon-question.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/icon-warning.gif (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/left-corners.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/left-corners.psd (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/left-right.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/left-right.psd (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/right-corners.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/right-corners.psd (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/top-bottom.png (100%) rename webapp/{content => graphite/static}/js/ext/resources/images/default/window/top-bottom.psd (100%) rename webapp/{content => graphite/static}/js/ext/ux/DataViewTransition.js (100%) diff --git a/MANIFEST.in b/MANIFEST.in index 18ccc8e90..fb4d63f94 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -7,6 +7,6 @@ include conf/*.example include webapp/graphite/local_settings.py.example recursive-include distro/ * recursive-include webapp/graphite/ *.html -recursive-include webapp/content/ * +recursive-include webapp/graphite/static/ * exclude webapp/graphite/local_settings.py exclude conf/*.conf diff --git a/setup.py b/setup.py index a7ad6508e..b413357ab 100644 --- a/setup.py +++ b/setup.py @@ -10,14 +10,7 @@ for subdir in ('whisper/dummy.txt', 'ceres/dummy.txt', 'rrd/dummy.txt', 'log/dummy.txt', 'log/webapp/dummy.txt'): - storage_dirs.append( ('storage/%s' % subdir, []) ) - -webapp_content = defaultdict(list) - -for root, dirs, files in os.walk('webapp/content'): - for filename in files: - filepath = os.path.join(root, filename) - webapp_content[root].append(filepath) + storage_dirs.append(('storage/%s' % subdir, [])) conf_files = [('conf', glob('conf/*.example'))] examples = [('examples', glob('examples/example-*'))] @@ -63,11 +56,12 @@ def read(fname): 'graphite.whitelist', 'graphite.worker_pool', ], - package_data={'graphite': ['templates/*', 'local_settings.py.example']}, scripts=glob('bin/*'), - data_files=list(webapp_content.items()) + storage_dirs + conf_files + examples, + include_package_data=True, + data_files=storage_dirs + conf_files + examples, install_requires=['Django>=1.8,<2.2', 'django-tagging==0.4.3', 'pytz', - 'pyparsing', 'cairocffi', 'urllib3', 'scandir', 'six'], + 'pyparsing', 'cairocffi', 'urllib3', 'scandir', 'six', + 'whitenoise'], classifiers=[ 'Intended Audience :: Developers', 'Natural Language :: English', diff --git a/webapp/graphite/settings.py b/webapp/graphite/settings.py index 94ab903aa..b8c5c4db4 100644 --- a/webapp/graphite/settings.py +++ b/webapp/graphite/settings.py @@ -36,7 +36,6 @@ # Filesystem layout WEB_DIR = dirname(abspath(__file__)) -WEBAPP_DIR = dirname(WEB_DIR) GRAPHITE_ROOT = sys.prefix # Initialize additional path variables # Defaults for these are set after local_settings is imported @@ -219,7 +218,7 @@ STATICFILES_DIRS = ( - join(WEBAPP_DIR, 'content'), + join(WEB_DIR, 'static'), ) # Handle renamed timeout settings @@ -229,7 +228,7 @@ ## Set config dependent on flags set in local_settings # Path configuration if not STATIC_ROOT: - STATIC_ROOT = join(GRAPHITE_ROOT, 'static') + STATIC_ROOT = join(WEB_DIR, 'static') if not CONF_DIR: CONF_DIR = os.environ.get('GRAPHITE_CONF_DIR', join(GRAPHITE_ROOT, 'conf')) diff --git a/webapp/content/css/darkX.css b/webapp/graphite/static/css/darkX.css similarity index 100% rename from webapp/content/css/darkX.css rename to webapp/graphite/static/css/darkX.css diff --git a/webapp/content/css/darkX/button-close-focused.png b/webapp/graphite/static/css/darkX/button-close-focused.png similarity index 100% rename from webapp/content/css/darkX/button-close-focused.png rename to webapp/graphite/static/css/darkX/button-close-focused.png diff --git a/webapp/content/css/darkX/button-maximize-focused.png b/webapp/graphite/static/css/darkX/button-maximize-focused.png similarity index 100% rename from webapp/content/css/darkX/button-maximize-focused.png rename to webapp/graphite/static/css/darkX/button-maximize-focused.png diff --git a/webapp/content/css/darkX/button-minimize-focused.png b/webapp/graphite/static/css/darkX/button-minimize-focused.png similarity index 100% rename from webapp/content/css/darkX/button-minimize-focused.png rename to webapp/graphite/static/css/darkX/button-minimize-focused.png diff --git a/webapp/content/css/darkX/frame-bottom-left-focused.png b/webapp/graphite/static/css/darkX/frame-bottom-left-focused.png similarity index 100% rename from webapp/content/css/darkX/frame-bottom-left-focused.png rename to webapp/graphite/static/css/darkX/frame-bottom-left-focused.png diff --git a/webapp/content/css/darkX/frame-bottom-mid-focused.png b/webapp/graphite/static/css/darkX/frame-bottom-mid-focused.png similarity index 100% rename from webapp/content/css/darkX/frame-bottom-mid-focused.png rename to webapp/graphite/static/css/darkX/frame-bottom-mid-focused.png diff --git a/webapp/content/css/darkX/frame-bottom-right-focused.png b/webapp/graphite/static/css/darkX/frame-bottom-right-focused.png similarity index 100% rename from webapp/content/css/darkX/frame-bottom-right-focused.png rename to webapp/graphite/static/css/darkX/frame-bottom-right-focused.png diff --git a/webapp/content/css/darkX/frame-left-focused.png b/webapp/graphite/static/css/darkX/frame-left-focused.png similarity index 100% rename from webapp/content/css/darkX/frame-left-focused.png rename to webapp/graphite/static/css/darkX/frame-left-focused.png diff --git a/webapp/content/css/darkX/frame-right-focused.png b/webapp/graphite/static/css/darkX/frame-right-focused.png similarity index 100% rename from webapp/content/css/darkX/frame-right-focused.png rename to webapp/graphite/static/css/darkX/frame-right-focused.png diff --git a/webapp/content/css/darkX/titlebar-left-focused.png b/webapp/graphite/static/css/darkX/titlebar-left-focused.png similarity index 100% rename from webapp/content/css/darkX/titlebar-left-focused.png rename to webapp/graphite/static/css/darkX/titlebar-left-focused.png diff --git a/webapp/content/css/darkX/titlebar-mid-focused.png b/webapp/graphite/static/css/darkX/titlebar-mid-focused.png similarity index 100% rename from webapp/content/css/darkX/titlebar-mid-focused.png rename to webapp/graphite/static/css/darkX/titlebar-mid-focused.png diff --git a/webapp/content/css/darkX/titlebar-right-focused.png b/webapp/graphite/static/css/darkX/titlebar-right-focused.png similarity index 100% rename from webapp/content/css/darkX/titlebar-right-focused.png rename to webapp/graphite/static/css/darkX/titlebar-right-focused.png diff --git a/webapp/content/css/dashboard-default.css b/webapp/graphite/static/css/dashboard-default.css similarity index 100% rename from webapp/content/css/dashboard-default.css rename to webapp/graphite/static/css/dashboard-default.css diff --git a/webapp/content/css/dashboard-white.css b/webapp/graphite/static/css/dashboard-white.css similarity index 100% rename from webapp/content/css/dashboard-white.css rename to webapp/graphite/static/css/dashboard-white.css diff --git a/webapp/content/css/dashboard.css b/webapp/graphite/static/css/dashboard.css similarity index 100% rename from webapp/content/css/dashboard.css rename to webapp/graphite/static/css/dashboard.css diff --git a/webapp/content/css/default.css b/webapp/graphite/static/css/default.css similarity index 100% rename from webapp/content/css/default.css rename to webapp/graphite/static/css/default.css diff --git a/webapp/content/css/default/bottom_left.gif b/webapp/graphite/static/css/default/bottom_left.gif similarity index 100% rename from webapp/content/css/default/bottom_left.gif rename to webapp/graphite/static/css/default/bottom_left.gif diff --git a/webapp/content/css/default/bottom_mid.gif b/webapp/graphite/static/css/default/bottom_mid.gif similarity index 100% rename from webapp/content/css/default/bottom_mid.gif rename to webapp/graphite/static/css/default/bottom_mid.gif diff --git a/webapp/content/css/default/bottom_right.gif b/webapp/graphite/static/css/default/bottom_right.gif similarity index 100% rename from webapp/content/css/default/bottom_right.gif rename to webapp/graphite/static/css/default/bottom_right.gif diff --git a/webapp/content/css/default/bottom_right_resize.gif b/webapp/graphite/static/css/default/bottom_right_resize.gif similarity index 100% rename from webapp/content/css/default/bottom_right_resize.gif rename to webapp/graphite/static/css/default/bottom_right_resize.gif diff --git a/webapp/content/css/default/center_left.gif b/webapp/graphite/static/css/default/center_left.gif similarity index 100% rename from webapp/content/css/default/center_left.gif rename to webapp/graphite/static/css/default/center_left.gif diff --git a/webapp/content/css/default/center_right.gif b/webapp/graphite/static/css/default/center_right.gif similarity index 100% rename from webapp/content/css/default/center_right.gif rename to webapp/graphite/static/css/default/center_right.gif diff --git a/webapp/content/css/default/clear.gif b/webapp/graphite/static/css/default/clear.gif similarity index 100% rename from webapp/content/css/default/clear.gif rename to webapp/graphite/static/css/default/clear.gif diff --git a/webapp/content/css/default/close.gif b/webapp/graphite/static/css/default/close.gif similarity index 100% rename from webapp/content/css/default/close.gif rename to webapp/graphite/static/css/default/close.gif diff --git a/webapp/content/css/default/inspect.gif b/webapp/graphite/static/css/default/inspect.gif similarity index 100% rename from webapp/content/css/default/inspect.gif rename to webapp/graphite/static/css/default/inspect.gif diff --git a/webapp/content/css/default/maximize.gif b/webapp/graphite/static/css/default/maximize.gif similarity index 100% rename from webapp/content/css/default/maximize.gif rename to webapp/graphite/static/css/default/maximize.gif diff --git a/webapp/content/css/default/minimize.gif b/webapp/graphite/static/css/default/minimize.gif similarity index 100% rename from webapp/content/css/default/minimize.gif rename to webapp/graphite/static/css/default/minimize.gif diff --git a/webapp/content/css/default/overlay.png b/webapp/graphite/static/css/default/overlay.png similarity index 100% rename from webapp/content/css/default/overlay.png rename to webapp/graphite/static/css/default/overlay.png diff --git a/webapp/content/css/default/resize.gif b/webapp/graphite/static/css/default/resize.gif similarity index 100% rename from webapp/content/css/default/resize.gif rename to webapp/graphite/static/css/default/resize.gif diff --git a/webapp/content/css/default/sizer.gif b/webapp/graphite/static/css/default/sizer.gif similarity index 100% rename from webapp/content/css/default/sizer.gif rename to webapp/graphite/static/css/default/sizer.gif diff --git a/webapp/content/css/default/top_left.gif b/webapp/graphite/static/css/default/top_left.gif similarity index 100% rename from webapp/content/css/default/top_left.gif rename to webapp/graphite/static/css/default/top_left.gif diff --git a/webapp/content/css/default/top_mid.gif b/webapp/graphite/static/css/default/top_mid.gif similarity index 100% rename from webapp/content/css/default/top_mid.gif rename to webapp/graphite/static/css/default/top_mid.gif diff --git a/webapp/content/css/default/top_right.gif b/webapp/graphite/static/css/default/top_right.gif similarity index 100% rename from webapp/content/css/default/top_right.gif rename to webapp/graphite/static/css/default/top_right.gif diff --git a/webapp/content/css/table.css b/webapp/graphite/static/css/table.css similarity index 100% rename from webapp/content/css/table.css rename to webapp/graphite/static/css/table.css diff --git a/webapp/content/html/completerHelp.html b/webapp/graphite/static/html/completerHelp.html similarity index 100% rename from webapp/content/html/completerHelp.html rename to webapp/graphite/static/html/completerHelp.html diff --git a/webapp/content/html/searchHelp.html b/webapp/graphite/static/html/searchHelp.html similarity index 100% rename from webapp/content/html/searchHelp.html rename to webapp/graphite/static/html/searchHelp.html diff --git a/webapp/content/img/blank.gif b/webapp/graphite/static/img/blank.gif similarity index 100% rename from webapp/content/img/blank.gif rename to webapp/graphite/static/img/blank.gif diff --git a/webapp/content/img/calendar.png b/webapp/graphite/static/img/calendar.png similarity index 100% rename from webapp/content/img/calendar.png rename to webapp/graphite/static/img/calendar.png diff --git a/webapp/content/img/carbon-fiber.png b/webapp/graphite/static/img/carbon-fiber.png similarity index 100% rename from webapp/content/img/carbon-fiber.png rename to webapp/graphite/static/img/carbon-fiber.png diff --git a/webapp/content/img/clock.png b/webapp/graphite/static/img/clock.png similarity index 100% rename from webapp/content/img/clock.png rename to webapp/graphite/static/img/clock.png diff --git a/webapp/content/img/clock_16.png b/webapp/graphite/static/img/clock_16.png similarity index 100% rename from webapp/content/img/clock_16.png rename to webapp/graphite/static/img/clock_16.png diff --git a/webapp/content/img/favicon.ico b/webapp/graphite/static/img/favicon.ico similarity index 100% rename from webapp/content/img/favicon.ico rename to webapp/graphite/static/img/favicon.ico diff --git a/webapp/content/img/graphite-logo.png b/webapp/graphite/static/img/graphite-logo.png similarity index 100% rename from webapp/content/img/graphite-logo.png rename to webapp/graphite/static/img/graphite-logo.png diff --git a/webapp/content/img/graphite.png b/webapp/graphite/static/img/graphite.png similarity index 100% rename from webapp/content/img/graphite.png rename to webapp/graphite/static/img/graphite.png diff --git a/webapp/content/img/graphite_short.png b/webapp/graphite/static/img/graphite_short.png similarity index 100% rename from webapp/content/img/graphite_short.png rename to webapp/graphite/static/img/graphite_short.png diff --git a/webapp/content/img/leaf.gif b/webapp/graphite/static/img/leaf.gif similarity index 100% rename from webapp/content/img/leaf.gif rename to webapp/graphite/static/img/leaf.gif diff --git a/webapp/content/img/mini-bottom2.gif b/webapp/graphite/static/img/mini-bottom2.gif similarity index 100% rename from webapp/content/img/mini-bottom2.gif rename to webapp/graphite/static/img/mini-bottom2.gif diff --git a/webapp/content/img/mini-top2.gif b/webapp/graphite/static/img/mini-top2.gif similarity index 100% rename from webapp/content/img/mini-top2.gif rename to webapp/graphite/static/img/mini-top2.gif diff --git a/webapp/content/img/move_down.png b/webapp/graphite/static/img/move_down.png similarity index 100% rename from webapp/content/img/move_down.png rename to webapp/graphite/static/img/move_down.png diff --git a/webapp/content/img/move_up.png b/webapp/graphite/static/img/move_up.png similarity index 100% rename from webapp/content/img/move_up.png rename to webapp/graphite/static/img/move_up.png diff --git a/webapp/content/img/overview.png b/webapp/graphite/static/img/overview.png similarity index 100% rename from webapp/content/img/overview.png rename to webapp/graphite/static/img/overview.png diff --git a/webapp/content/img/refresh.png b/webapp/graphite/static/img/refresh.png similarity index 100% rename from webapp/content/img/refresh.png rename to webapp/graphite/static/img/refresh.png diff --git a/webapp/content/img/save.png b/webapp/graphite/static/img/save.png similarity index 100% rename from webapp/content/img/save.png rename to webapp/graphite/static/img/save.png diff --git a/webapp/content/img/share.png b/webapp/graphite/static/img/share.png similarity index 100% rename from webapp/content/img/share.png rename to webapp/graphite/static/img/share.png diff --git a/webapp/content/img/trash.png b/webapp/graphite/static/img/trash.png similarity index 100% rename from webapp/content/img/trash.png rename to webapp/graphite/static/img/trash.png diff --git a/webapp/content/img/upload.png b/webapp/graphite/static/img/upload.png similarity index 100% rename from webapp/content/img/upload.png rename to webapp/graphite/static/img/upload.png diff --git a/webapp/content/js/ace/ace.js b/webapp/graphite/static/js/ace/ace.js similarity index 100% rename from webapp/content/js/ace/ace.js rename to webapp/graphite/static/js/ace/ace.js diff --git a/webapp/content/js/ace/keybinding-vim.js b/webapp/graphite/static/js/ace/keybinding-vim.js similarity index 100% rename from webapp/content/js/ace/keybinding-vim.js rename to webapp/graphite/static/js/ace/keybinding-vim.js diff --git a/webapp/content/js/ace/mode-c_cpp.js b/webapp/graphite/static/js/ace/mode-c_cpp.js similarity index 100% rename from webapp/content/js/ace/mode-c_cpp.js rename to webapp/graphite/static/js/ace/mode-c_cpp.js diff --git a/webapp/content/js/ace/mode-clojure.js b/webapp/graphite/static/js/ace/mode-clojure.js similarity index 100% rename from webapp/content/js/ace/mode-clojure.js rename to webapp/graphite/static/js/ace/mode-clojure.js diff --git a/webapp/content/js/ace/mode-coffee.js b/webapp/graphite/static/js/ace/mode-coffee.js similarity index 100% rename from webapp/content/js/ace/mode-coffee.js rename to webapp/graphite/static/js/ace/mode-coffee.js diff --git a/webapp/content/js/ace/mode-csharp.js b/webapp/graphite/static/js/ace/mode-csharp.js similarity index 100% rename from webapp/content/js/ace/mode-csharp.js rename to webapp/graphite/static/js/ace/mode-csharp.js diff --git a/webapp/content/js/ace/mode-css.js b/webapp/graphite/static/js/ace/mode-css.js similarity index 100% rename from webapp/content/js/ace/mode-css.js rename to webapp/graphite/static/js/ace/mode-css.js diff --git a/webapp/content/js/ace/mode-groovy.js b/webapp/graphite/static/js/ace/mode-groovy.js similarity index 100% rename from webapp/content/js/ace/mode-groovy.js rename to webapp/graphite/static/js/ace/mode-groovy.js diff --git a/webapp/content/js/ace/mode-html.js b/webapp/graphite/static/js/ace/mode-html.js similarity index 100% rename from webapp/content/js/ace/mode-html.js rename to webapp/graphite/static/js/ace/mode-html.js diff --git a/webapp/content/js/ace/mode-java.js b/webapp/graphite/static/js/ace/mode-java.js similarity index 100% rename from webapp/content/js/ace/mode-java.js rename to webapp/graphite/static/js/ace/mode-java.js diff --git a/webapp/content/js/ace/mode-javascript.js b/webapp/graphite/static/js/ace/mode-javascript.js similarity index 100% rename from webapp/content/js/ace/mode-javascript.js rename to webapp/graphite/static/js/ace/mode-javascript.js diff --git a/webapp/content/js/ace/mode-json.js b/webapp/graphite/static/js/ace/mode-json.js similarity index 100% rename from webapp/content/js/ace/mode-json.js rename to webapp/graphite/static/js/ace/mode-json.js diff --git a/webapp/content/js/ace/theme-textmate.js b/webapp/graphite/static/js/ace/theme-textmate.js similarity index 100% rename from webapp/content/js/ace/theme-textmate.js rename to webapp/graphite/static/js/ace/theme-textmate.js diff --git a/webapp/content/js/ace/worker-javascript.js b/webapp/graphite/static/js/ace/worker-javascript.js similarity index 100% rename from webapp/content/js/ace/worker-javascript.js rename to webapp/graphite/static/js/ace/worker-javascript.js diff --git a/webapp/content/js/browser.js b/webapp/graphite/static/js/browser.js similarity index 100% rename from webapp/content/js/browser.js rename to webapp/graphite/static/js/browser.js diff --git a/webapp/content/js/completer.js b/webapp/graphite/static/js/completer.js similarity index 100% rename from webapp/content/js/completer.js rename to webapp/graphite/static/js/completer.js diff --git a/webapp/content/js/composer.js b/webapp/graphite/static/js/composer.js similarity index 100% rename from webapp/content/js/composer.js rename to webapp/graphite/static/js/composer.js diff --git a/webapp/content/js/composer_widgets.js b/webapp/graphite/static/js/composer_widgets.js similarity index 100% rename from webapp/content/js/composer_widgets.js rename to webapp/graphite/static/js/composer_widgets.js diff --git a/webapp/content/js/dashboard.js b/webapp/graphite/static/js/dashboard.js similarity index 100% rename from webapp/content/js/dashboard.js rename to webapp/graphite/static/js/dashboard.js diff --git a/webapp/content/js/ext/adapter/ext/ext-base-debug.js b/webapp/graphite/static/js/ext/adapter/ext/ext-base-debug.js similarity index 100% rename from webapp/content/js/ext/adapter/ext/ext-base-debug.js rename to webapp/graphite/static/js/ext/adapter/ext/ext-base-debug.js diff --git a/webapp/content/js/ext/adapter/ext/ext-base.js b/webapp/graphite/static/js/ext/adapter/ext/ext-base.js similarity index 100% rename from webapp/content/js/ext/adapter/ext/ext-base.js rename to webapp/graphite/static/js/ext/adapter/ext/ext-base.js diff --git a/webapp/content/js/ext/ext-all-debug.js b/webapp/graphite/static/js/ext/ext-all-debug.js similarity index 100% rename from webapp/content/js/ext/ext-all-debug.js rename to webapp/graphite/static/js/ext/ext-all-debug.js diff --git a/webapp/content/js/ext/ext-all.js b/webapp/graphite/static/js/ext/ext-all.js similarity index 100% rename from webapp/content/js/ext/ext-all.js rename to webapp/graphite/static/js/ext/ext-all.js diff --git a/webapp/content/js/ext/resources/css/ext-all.css b/webapp/graphite/static/js/ext/resources/css/ext-all.css similarity index 100% rename from webapp/content/js/ext/resources/css/ext-all.css rename to webapp/graphite/static/js/ext/resources/css/ext-all.css diff --git a/webapp/content/js/ext/resources/icons/fam/SILK.txt b/webapp/graphite/static/js/ext/resources/icons/fam/SILK.txt similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/SILK.txt rename to webapp/graphite/static/js/ext/resources/icons/fam/SILK.txt diff --git a/webapp/content/js/ext/resources/icons/fam/accept.png b/webapp/graphite/static/js/ext/resources/icons/fam/accept.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/accept.png rename to webapp/graphite/static/js/ext/resources/icons/fam/accept.png diff --git a/webapp/content/js/ext/resources/icons/fam/add.gif b/webapp/graphite/static/js/ext/resources/icons/fam/add.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/add.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/add.gif diff --git a/webapp/content/js/ext/resources/icons/fam/add.png b/webapp/graphite/static/js/ext/resources/icons/fam/add.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/add.png rename to webapp/graphite/static/js/ext/resources/icons/fam/add.png diff --git a/webapp/content/js/ext/resources/icons/fam/application_go.png b/webapp/graphite/static/js/ext/resources/icons/fam/application_go.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/application_go.png rename to webapp/graphite/static/js/ext/resources/icons/fam/application_go.png diff --git a/webapp/content/js/ext/resources/icons/fam/application_view_list.png b/webapp/graphite/static/js/ext/resources/icons/fam/application_view_list.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/application_view_list.png rename to webapp/graphite/static/js/ext/resources/icons/fam/application_view_list.png diff --git a/webapp/content/js/ext/resources/icons/fam/book.png b/webapp/graphite/static/js/ext/resources/icons/fam/book.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/book.png rename to webapp/graphite/static/js/ext/resources/icons/fam/book.png diff --git a/webapp/content/js/ext/resources/icons/fam/cog.png b/webapp/graphite/static/js/ext/resources/icons/fam/cog.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/cog.png rename to webapp/graphite/static/js/ext/resources/icons/fam/cog.png diff --git a/webapp/content/js/ext/resources/icons/fam/cog_edit.png b/webapp/graphite/static/js/ext/resources/icons/fam/cog_edit.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/cog_edit.png rename to webapp/graphite/static/js/ext/resources/icons/fam/cog_edit.png diff --git a/webapp/content/js/ext/resources/icons/fam/connect.gif b/webapp/graphite/static/js/ext/resources/icons/fam/connect.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/connect.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/connect.gif diff --git a/webapp/content/js/ext/resources/icons/fam/connect.png b/webapp/graphite/static/js/ext/resources/icons/fam/connect.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/connect.png rename to webapp/graphite/static/js/ext/resources/icons/fam/connect.png diff --git a/webapp/content/js/ext/resources/icons/fam/control_rewind.png b/webapp/graphite/static/js/ext/resources/icons/fam/control_rewind.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/control_rewind.png rename to webapp/graphite/static/js/ext/resources/icons/fam/control_rewind.png diff --git a/webapp/content/js/ext/resources/icons/fam/cross.gif b/webapp/graphite/static/js/ext/resources/icons/fam/cross.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/cross.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/cross.gif diff --git a/webapp/content/js/ext/resources/icons/fam/delete.gif b/webapp/graphite/static/js/ext/resources/icons/fam/delete.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/delete.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/delete.gif diff --git a/webapp/content/js/ext/resources/icons/fam/error.png b/webapp/graphite/static/js/ext/resources/icons/fam/error.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/error.png rename to webapp/graphite/static/js/ext/resources/icons/fam/error.png diff --git a/webapp/content/js/ext/resources/icons/fam/feed_add.png b/webapp/graphite/static/js/ext/resources/icons/fam/feed_add.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/feed_add.png rename to webapp/graphite/static/js/ext/resources/icons/fam/feed_add.png diff --git a/webapp/content/js/ext/resources/icons/fam/feed_delete.png b/webapp/graphite/static/js/ext/resources/icons/fam/feed_delete.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/feed_delete.png rename to webapp/graphite/static/js/ext/resources/icons/fam/feed_delete.png diff --git a/webapp/content/js/ext/resources/icons/fam/feed_error.png b/webapp/graphite/static/js/ext/resources/icons/fam/feed_error.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/feed_error.png rename to webapp/graphite/static/js/ext/resources/icons/fam/feed_error.png diff --git a/webapp/content/js/ext/resources/icons/fam/folder_go.png b/webapp/graphite/static/js/ext/resources/icons/fam/folder_go.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/folder_go.png rename to webapp/graphite/static/js/ext/resources/icons/fam/folder_go.png diff --git a/webapp/content/js/ext/resources/icons/fam/folder_wrench.png b/webapp/graphite/static/js/ext/resources/icons/fam/folder_wrench.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/folder_wrench.png rename to webapp/graphite/static/js/ext/resources/icons/fam/folder_wrench.png diff --git a/webapp/content/js/ext/resources/icons/fam/grid.png b/webapp/graphite/static/js/ext/resources/icons/fam/grid.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/grid.png rename to webapp/graphite/static/js/ext/resources/icons/fam/grid.png diff --git a/webapp/content/js/ext/resources/icons/fam/image_add.png b/webapp/graphite/static/js/ext/resources/icons/fam/image_add.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/image_add.png rename to webapp/graphite/static/js/ext/resources/icons/fam/image_add.png diff --git a/webapp/content/js/ext/resources/icons/fam/information.png b/webapp/graphite/static/js/ext/resources/icons/fam/information.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/information.png rename to webapp/graphite/static/js/ext/resources/icons/fam/information.png diff --git a/webapp/content/js/ext/resources/icons/fam/plugin.gif b/webapp/graphite/static/js/ext/resources/icons/fam/plugin.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/plugin.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/plugin.gif diff --git a/webapp/content/js/ext/resources/icons/fam/plugin_add.gif b/webapp/graphite/static/js/ext/resources/icons/fam/plugin_add.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/plugin_add.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/plugin_add.gif diff --git a/webapp/content/js/ext/resources/icons/fam/rss_go.png b/webapp/graphite/static/js/ext/resources/icons/fam/rss_go.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/rss_go.png rename to webapp/graphite/static/js/ext/resources/icons/fam/rss_go.png diff --git a/webapp/content/js/ext/resources/icons/fam/table_refresh.png b/webapp/graphite/static/js/ext/resources/icons/fam/table_refresh.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/table_refresh.png rename to webapp/graphite/static/js/ext/resources/icons/fam/table_refresh.png diff --git a/webapp/content/js/ext/resources/icons/fam/user.gif b/webapp/graphite/static/js/ext/resources/icons/fam/user.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/user.gif diff --git a/webapp/content/js/ext/resources/icons/fam/user.png b/webapp/graphite/static/js/ext/resources/icons/fam/user.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user.png diff --git a/webapp/content/js/ext/resources/icons/fam/user_add.gif b/webapp/graphite/static/js/ext/resources/icons/fam/user_add.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_add.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/user_add.gif diff --git a/webapp/content/js/ext/resources/icons/fam/user_add.png b/webapp/graphite/static/js/ext/resources/icons/fam/user_add.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_add.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user_add.png diff --git a/webapp/content/js/ext/resources/icons/fam/user_comment.png b/webapp/graphite/static/js/ext/resources/icons/fam/user_comment.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_comment.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user_comment.png diff --git a/webapp/content/js/ext/resources/icons/fam/user_delete.gif b/webapp/graphite/static/js/ext/resources/icons/fam/user_delete.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_delete.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/user_delete.gif diff --git a/webapp/content/js/ext/resources/icons/fam/user_delete.png b/webapp/graphite/static/js/ext/resources/icons/fam/user_delete.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_delete.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user_delete.png diff --git a/webapp/content/js/ext/resources/icons/fam/user_edit.png b/webapp/graphite/static/js/ext/resources/icons/fam/user_edit.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_edit.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user_edit.png diff --git a/webapp/content/js/ext/resources/icons/fam/user_female.gif b/webapp/graphite/static/js/ext/resources/icons/fam/user_female.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_female.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/user_female.gif diff --git a/webapp/content/js/ext/resources/icons/fam/user_female.png b/webapp/graphite/static/js/ext/resources/icons/fam/user_female.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_female.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user_female.png diff --git a/webapp/content/js/ext/resources/icons/fam/user_gray.png b/webapp/graphite/static/js/ext/resources/icons/fam/user_gray.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_gray.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user_gray.png diff --git a/webapp/content/js/ext/resources/icons/fam/user_green.gif b/webapp/graphite/static/js/ext/resources/icons/fam/user_green.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_green.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/user_green.gif diff --git a/webapp/content/js/ext/resources/icons/fam/user_green.png b/webapp/graphite/static/js/ext/resources/icons/fam/user_green.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_green.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user_green.png diff --git a/webapp/content/js/ext/resources/icons/fam/user_orange.png b/webapp/graphite/static/js/ext/resources/icons/fam/user_orange.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_orange.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user_orange.png diff --git a/webapp/content/js/ext/resources/icons/fam/user_red.png b/webapp/graphite/static/js/ext/resources/icons/fam/user_red.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_red.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user_red.png diff --git a/webapp/content/js/ext/resources/icons/fam/user_suit.gif b/webapp/graphite/static/js/ext/resources/icons/fam/user_suit.gif similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_suit.gif rename to webapp/graphite/static/js/ext/resources/icons/fam/user_suit.gif diff --git a/webapp/content/js/ext/resources/icons/fam/user_suit.png b/webapp/graphite/static/js/ext/resources/icons/fam/user_suit.png similarity index 100% rename from webapp/content/js/ext/resources/icons/fam/user_suit.png rename to webapp/graphite/static/js/ext/resources/icons/fam/user_suit.png diff --git a/webapp/content/js/ext/resources/images/default/box/corners-blue.gif b/webapp/graphite/static/js/ext/resources/images/default/box/corners-blue.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/box/corners-blue.gif rename to webapp/graphite/static/js/ext/resources/images/default/box/corners-blue.gif diff --git a/webapp/content/js/ext/resources/images/default/box/corners.gif b/webapp/graphite/static/js/ext/resources/images/default/box/corners.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/box/corners.gif rename to webapp/graphite/static/js/ext/resources/images/default/box/corners.gif diff --git a/webapp/content/js/ext/resources/images/default/box/l-blue.gif b/webapp/graphite/static/js/ext/resources/images/default/box/l-blue.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/box/l-blue.gif rename to webapp/graphite/static/js/ext/resources/images/default/box/l-blue.gif diff --git a/webapp/content/js/ext/resources/images/default/box/l.gif b/webapp/graphite/static/js/ext/resources/images/default/box/l.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/box/l.gif rename to webapp/graphite/static/js/ext/resources/images/default/box/l.gif diff --git a/webapp/content/js/ext/resources/images/default/box/r-blue.gif b/webapp/graphite/static/js/ext/resources/images/default/box/r-blue.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/box/r-blue.gif rename to webapp/graphite/static/js/ext/resources/images/default/box/r-blue.gif diff --git a/webapp/content/js/ext/resources/images/default/box/r.gif b/webapp/graphite/static/js/ext/resources/images/default/box/r.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/box/r.gif rename to webapp/graphite/static/js/ext/resources/images/default/box/r.gif diff --git a/webapp/content/js/ext/resources/images/default/box/tb-blue.gif b/webapp/graphite/static/js/ext/resources/images/default/box/tb-blue.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/box/tb-blue.gif rename to webapp/graphite/static/js/ext/resources/images/default/box/tb-blue.gif diff --git a/webapp/content/js/ext/resources/images/default/box/tb.gif b/webapp/graphite/static/js/ext/resources/images/default/box/tb.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/box/tb.gif rename to webapp/graphite/static/js/ext/resources/images/default/box/tb.gif diff --git a/webapp/content/js/ext/resources/images/default/button/arrow.gif b/webapp/graphite/static/js/ext/resources/images/default/button/arrow.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/arrow.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/arrow.gif diff --git a/webapp/content/js/ext/resources/images/default/button/btn.gif b/webapp/graphite/static/js/ext/resources/images/default/button/btn.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/btn.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/btn.gif diff --git a/webapp/content/js/ext/resources/images/default/button/group-cs.gif b/webapp/graphite/static/js/ext/resources/images/default/button/group-cs.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/group-cs.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/group-cs.gif diff --git a/webapp/content/js/ext/resources/images/default/button/group-lr.gif b/webapp/graphite/static/js/ext/resources/images/default/button/group-lr.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/group-lr.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/group-lr.gif diff --git a/webapp/content/js/ext/resources/images/default/button/group-tb.gif b/webapp/graphite/static/js/ext/resources/images/default/button/group-tb.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/group-tb.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/group-tb.gif diff --git a/webapp/content/js/ext/resources/images/default/button/s-arrow-b-noline.gif b/webapp/graphite/static/js/ext/resources/images/default/button/s-arrow-b-noline.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/s-arrow-b-noline.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/s-arrow-b-noline.gif diff --git a/webapp/content/js/ext/resources/images/default/button/s-arrow-b.gif b/webapp/graphite/static/js/ext/resources/images/default/button/s-arrow-b.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/s-arrow-b.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/s-arrow-b.gif diff --git a/webapp/content/js/ext/resources/images/default/button/s-arrow-bo.gif b/webapp/graphite/static/js/ext/resources/images/default/button/s-arrow-bo.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/s-arrow-bo.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/s-arrow-bo.gif diff --git a/webapp/content/js/ext/resources/images/default/button/s-arrow-noline.gif b/webapp/graphite/static/js/ext/resources/images/default/button/s-arrow-noline.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/s-arrow-noline.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/s-arrow-noline.gif diff --git a/webapp/content/js/ext/resources/images/default/button/s-arrow-o.gif b/webapp/graphite/static/js/ext/resources/images/default/button/s-arrow-o.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/s-arrow-o.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/s-arrow-o.gif diff --git a/webapp/content/js/ext/resources/images/default/button/s-arrow.gif b/webapp/graphite/static/js/ext/resources/images/default/button/s-arrow.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/button/s-arrow.gif rename to webapp/graphite/static/js/ext/resources/images/default/button/s-arrow.gif diff --git a/webapp/content/js/ext/resources/images/default/dd/drop-add.gif b/webapp/graphite/static/js/ext/resources/images/default/dd/drop-add.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/dd/drop-add.gif rename to webapp/graphite/static/js/ext/resources/images/default/dd/drop-add.gif diff --git a/webapp/content/js/ext/resources/images/default/dd/drop-no.gif b/webapp/graphite/static/js/ext/resources/images/default/dd/drop-no.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/dd/drop-no.gif rename to webapp/graphite/static/js/ext/resources/images/default/dd/drop-no.gif diff --git a/webapp/content/js/ext/resources/images/default/dd/drop-yes.gif b/webapp/graphite/static/js/ext/resources/images/default/dd/drop-yes.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/dd/drop-yes.gif rename to webapp/graphite/static/js/ext/resources/images/default/dd/drop-yes.gif diff --git a/webapp/content/js/ext/resources/images/default/editor/tb-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/editor/tb-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/editor/tb-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/editor/tb-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/form/checkbox.gif b/webapp/graphite/static/js/ext/resources/images/default/form/checkbox.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/checkbox.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/checkbox.gif diff --git a/webapp/content/js/ext/resources/images/default/form/clear-trigger.gif b/webapp/graphite/static/js/ext/resources/images/default/form/clear-trigger.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/clear-trigger.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/clear-trigger.gif diff --git a/webapp/content/js/ext/resources/images/default/form/clear-trigger.psd b/webapp/graphite/static/js/ext/resources/images/default/form/clear-trigger.psd similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/clear-trigger.psd rename to webapp/graphite/static/js/ext/resources/images/default/form/clear-trigger.psd diff --git a/webapp/content/js/ext/resources/images/default/form/date-trigger.gif b/webapp/graphite/static/js/ext/resources/images/default/form/date-trigger.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/date-trigger.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/date-trigger.gif diff --git a/webapp/content/js/ext/resources/images/default/form/date-trigger.psd b/webapp/graphite/static/js/ext/resources/images/default/form/date-trigger.psd similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/date-trigger.psd rename to webapp/graphite/static/js/ext/resources/images/default/form/date-trigger.psd diff --git a/webapp/content/js/ext/resources/images/default/form/error-tip-corners.gif b/webapp/graphite/static/js/ext/resources/images/default/form/error-tip-corners.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/error-tip-corners.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/error-tip-corners.gif diff --git a/webapp/content/js/ext/resources/images/default/form/exclamation.gif b/webapp/graphite/static/js/ext/resources/images/default/form/exclamation.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/exclamation.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/exclamation.gif diff --git a/webapp/content/js/ext/resources/images/default/form/radio.gif b/webapp/graphite/static/js/ext/resources/images/default/form/radio.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/radio.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/radio.gif diff --git a/webapp/content/js/ext/resources/images/default/form/search-trigger.gif b/webapp/graphite/static/js/ext/resources/images/default/form/search-trigger.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/search-trigger.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/search-trigger.gif diff --git a/webapp/content/js/ext/resources/images/default/form/search-trigger.psd b/webapp/graphite/static/js/ext/resources/images/default/form/search-trigger.psd similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/search-trigger.psd rename to webapp/graphite/static/js/ext/resources/images/default/form/search-trigger.psd diff --git a/webapp/content/js/ext/resources/images/default/form/text-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/form/text-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/text-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/text-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/form/trigger-square.gif b/webapp/graphite/static/js/ext/resources/images/default/form/trigger-square.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/trigger-square.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/trigger-square.gif diff --git a/webapp/content/js/ext/resources/images/default/form/trigger-square.psd b/webapp/graphite/static/js/ext/resources/images/default/form/trigger-square.psd similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/trigger-square.psd rename to webapp/graphite/static/js/ext/resources/images/default/form/trigger-square.psd diff --git a/webapp/content/js/ext/resources/images/default/form/trigger-tpl.gif b/webapp/graphite/static/js/ext/resources/images/default/form/trigger-tpl.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/trigger-tpl.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/trigger-tpl.gif diff --git a/webapp/content/js/ext/resources/images/default/form/trigger.gif b/webapp/graphite/static/js/ext/resources/images/default/form/trigger.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/trigger.gif rename to webapp/graphite/static/js/ext/resources/images/default/form/trigger.gif diff --git a/webapp/content/js/ext/resources/images/default/form/trigger.psd b/webapp/graphite/static/js/ext/resources/images/default/form/trigger.psd similarity index 100% rename from webapp/content/js/ext/resources/images/default/form/trigger.psd rename to webapp/graphite/static/js/ext/resources/images/default/form/trigger.psd diff --git a/webapp/content/js/ext/resources/images/default/gradient-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/gradient-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/gradient-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/gradient-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/arrow-left-white.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/arrow-left-white.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/arrow-left-white.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/arrow-left-white.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/arrow-right-white.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/arrow-right-white.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/arrow-right-white.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/arrow-right-white.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/col-move-bottom.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/col-move-bottom.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/col-move-bottom.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/col-move-bottom.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/col-move-top.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/col-move-top.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/col-move-top.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/col-move-top.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/columns.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/columns.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/columns.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/columns.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/dirty.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/dirty.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/dirty.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/dirty.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/done.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/done.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/done.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/done.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/drop-no.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/drop-no.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/drop-no.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/drop-no.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/drop-yes.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/drop-yes.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/drop-yes.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/drop-yes.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/footer-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/footer-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/footer-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/footer-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid-blue-hd.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid-blue-hd.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid-blue-hd.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid-blue-hd.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid-blue-split.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid-blue-split.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid-blue-split.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid-blue-split.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid-hrow.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid-hrow.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid-hrow.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid-hrow.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid-loading.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid-loading.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid-loading.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid-loading.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid-split.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid-split.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid-split.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid-split.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid-vista-hd.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid-vista-hd.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid-vista-hd.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid-vista-hd.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid3-hd-btn.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid3-hd-btn.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid3-hd-btn.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid3-hd-btn.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid3-hrow-over.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid3-hrow-over.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid3-hrow-over.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid3-hrow-over.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid3-hrow.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid3-hrow.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid3-hrow.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid3-hrow.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid3-rowheader.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid3-rowheader.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid3-rowheader.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid3-rowheader.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid3-special-col-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid3-special-col-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid3-special-col-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid3-special-col-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/group-by.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/group-by.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/group-by.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/group-by.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/group-collapse.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/group-collapse.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/group-collapse.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/group-collapse.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/group-expand-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/group-expand-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/group-expand-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/group-expand-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/group-expand.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/group-expand.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/group-expand.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/group-expand.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/hd-pop.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/hd-pop.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/hd-pop.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/hd-pop.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/hmenu-asc.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-asc.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/hmenu-asc.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-asc.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/hmenu-desc.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-desc.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/hmenu-desc.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-desc.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/hmenu-lock.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-lock.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/hmenu-lock.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-lock.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/hmenu-lock.png b/webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-lock.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/hmenu-lock.png rename to webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-lock.png diff --git a/webapp/content/js/ext/resources/images/default/grid/hmenu-unlock.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-unlock.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/hmenu-unlock.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-unlock.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/hmenu-unlock.png b/webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-unlock.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/hmenu-unlock.png rename to webapp/graphite/static/js/ext/resources/images/default/grid/hmenu-unlock.png diff --git a/webapp/content/js/ext/resources/images/default/grid/invalid_line.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/invalid_line.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/invalid_line.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/invalid_line.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/loading.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/loading.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/loading.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/loading.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/mso-hd.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/mso-hd.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/mso-hd.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/mso-hd.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/nowait.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/nowait.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/nowait.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/nowait.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/page-first-disabled.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/page-first-disabled.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/page-first-disabled.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/page-first-disabled.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/page-first.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/page-first.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/page-first.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/page-first.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/page-last-disabled.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/page-last-disabled.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/page-last-disabled.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/page-last-disabled.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/page-last.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/page-last.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/page-last.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/page-last.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/page-next-disabled.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/page-next-disabled.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/page-next-disabled.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/page-next-disabled.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/page-next.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/page-next.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/page-next.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/page-next.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/page-prev-disabled.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/page-prev-disabled.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/page-prev-disabled.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/page-prev-disabled.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/page-prev.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/page-prev.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/page-prev.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/page-prev.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/pick-button.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/pick-button.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/pick-button.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/pick-button.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/refresh-disabled.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/refresh-disabled.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/refresh-disabled.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/refresh-disabled.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/refresh.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/refresh.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/refresh.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/refresh.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/row-check-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/row-check-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/row-check-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/row-check-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/row-expand-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/row-expand-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/row-expand-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/row-expand-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/row-over.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/row-over.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/row-over.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/row-over.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/row-sel.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/row-sel.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/row-sel.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/row-sel.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/sort-hd.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/sort-hd.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/sort-hd.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/sort-hd.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/sort_asc.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/sort_asc.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/sort_asc.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/sort_asc.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/sort_desc.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/sort_desc.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/sort_desc.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/sort_desc.gif diff --git a/webapp/content/js/ext/resources/images/default/grid/wait.gif b/webapp/graphite/static/js/ext/resources/images/default/grid/wait.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/grid/wait.gif rename to webapp/graphite/static/js/ext/resources/images/default/grid/wait.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/collapse.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/collapse.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/collapse.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/collapse.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/expand.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/expand.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/expand.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/expand.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/gradient-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/gradient-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/gradient-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/gradient-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/mini-bottom.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/mini-bottom.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/mini-bottom.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/mini-bottom.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/mini-left.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/mini-left.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/mini-left.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/mini-left.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/mini-right.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/mini-right.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/mini-right.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/mini-right.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/mini-top.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/mini-top.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/mini-top.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/mini-top.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/ns-collapse.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/ns-collapse.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/ns-collapse.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/ns-collapse.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/ns-expand.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/ns-expand.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/ns-expand.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/ns-expand.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/panel-close.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/panel-close.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/panel-close.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/panel-close.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/panel-title-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/panel-title-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/panel-title-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/panel-title-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/panel-title-light-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/panel-title-light-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/panel-title-light-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/panel-title-light-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/stick.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/stick.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/stick.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/stick.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/stuck.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/stuck.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/stuck.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/stuck.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/tab-close-on.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/tab-close-on.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/tab-close-on.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/tab-close-on.gif diff --git a/webapp/content/js/ext/resources/images/default/layout/tab-close.gif b/webapp/graphite/static/js/ext/resources/images/default/layout/tab-close.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/layout/tab-close.gif rename to webapp/graphite/static/js/ext/resources/images/default/layout/tab-close.gif diff --git a/webapp/content/js/ext/resources/images/default/menu/checked.gif b/webapp/graphite/static/js/ext/resources/images/default/menu/checked.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/menu/checked.gif rename to webapp/graphite/static/js/ext/resources/images/default/menu/checked.gif diff --git a/webapp/content/js/ext/resources/images/default/menu/group-checked.gif b/webapp/graphite/static/js/ext/resources/images/default/menu/group-checked.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/menu/group-checked.gif rename to webapp/graphite/static/js/ext/resources/images/default/menu/group-checked.gif diff --git a/webapp/content/js/ext/resources/images/default/menu/item-over.gif b/webapp/graphite/static/js/ext/resources/images/default/menu/item-over.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/menu/item-over.gif rename to webapp/graphite/static/js/ext/resources/images/default/menu/item-over.gif diff --git a/webapp/content/js/ext/resources/images/default/menu/menu-parent.gif b/webapp/graphite/static/js/ext/resources/images/default/menu/menu-parent.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/menu/menu-parent.gif rename to webapp/graphite/static/js/ext/resources/images/default/menu/menu-parent.gif diff --git a/webapp/content/js/ext/resources/images/default/menu/menu.gif b/webapp/graphite/static/js/ext/resources/images/default/menu/menu.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/menu/menu.gif rename to webapp/graphite/static/js/ext/resources/images/default/menu/menu.gif diff --git a/webapp/content/js/ext/resources/images/default/menu/unchecked.gif b/webapp/graphite/static/js/ext/resources/images/default/menu/unchecked.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/menu/unchecked.gif rename to webapp/graphite/static/js/ext/resources/images/default/menu/unchecked.gif diff --git a/webapp/content/js/ext/resources/images/default/panel/corners-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/panel/corners-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/corners-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/panel/corners-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/panel/left-right.gif b/webapp/graphite/static/js/ext/resources/images/default/panel/left-right.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/left-right.gif rename to webapp/graphite/static/js/ext/resources/images/default/panel/left-right.gif diff --git a/webapp/content/js/ext/resources/images/default/panel/light-hd.gif b/webapp/graphite/static/js/ext/resources/images/default/panel/light-hd.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/light-hd.gif rename to webapp/graphite/static/js/ext/resources/images/default/panel/light-hd.gif diff --git a/webapp/content/js/ext/resources/images/default/panel/tool-sprite-tpl.gif b/webapp/graphite/static/js/ext/resources/images/default/panel/tool-sprite-tpl.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/tool-sprite-tpl.gif rename to webapp/graphite/static/js/ext/resources/images/default/panel/tool-sprite-tpl.gif diff --git a/webapp/content/js/ext/resources/images/default/panel/tool-sprites.gif b/webapp/graphite/static/js/ext/resources/images/default/panel/tool-sprites.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/tool-sprites.gif rename to webapp/graphite/static/js/ext/resources/images/default/panel/tool-sprites.gif diff --git a/webapp/content/js/ext/resources/images/default/panel/tools-sprites-trans.gif b/webapp/graphite/static/js/ext/resources/images/default/panel/tools-sprites-trans.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/tools-sprites-trans.gif rename to webapp/graphite/static/js/ext/resources/images/default/panel/tools-sprites-trans.gif diff --git a/webapp/content/js/ext/resources/images/default/panel/top-bottom.gif b/webapp/graphite/static/js/ext/resources/images/default/panel/top-bottom.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/top-bottom.gif rename to webapp/graphite/static/js/ext/resources/images/default/panel/top-bottom.gif diff --git a/webapp/content/js/ext/resources/images/default/panel/top-bottom.png b/webapp/graphite/static/js/ext/resources/images/default/panel/top-bottom.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/top-bottom.png rename to webapp/graphite/static/js/ext/resources/images/default/panel/top-bottom.png diff --git a/webapp/content/js/ext/resources/images/default/panel/white-corners-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/panel/white-corners-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/white-corners-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/panel/white-corners-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/panel/white-left-right.gif b/webapp/graphite/static/js/ext/resources/images/default/panel/white-left-right.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/white-left-right.gif rename to webapp/graphite/static/js/ext/resources/images/default/panel/white-left-right.gif diff --git a/webapp/content/js/ext/resources/images/default/panel/white-top-bottom.gif b/webapp/graphite/static/js/ext/resources/images/default/panel/white-top-bottom.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/panel/white-top-bottom.gif rename to webapp/graphite/static/js/ext/resources/images/default/panel/white-top-bottom.gif diff --git a/webapp/content/js/ext/resources/images/default/progress/progress-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/progress/progress-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/progress/progress-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/progress/progress-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/qtip/bg.gif b/webapp/graphite/static/js/ext/resources/images/default/qtip/bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/qtip/bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/qtip/bg.gif diff --git a/webapp/content/js/ext/resources/images/default/qtip/close.gif b/webapp/graphite/static/js/ext/resources/images/default/qtip/close.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/qtip/close.gif rename to webapp/graphite/static/js/ext/resources/images/default/qtip/close.gif diff --git a/webapp/content/js/ext/resources/images/default/qtip/tip-anchor-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/qtip/tip-anchor-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/qtip/tip-anchor-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/qtip/tip-anchor-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/qtip/tip-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/qtip/tip-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/qtip/tip-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/qtip/tip-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/s.gif b/webapp/graphite/static/js/ext/resources/images/default/s.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/s.gif rename to webapp/graphite/static/js/ext/resources/images/default/s.gif diff --git a/webapp/content/js/ext/resources/images/default/shadow-c.png b/webapp/graphite/static/js/ext/resources/images/default/shadow-c.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/shadow-c.png rename to webapp/graphite/static/js/ext/resources/images/default/shadow-c.png diff --git a/webapp/content/js/ext/resources/images/default/shadow-lr.png b/webapp/graphite/static/js/ext/resources/images/default/shadow-lr.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/shadow-lr.png rename to webapp/graphite/static/js/ext/resources/images/default/shadow-lr.png diff --git a/webapp/content/js/ext/resources/images/default/shadow.png b/webapp/graphite/static/js/ext/resources/images/default/shadow.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/shadow.png rename to webapp/graphite/static/js/ext/resources/images/default/shadow.png diff --git a/webapp/content/js/ext/resources/images/default/shared/blue-loading.gif b/webapp/graphite/static/js/ext/resources/images/default/shared/blue-loading.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/shared/blue-loading.gif rename to webapp/graphite/static/js/ext/resources/images/default/shared/blue-loading.gif diff --git a/webapp/content/js/ext/resources/images/default/shared/calendar.gif b/webapp/graphite/static/js/ext/resources/images/default/shared/calendar.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/shared/calendar.gif rename to webapp/graphite/static/js/ext/resources/images/default/shared/calendar.gif diff --git a/webapp/content/js/ext/resources/images/default/shared/glass-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/shared/glass-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/shared/glass-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/shared/glass-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/shared/hd-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/shared/hd-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/shared/hd-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/shared/hd-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/shared/large-loading.gif b/webapp/graphite/static/js/ext/resources/images/default/shared/large-loading.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/shared/large-loading.gif rename to webapp/graphite/static/js/ext/resources/images/default/shared/large-loading.gif diff --git a/webapp/content/js/ext/resources/images/default/shared/left-btn.gif b/webapp/graphite/static/js/ext/resources/images/default/shared/left-btn.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/shared/left-btn.gif rename to webapp/graphite/static/js/ext/resources/images/default/shared/left-btn.gif diff --git a/webapp/content/js/ext/resources/images/default/shared/loading-balls.gif b/webapp/graphite/static/js/ext/resources/images/default/shared/loading-balls.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/shared/loading-balls.gif rename to webapp/graphite/static/js/ext/resources/images/default/shared/loading-balls.gif diff --git a/webapp/content/js/ext/resources/images/default/shared/right-btn.gif b/webapp/graphite/static/js/ext/resources/images/default/shared/right-btn.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/shared/right-btn.gif rename to webapp/graphite/static/js/ext/resources/images/default/shared/right-btn.gif diff --git a/webapp/content/js/ext/resources/images/default/shared/warning.gif b/webapp/graphite/static/js/ext/resources/images/default/shared/warning.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/shared/warning.gif rename to webapp/graphite/static/js/ext/resources/images/default/shared/warning.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/e-handle-dark.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/e-handle-dark.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/e-handle-dark.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/e-handle-dark.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/e-handle.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/e-handle.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/e-handle.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/e-handle.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/ne-handle-dark.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/ne-handle-dark.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/ne-handle-dark.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/ne-handle-dark.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/ne-handle.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/ne-handle.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/ne-handle.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/ne-handle.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/nw-handle-dark.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/nw-handle-dark.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/nw-handle-dark.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/nw-handle-dark.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/nw-handle.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/nw-handle.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/nw-handle.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/nw-handle.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/s-handle-dark.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/s-handle-dark.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/s-handle-dark.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/s-handle-dark.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/s-handle.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/s-handle.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/s-handle.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/s-handle.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/se-handle-dark.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/se-handle-dark.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/se-handle-dark.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/se-handle-dark.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/se-handle.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/se-handle.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/se-handle.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/se-handle.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/square.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/square.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/square.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/square.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/sw-handle-dark.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/sw-handle-dark.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/sw-handle-dark.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/sw-handle-dark.gif diff --git a/webapp/content/js/ext/resources/images/default/sizer/sw-handle.gif b/webapp/graphite/static/js/ext/resources/images/default/sizer/sw-handle.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/sizer/sw-handle.gif rename to webapp/graphite/static/js/ext/resources/images/default/sizer/sw-handle.gif diff --git a/webapp/content/js/ext/resources/images/default/slider/slider-bg.png b/webapp/graphite/static/js/ext/resources/images/default/slider/slider-bg.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/slider/slider-bg.png rename to webapp/graphite/static/js/ext/resources/images/default/slider/slider-bg.png diff --git a/webapp/content/js/ext/resources/images/default/slider/slider-thumb.png b/webapp/graphite/static/js/ext/resources/images/default/slider/slider-thumb.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/slider/slider-thumb.png rename to webapp/graphite/static/js/ext/resources/images/default/slider/slider-thumb.png diff --git a/webapp/content/js/ext/resources/images/default/slider/slider-v-bg.png b/webapp/graphite/static/js/ext/resources/images/default/slider/slider-v-bg.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/slider/slider-v-bg.png rename to webapp/graphite/static/js/ext/resources/images/default/slider/slider-v-bg.png diff --git a/webapp/content/js/ext/resources/images/default/slider/slider-v-thumb.png b/webapp/graphite/static/js/ext/resources/images/default/slider/slider-v-thumb.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/slider/slider-v-thumb.png rename to webapp/graphite/static/js/ext/resources/images/default/slider/slider-v-thumb.png diff --git a/webapp/content/js/ext/resources/images/default/tabs/scroll-left.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/scroll-left.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/scroll-left.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/scroll-left.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/scroll-right.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/scroll-right.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/scroll-right.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/scroll-right.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/scroller-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/scroller-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/scroller-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/scroller-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/tab-btm-left-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-left-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tab-btm-left-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-left-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-left-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-over-left-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-left-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-over-left-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-right-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-over-right-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-right-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-over-right-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/tab-btm-right-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-right-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tab-btm-right-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tab-btm-right-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/tab-close.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/tab-close.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tab-close.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tab-close.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/tab-strip-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tab-strip-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.png b/webapp/graphite/static/js/ext/resources/images/default/tabs/tab-strip-bg.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.png rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tab-strip-bg.png diff --git a/webapp/content/js/ext/resources/images/default/tabs/tab-strip-btm-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/tab-strip-btm-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tab-strip-btm-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tab-strip-btm-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/tabs/tabs-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/tabs/tabs-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tabs/tabs-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/tabs/tabs-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/toolbar/bg.gif b/webapp/graphite/static/js/ext/resources/images/default/toolbar/bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/toolbar/bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/toolbar/bg.gif diff --git a/webapp/content/js/ext/resources/images/default/toolbar/btn-arrow-light.gif b/webapp/graphite/static/js/ext/resources/images/default/toolbar/btn-arrow-light.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/toolbar/btn-arrow-light.gif rename to webapp/graphite/static/js/ext/resources/images/default/toolbar/btn-arrow-light.gif diff --git a/webapp/content/js/ext/resources/images/default/toolbar/btn-arrow.gif b/webapp/graphite/static/js/ext/resources/images/default/toolbar/btn-arrow.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/toolbar/btn-arrow.gif rename to webapp/graphite/static/js/ext/resources/images/default/toolbar/btn-arrow.gif diff --git a/webapp/content/js/ext/resources/images/default/toolbar/btn-over-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/toolbar/btn-over-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/toolbar/btn-over-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/toolbar/btn-over-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/toolbar/gray-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/toolbar/gray-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/toolbar/gray-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/toolbar/gray-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/toolbar/more.gif b/webapp/graphite/static/js/ext/resources/images/default/toolbar/more.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/toolbar/more.gif rename to webapp/graphite/static/js/ext/resources/images/default/toolbar/more.gif diff --git a/webapp/content/js/ext/resources/images/default/toolbar/tb-bg.gif b/webapp/graphite/static/js/ext/resources/images/default/toolbar/tb-bg.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/toolbar/tb-bg.gif rename to webapp/graphite/static/js/ext/resources/images/default/toolbar/tb-bg.gif diff --git a/webapp/content/js/ext/resources/images/default/toolbar/tb-btn-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/toolbar/tb-btn-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/toolbar/tb-btn-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/toolbar/tb-btn-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/toolbar/tb-xl-btn-sprite.gif b/webapp/graphite/static/js/ext/resources/images/default/toolbar/tb-xl-btn-sprite.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/toolbar/tb-xl-btn-sprite.gif rename to webapp/graphite/static/js/ext/resources/images/default/toolbar/tb-xl-btn-sprite.gif diff --git a/webapp/content/js/ext/resources/images/default/toolbar/tb-xl-sep.gif b/webapp/graphite/static/js/ext/resources/images/default/toolbar/tb-xl-sep.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/toolbar/tb-xl-sep.gif rename to webapp/graphite/static/js/ext/resources/images/default/toolbar/tb-xl-sep.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/arrows.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/arrows.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/arrows.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/arrows.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/drop-add.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/drop-add.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/drop-add.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/drop-add.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/drop-between.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/drop-between.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/drop-between.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/drop-between.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/drop-no.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/drop-no.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/drop-no.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/drop-no.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/drop-over.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/drop-over.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/drop-over.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/drop-over.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/drop-under.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/drop-under.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/drop-under.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/drop-under.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/drop-yes.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/drop-yes.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/drop-yes.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/drop-yes.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow-end-minus-nl.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow-end-minus-nl.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow-end-minus-nl.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow-end-minus-nl.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow-end-minus.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow-end-minus.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow-end-minus.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow-end-minus.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow-end-plus-nl.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow-end-plus-nl.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow-end-plus-nl.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow-end-plus-nl.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow-end-plus.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow-end-plus.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow-end-plus.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow-end-plus.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow-end.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow-end.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow-end.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow-end.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow-line.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow-line.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow-line.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow-line.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow-minus-nl.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow-minus-nl.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow-minus-nl.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow-minus-nl.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow-minus.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow-minus.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow-minus.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow-minus.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow-plus-nl.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow-plus-nl.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow-plus-nl.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow-plus-nl.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow-plus.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow-plus.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow-plus.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow-plus.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/elbow.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/elbow.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/elbow.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/elbow.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/folder-open.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/folder-open.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/folder-open.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/folder-open.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/folder.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/folder.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/folder.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/folder.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/leaf.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/leaf.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/leaf.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/leaf.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/loading.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/loading.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/loading.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/loading.gif diff --git a/webapp/content/js/ext/resources/images/default/tree/s.gif b/webapp/graphite/static/js/ext/resources/images/default/tree/s.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/tree/s.gif rename to webapp/graphite/static/js/ext/resources/images/default/tree/s.gif diff --git a/webapp/content/js/ext/resources/images/default/window/icon-error.gif b/webapp/graphite/static/js/ext/resources/images/default/window/icon-error.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/icon-error.gif rename to webapp/graphite/static/js/ext/resources/images/default/window/icon-error.gif diff --git a/webapp/content/js/ext/resources/images/default/window/icon-info.gif b/webapp/graphite/static/js/ext/resources/images/default/window/icon-info.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/icon-info.gif rename to webapp/graphite/static/js/ext/resources/images/default/window/icon-info.gif diff --git a/webapp/content/js/ext/resources/images/default/window/icon-question.gif b/webapp/graphite/static/js/ext/resources/images/default/window/icon-question.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/icon-question.gif rename to webapp/graphite/static/js/ext/resources/images/default/window/icon-question.gif diff --git a/webapp/content/js/ext/resources/images/default/window/icon-warning.gif b/webapp/graphite/static/js/ext/resources/images/default/window/icon-warning.gif similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/icon-warning.gif rename to webapp/graphite/static/js/ext/resources/images/default/window/icon-warning.gif diff --git a/webapp/content/js/ext/resources/images/default/window/left-corners.png b/webapp/graphite/static/js/ext/resources/images/default/window/left-corners.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/left-corners.png rename to webapp/graphite/static/js/ext/resources/images/default/window/left-corners.png diff --git a/webapp/content/js/ext/resources/images/default/window/left-corners.psd b/webapp/graphite/static/js/ext/resources/images/default/window/left-corners.psd similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/left-corners.psd rename to webapp/graphite/static/js/ext/resources/images/default/window/left-corners.psd diff --git a/webapp/content/js/ext/resources/images/default/window/left-right.png b/webapp/graphite/static/js/ext/resources/images/default/window/left-right.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/left-right.png rename to webapp/graphite/static/js/ext/resources/images/default/window/left-right.png diff --git a/webapp/content/js/ext/resources/images/default/window/left-right.psd b/webapp/graphite/static/js/ext/resources/images/default/window/left-right.psd similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/left-right.psd rename to webapp/graphite/static/js/ext/resources/images/default/window/left-right.psd diff --git a/webapp/content/js/ext/resources/images/default/window/right-corners.png b/webapp/graphite/static/js/ext/resources/images/default/window/right-corners.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/right-corners.png rename to webapp/graphite/static/js/ext/resources/images/default/window/right-corners.png diff --git a/webapp/content/js/ext/resources/images/default/window/right-corners.psd b/webapp/graphite/static/js/ext/resources/images/default/window/right-corners.psd similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/right-corners.psd rename to webapp/graphite/static/js/ext/resources/images/default/window/right-corners.psd diff --git a/webapp/content/js/ext/resources/images/default/window/top-bottom.png b/webapp/graphite/static/js/ext/resources/images/default/window/top-bottom.png similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/top-bottom.png rename to webapp/graphite/static/js/ext/resources/images/default/window/top-bottom.png diff --git a/webapp/content/js/ext/resources/images/default/window/top-bottom.psd b/webapp/graphite/static/js/ext/resources/images/default/window/top-bottom.psd similarity index 100% rename from webapp/content/js/ext/resources/images/default/window/top-bottom.psd rename to webapp/graphite/static/js/ext/resources/images/default/window/top-bottom.psd diff --git a/webapp/content/js/ext/ux/DataViewTransition.js b/webapp/graphite/static/js/ext/ux/DataViewTransition.js similarity index 100% rename from webapp/content/js/ext/ux/DataViewTransition.js rename to webapp/graphite/static/js/ext/ux/DataViewTransition.js From ce76c4a899fb422b68b0383089fff7b7301695b7 Mon Sep 17 00:00:00 2001 From: Piotr Date: Fri, 1 Feb 2019 11:56:46 +0100 Subject: [PATCH 07/12] Remove STATICFILES_DIRS from settings.py and add explanation in local_settings.py Fixes dashboards which were broken with last commit --- webapp/graphite/local_settings.py.example | 26 +++++++++++++++++++++++ webapp/graphite/settings.py | 5 ----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/webapp/graphite/local_settings.py.example b/webapp/graphite/local_settings.py.example index b5378fae4..1967f4dc3 100644 --- a/webapp/graphite/local_settings.py.example +++ b/webapp/graphite/local_settings.py.example @@ -94,6 +94,28 @@ DEFAULT_XFILES_FACTOR = 0 #FIND_TIMEOUT = 3.0 # Timeout for metric find requests #FETCH_TIMEOUT = 3.0 # Timeout to fetch series data + +##################################### +# Static Files # +##################################### +# +# Graphite servers static files (.html, .css, .js) directly from the +# application by using whitenoise. If you want to serve the files from a +# webserver instead: +# - Uncomment following lines +# - Point STATIC_ROOT to the directory which is served by your webserver +# - Run `django-admin collectstatic --noinput --settings=graphite.settings` +# - Disable whitenoise in wsgi.py and app_settings.py +# - Configure your webserver accordingly + +# from os.path import abspath, dirname, join +# STATICFILES_DIRS = ( +# join(dirname(abspath(__file__)), 'static'), +# ) + +# STATIC_ROOT = '/path/to/your/webservers/shared/directory' + + ##################################### # Filesystem Paths # ##################################### @@ -140,6 +162,7 @@ DEFAULT_XFILES_FACTOR = 0 # 'graphite.finders.ceres.CeresFinder', # ) + ##################################### # Email Configuration # ##################################### @@ -358,6 +381,7 @@ DEFAULT_XFILES_FACTOR = 0 # This should usually match the value configured in Carbon. #REPLICATION_FACTOR = 1 + ##################################### # TagDB Settings # ##################################### @@ -382,6 +406,7 @@ DEFAULT_XFILES_FACTOR = 0 # Does the remote TagDB support autocomplete? #TAGDB_HTTP_AUTOCOMPLETE = False + ##################################### # Function plugins # ##################################### @@ -389,6 +414,7 @@ DEFAULT_XFILES_FACTOR = 0 # See: http://graphite.readthedocs.io/en/latest/functions.html#function-plugins FUNCTION_PLUGINS = [] + ##################################### # Additional Django Settings # ##################################### diff --git a/webapp/graphite/settings.py b/webapp/graphite/settings.py index b8c5c4db4..dff9d08e4 100644 --- a/webapp/graphite/settings.py +++ b/webapp/graphite/settings.py @@ -216,11 +216,6 @@ if not GRAPHITE_WEB_APP_SETTINGS_LOADED: from graphite.app_settings import * # noqa - -STATICFILES_DIRS = ( - join(WEB_DIR, 'static'), -) - # Handle renamed timeout settings FIND_TIMEOUT = FIND_TIMEOUT or REMOTE_FIND_TIMEOUT or 3.0 FETCH_TIMEOUT = FETCH_TIMEOUT or REMOTE_FETCH_TIMEOUT or 6.0 From 15185fa813c52152b0542a625fc517618b7e632a Mon Sep 17 00:00:00 2001 From: Piotr Date: Sat, 2 Feb 2019 21:34:09 +0100 Subject: [PATCH 08/12] Update and simplify docs --- conf/graphite.wsgi.example | 1 - docs/admin-carbon.rst | 13 -- docs/admin-webapp.rst | 19 --- docs/carbon-daemons.rst | 26 +++ ...base-setup.rst => config-webapp-setup.rst} | 27 +-- docs/config-webapp.rst | 76 ++++++--- docs/development.rst | 4 +- docs/faq.rst | 6 +- docs/index.rst | 2 - docs/install-pip.rst | 77 --------- docs/install-source.rst | 101 ----------- docs/install-virtualenv.rst | 75 -------- docs/install.rst | 161 ++++++++++++------ examples/example-graphite-vhost.conf | 9 +- 14 files changed, 218 insertions(+), 379 deletions(-) delete mode 100644 docs/admin-carbon.rst delete mode 100644 docs/admin-webapp.rst rename docs/{config-database-setup.rst => config-webapp-setup.rst} (83%) delete mode 100644 docs/install-pip.rst delete mode 100644 docs/install-source.rst delete mode 100644 docs/install-virtualenv.rst diff --git a/conf/graphite.wsgi.example b/conf/graphite.wsgi.example index c0f8f295a..2885aab5f 100755 --- a/conf/graphite.wsgi.example +++ b/conf/graphite.wsgi.example @@ -2,6 +2,5 @@ import sys # In case of multi-instance graphite, uncomment and set appropriate name # import os # os.environ['GRAPHITE_SETTINGS_MODULE'] = 'graphite.local_settings' -sys.path.append('/opt/graphite/webapp') from graphite.wsgi import application diff --git a/docs/admin-carbon.rst b/docs/admin-carbon.rst deleted file mode 100644 index b5a7acc51..000000000 --- a/docs/admin-carbon.rst +++ /dev/null @@ -1,13 +0,0 @@ -Administering Carbon -==================== - - -Starting Carbon ---------------- -Carbon can be started with the ``carbon-cache.py`` script:: - - /opt/graphite/bin/carbon-cache.py start - -This starts the main Carbon daemon in the background. Now is a good time -to check the logs, located in ``/opt/graphite/storage/log/carbon-cache/`` -for any errors. diff --git a/docs/admin-webapp.rst b/docs/admin-webapp.rst deleted file mode 100644 index 7a3f52826..000000000 --- a/docs/admin-webapp.rst +++ /dev/null @@ -1,19 +0,0 @@ -Administering The Webapp -======================== - -Depending on the stack you choose to expose the Graphite webapp, its usage varies slightly. - -nginx + gunicorn ----------------- - -As nginx is already ready to proxy requests, we just need to start Gunicorn. - -The following will do: - -.. code-block:: none - - PYTHONPATH=/opt/graphite/webapp gunicorn wsgi --workers=4 --bind=127.0.0.1:8080 --log-file=/var/log/gunicorn.log --preload --pythonpath=/opt/graphite/webapp/graphite & - -It will start Gunicorn and listen on ``localhost:8080``, log to ``/var/log/gunicorn.log`` and use ``/opt/graphite/webapp/graphite`` as the webapp path. - -Naturally, you can change these settings so that it fits your setup. diff --git a/docs/carbon-daemons.rst b/docs/carbon-daemons.rst index a10f46d8e..5b6446b1c 100644 --- a/docs/carbon-daemons.rst +++ b/docs/carbon-daemons.rst @@ -13,6 +13,32 @@ the data once they receive it. This document gives a brief overview of what each does and how you can use them to build a more sophisticated storage backend. +Starting and stopping Carbon +---------------------------- + +To start the Carbon daemons run: + +.. code-block:: bash + + carbon-cache.py start + carbon-relay.py start + carbon-aggregator.py start + carbon-aggregator-cache.py start + + +.. note:: If you are using Virtualenv you must specify the full path + ``/opt/graphite/bin/carbon-cache.py start`` + +To stop the daemons replace ``start`` with ``stop``. + + +Logs +---- + +If installed in the :ref:`default location ` then the +Carbon daemons write their logs to ``/opt/graphite/storage/log/``. + + carbon-cache.py --------------- diff --git a/docs/config-database-setup.rst b/docs/config-webapp-setup.rst similarity index 83% rename from docs/config-database-setup.rst rename to docs/config-webapp-setup.rst index 18ec781ff..7c11724fa 100644 --- a/docs/config-database-setup.rst +++ b/docs/config-webapp-setup.rst @@ -1,14 +1,15 @@ -Webapp Database Setup -===================== +Webapp Setup +============ + +Before Graphite-web can be started the database needs to be initialized and the static files need to be collected. + +Database Setup +-------------- + You must tell Django to create the database tables used by the graphite webapp. This is very straight forward, especially if you are using the default SQLite setup. The following configures the Django database settings. Graphite uses the database for storing user profiles, dashboards, and for the Events functionality. Graphite uses an SQLite database file located at ``STORAGE_DIR/graphite.db`` by default. If running multiple Graphite-web instances, a database such as PostgreSQL or MySQL is required so that all instances may share the same data source. -.. note :: - As of Django 1.2, the database configuration is specified by the DATABASES - dictionary instead of the old ``DATABASE_*`` format. Users must use the new - specification to have a working database. - See the `Django documentation `_ for full documentation of the DATABASES setting. @@ -20,15 +21,21 @@ To set up a new database and create the initial schema, run: .. code-block:: none - PYTHONPATH=$GRAPHITE_ROOT/webapp django-admin.py migrate --settings=graphite.settings + django-admin.py migrate --settings=graphite.settings + +.. note:: + + If you get a ``Could not import settings 'graphite.settings'`` error message add your ``PYTHONPATH`` in front of the command: + ``PYTHONPATH=$GRAPHITE_ROOT/webapp django-admin.py migrate --settings=graphite.settings`` .. note :: Graphite-Web 1.0 and earlier had some models without migrations, and with Django 1.9 or later, the ``--run-syncdb`` option was needed for migrate to create tables for these models. (Django 1.8 and earlier did not have this option, but always exhibited this behavior.) In Graphite-Web 1.1 and later all models have migrations, so ``--run-syncdb`` is no longer needed. If upgrading a database created by Graphite-Web 1.0 or earlier, you need to use the ``--fake-initial`` option for migrate: it considers an initial migration to already be applied if the tables it creates already exist. + If you are experiencing problems, uncomment the following line in /opt/graphite/webapp/graphite/local_settings.py: .. code-block:: none - + # DEBUG = True and review your webapp logs. If you're using the default graphite-example-vhost.conf, your logs will be found in /opt/graphite/storage/log/webapp/. @@ -36,5 +43,5 @@ and review your webapp logs. If you're using the default graphite-example-vhost. If you're using the default SQLite database, your webserver will need permissions to read and write to the database file. So, for example, if your webapp is running in Apache as the 'nobody' user, you will need to fix the permissions like this: .. code-block:: none - + sudo chown nobody:nobody /opt/graphite/storage/graphite.db diff --git a/docs/config-webapp.rst b/docs/config-webapp.rst index e5d4752f1..826158297 100644 --- a/docs/config-webapp.rst +++ b/docs/config-webapp.rst @@ -31,6 +31,53 @@ On Debian-based systems, run: sudo apt install gunicorn +Next, you will have to create a configuration to start Graphite. +If your system is using Systemd create following unit files: + +``/etc/systemd/system/graphite-web.socket``: + +.. code-block:: none + + [Unit] + Description=Graphite-web socket + + [Socket] + ListenStream=/run/graphite-web.sock + ListenStream=127.0.0.1:8080 + + [Install] + WantedBy=sockets.target + +``/etc/systemd/system/graphite-web.service``: + +.. code-block:: none + + [Unit] + Description=Graphite-web service + Requires=graphite-web.socket + + [Service] + ExecStart=/usr/bin/gunicorn -w2 graphite.wsgi -b 127.0.0.1:8080 + # If you are using virtualenv specify the path to gunicorn in virtualenv. + # ExecStart=/opt/graphite/bin/gunicorn -w2 graphite.wsgi -b 127.0.0.1:8080 + Restart=on-failure + #User=graphite + #Group=graphite + ExecReload=/bin/kill -s HUP $MAINPID + ExecStop=/bin/kill -s TERM $MAINPID + PrivateTmp=true + + [Install] + WantedBy=multi-user.target + + +Reload the systemd configuration, the service is socket activated so no need to start it manually. + +.. code-block:: none + + systemctl daemon-reload + + Install nginx ^^^^^^^^^^^^^ @@ -40,9 +87,6 @@ On Debian-based systems, run: sudo apt install nginx -Configure nginx -^^^^^^^^^^^^^^^ - We will use dedicated log files for nginx when serving Graphite: .. code-block:: none @@ -74,12 +118,6 @@ Write the following configuration in ``/etc/nginx/sites-available/graphite``: return 204; } - # serve static content from the "content" directory - location /static { - alias /opt/graphite/webapp/content; - expires max; - } - location / { try_files $uri @graphite; } @@ -144,6 +182,9 @@ Finally, configure the apache vhost. (You can find example of Graphite vhost con LoadModule wsgi_module modules/mod_wsgi.so + # Set WSGIPythonHome when using virtualenv + # WSGIPythonHome /opt/graphite + WSGISocketPrefix /var/run/wsgi Listen 80 @@ -161,18 +202,6 @@ Finally, configure the apache vhost. (You can find example of Graphite vhost con WSGIScriptAlias / /opt/graphite/conf/graphite.wsgi - Alias /static/ /opt/graphite/static/ - - - - Order deny,allow - Allow from all - - = 2.4> - Require all granted - - - Order deny,allow @@ -184,6 +213,9 @@ Finally, configure the apache vhost. (You can find example of Graphite vhost con + +.. note:: You have to configure ``WSGIPythonHome`` if you are using Virtualenv + Adapt the mod_wsgi configuration to your requirements. See the `mod_wsgi QuickConfigurationGuide`_ for an overview of configurations and `mod_wsgi ConfigurationDirectives`_ to see all configuration directives @@ -272,7 +304,7 @@ Enable the vhost and restart nginx: Acnowlegments -------------_ +------------- Portions of that manual are based on `Graphite-API deployment manual`_. diff --git a/docs/development.rst b/docs/development.rst index 7281bc53b..b04671780 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -5,8 +5,8 @@ Graphite-web accepts contributions on `GitHub `_, in the form of issues or pull requests. If you're comfortable with Python, here is how to get started. -First, keep in mind that Graphite-web supports Python versions **2.6 to 2.7** -and Django versions **1.4 and above**. +First, keep in mind that Graphite-web supports Python versions **2.7 and above** +and Django versions **1.8 and above**. Setting up a development environment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/faq.rst b/docs/faq.rst index 7dc8c4c85..d2752b665 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -3,7 +3,7 @@ FAQ What is Graphite? ----------------- -Graphite is a highly scalable real-time graphing system. As a user, you write an application that collects numeric time-series data that you are interested in graphing, and send it to Graphite's processing backend, :doc:`carbon `, which stores the data in Graphite's specialized database. The data can then be visualized through graphite's web interfaces. +Graphite is a highly scalable real-time graphing system. As a user, you write an application that collects numeric time-series data that you are interested in graphing, and send it to Graphite's processing backend, :doc:`carbon `, which stores the data in Graphite's specialized database. The data can then be visualized through Graphite's web interfaces. Who should use Graphite? @@ -35,7 +35,7 @@ Graphite was internally developed by `Orbitz`_ where it is used to visualize a v What is Graphite written in? ---------------------------- -Python2. The Graphite webapp is built on the `Django`_ web framework and uses the ExtJS javascript GUI toolkit. The graph rendering is done using the Cairo graphics library. The backend and database are written in pure Python. +Python. The Graphite webapp is built on the `Django`_ web framework and uses the ExtJS javascript GUI toolkit. The graph rendering is done using the Cairo graphics library. The backend and database are written in pure Python. Who writes and maintains Graphite? @@ -76,7 +76,7 @@ Is there a diagram of Graphite's architecture? ---------------------------------------------- There sure is! Here it is: -.. image:: ../webapp/content/img/overview.png +.. image:: ../webapp/graphite/static/img/overview.png .. _Django: http://www.djangoproject.com/ diff --git a/docs/index.rst b/docs/index.rst index 6652f408e..b6e0329d6 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,10 +11,8 @@ Graphite Documentation carbon-daemons config-carbon feeding-carbon - admin-carbon config-local-settings config-webapp - admin-webapp composer render_api functions diff --git a/docs/install-pip.rst b/docs/install-pip.rst deleted file mode 100644 index c845e3957..000000000 --- a/docs/install-pip.rst +++ /dev/null @@ -1,77 +0,0 @@ -Installing From Pip -=================== - -Versioned Graphite releases can be installed via `pip `_. When installing with pip, installation of Python package dependencies will automatically be attempted. - -.. note:: - - In order to install Graphite-Web and Carbon, you must first install some development headers. In Debian-based distributions, this will require ``apt-get install python-dev libcairo2-dev libffi-dev build-essential``, and in Red Hat-based distributions you will run ``yum install python-devel cairo-devel libffi-devel``. - -Installing in the Default Location ----------------------------------- -To install Graphite in the :ref:`default location `, ``/opt/graphite/``, -simply execute as root: - -.. code-block:: none - - export PYTHONPATH="/opt/graphite/lib/:/opt/graphite/webapp/" - pip install --no-binary=:all: https://github.com/graphite-project/whisper/tarball/master - pip install --no-binary=:all: https://github.com/graphite-project/carbon/tarball/master - pip install --no-binary=:all: https://github.com/graphite-project/graphite-web/tarball/master - -.. note:: - - If your version of ``pip`` is < 7.0.0 then no need to use ``--no-binary=:all:`` parameter - -.. note:: - - On RedHat-based systems using the ``python-pip`` package, the pip executable is named ``pip-python`` - -Installing Carbon in a Custom Location --------------------------------------- -Installation of Carbon in a custom location with `pip` is similar to doing so from a source install. Arguments to the underlying ``setup.py`` controlling installation location can be passed through `pip` with the ``--install-option`` option. - -See :ref:`carbon-custom-location-source` for details of locations and available arguments - -For example, to install everything in ``/srv/graphite/``: - -.. code-block:: none - - pip install https://github.com/graphite-project/carbon/tarball/master --install-option="--prefix=/srv/graphite" --install-option="--install-lib=/srv/graphite/lib" - -To install Carbon into the system-wide site-packages directory with scripts in ``/usr/bin`` and storage and -configuration in ``/usr/share/graphite``: - -.. code-block:: none - - pip install https://github.com/graphite-project/carbon/tarball/master --install-option="--install-scripts=/usr/bin" --install-option="--install-lib=/usr/lib/python2.6/site-packages" --install-option="--install-data=/var/lib/graphite" - -Installing Graphite-web in a Custom Location --------------------------------------------- -Installation of Graphite-web in a custom location with `pip` is similar to doing so from a source install. -Arguments to the underlying ``setup.py`` controlling installation location can be passed through `pip` -with the ``--install-option`` option. - -See :ref:`graphite-web-custom-location-source` for details on default locations and available arguments - -For example, to install everything in ``/srv/graphite/``: - -.. code-block:: none - - pip install https://github.com/graphite-project/graphite-web/tarball/master --install-option="--prefix=/srv/graphite" --install-option="--install-lib=/srv/graphite/webapp" - -To install the Graphite-web code into the system-wide site-packages directory with scripts in -``/usr/bin`` and storage configuration, and content in ``/usr/share/graphite``: - -.. code-block:: none - - pip install https://github.com/graphite-project/graphite-web/tarball/master --install-option="--install-scripts=/usr/bin" --install-option="--install-lib=/usr/lib/python2.6/site-packages" --install-option="--install-data=/var/lib/graphite" - -Installing Ceres ----------------- -Ceres is an alternative storage backend that some choose to use in place of the default Whisper backend. - -.. code-block:: none - - pip install https://github.com/graphite-project/ceres/tarball/master - diff --git a/docs/install-source.rst b/docs/install-source.rst deleted file mode 100644 index 6187cce4a..000000000 --- a/docs/install-source.rst +++ /dev/null @@ -1,101 +0,0 @@ -Installing From Source -====================== -The latest source tarballs for Graphite-web, Carbon, and Whisper may be fetched from the Graphite -project `download page`_ or the latest development branches may be cloned from the `Github project page`_: - -* Graphite-web: ``git clone https://github.com/graphite-project/graphite-web.git`` -* Carbon: ``git clone https://github.com/graphite-project/carbon.git`` -* Whisper: ``git clone https://github.com/graphite-project/whisper.git`` -* Ceres: ``git clone https://github.com/graphite-project/ceres.git`` - -.. note:: - - There currently is no tarball available for Ceres, it must be cloned from the - `Github project page`_ - - -Installing in the Default Location ----------------------------------- -To install Graphite in the :ref:`default location `, ``/opt/graphite/``, simply execute -``python setup.py install`` as root in each of the project directories for Graphite-web, Carbon, Whisper, and Ceres. - -.. _carbon-custom-location-source: - -Installing Carbon in a Custom Location --------------------------------------- -Carbon's ``setup.py`` installer is configured to use a ``prefix`` of ``/opt/graphite`` and an -``install-lib`` of ``/opt/graphite/lib``. Carbon's lifecycle wrapper scripts and utilities -are installed in ``bin``, configuration within ``conf``, and stored data in ``storage`` all within ``prefix``. -These may be overridden by passing parameters to the ``setup.py install`` command. - -The following parameters influence the install location: - -- ``--prefix`` - - Location to place the ``bin/`` and ``storage/`` and ``conf/`` directories (defaults to ``/opt/graphite/``) - -- ``--install-lib`` - - Location to install Python modules (default: ``/opt/graphite/lib``) - -- ``--install-data`` - - Location to place the ``storage`` and ``conf`` directories (default: value of ``prefix``) - -- ``--install-scripts`` - - Location to place the scripts (default: ``bin/`` inside of ``prefix``) - - -For example, to install everything in ``/srv/graphite/``: - -.. code-block:: none - - python setup.py install --prefix=/srv/graphite --install-lib=/srv/graphite/lib - -To install Carbon into the system-wide site-packages directory with scripts in ``/usr/bin`` and storage and -configuration in ``/usr/share/graphite``: - -.. code-block:: none - - python setup.py install --install-scripts=/usr/bin --install-lib=/usr/lib/python2.6/site-packages --install-data=/var/lib/graphite - -.. _graphite-web-custom-location-source: - -Installing Graphite-web in a Custom Location --------------------------------------------- -Graphite-web's ``setup.py`` installer is configured to use a ``prefix`` of ``/opt/graphite`` and an ``install-lib`` of ``/opt/graphite/webapp``. Utilities are installed in ``bin``, and configuration in ``conf`` within the ``prefix``. These may be overridden by passing parameters to ``setup.py install`` - -The following parameters influence the install location: - -- ``--prefix`` - - Location to place the ``bin/`` and ``conf/`` directories (defaults to ``/opt/graphite/``) - -- ``--install-lib`` - - Location to install Python modules (default: ``/opt/graphite/webapp``) - -- ``--install-data`` - - Location to place the ``webapp/content`` and ``conf`` directories (default: value of ``prefix``) - -- ``--install-scripts`` - - Location to place scripts (default: ``bin/`` inside of ``prefix``) - - -For example, to install everything in ``/srv/graphite/``: - -.. code-block:: none - - python setup.py install --prefix=/srv/graphite --install-lib=/srv/graphite/webapp - -To install the Graphite-web code into the system-wide site-packages directory with scripts in ``/usr/bin`` and storage configuration, and content in ``/usr/share/graphite``: - -.. code-block:: none - - python setup.py install --install-scripts=/usr/bin --install-lib=/usr/lib/python2.6/site-packages --install-data=/var/lib/graphite - -.. _Github project page: http://github.com/graphite-project -.. _download page: https://launchpad.net/graphite/+download diff --git a/docs/install-virtualenv.rst b/docs/install-virtualenv.rst deleted file mode 100644 index 536483b86..000000000 --- a/docs/install-virtualenv.rst +++ /dev/null @@ -1,75 +0,0 @@ -Installing in Virtualenv -======================== -`Virtualenv`_ provides an isolated Python environment to run Graphite in. - -Installing in the Default Location ----------------------------------- -To install Graphite in the :ref:`default location `, ``/opt/graphite/``, -create a virtualenv in ``/opt/graphite`` and activate it: - -.. code-block:: none - - virtualenv /opt/graphite - source /opt/graphite/bin/activate - -Once the virtualenv is activated, Graphite and Carbon can be installed -:doc:`from source ` or :doc:`via pip `. Note that dependencies will -need to be installed while the virtualenv is activated unless -`--system-site-packages `_ -is specified at virtualenv creation time. - -Installing in a Custom Location -------------------------------- -To install from source activate the virtualenv and see the instructions for :ref:`graphite-web ` and :ref:`carbon ` - -Running Carbon Within Virtualenv --------------------------------- -Carbon may be run within Virtualenv by `activating virtualenv`_ before Carbon is started - -Running Graphite-web Within Virtualenv --------------------------------------- -Running Django's ``django-admin.py`` within a virtualenv requires using the -full path of the virtualenv:: - - /path/to/env/bin/django-admin.py --settings=graphite.settings - -The method of running Graphite-web within Virtualenv depends on the WSGI server used: - -Apache mod_wsgi -^^^^^^^^^^^^^^^ -.. note:: - - The version Python used to compile mod_wsgi must match the Python installed in the virtualenv (generally the system Python) - -To the Apache `mod_wsgi`_ config, add the root of the virtualenv as ``WSGIPythonHome``, ``/opt/graphite`` -in this example: - -.. code-block:: none - - WSGIPythonHome /opt/graphite - -and add the virtualenv's python site-packages to the ``graphite.wsgi`` file, python 2.6 in ``/opt/graphite`` -in this example: - -.. code-block:: none - - site.addsitedir('/opt/graphite/lib/python2.6/site-packages') - -See the `mod_wsgi documentation on Virtual Environments ` for more details. - -Gunicorn -^^^^^^^^ -Ensure `Gunicorn`_ is installed in the activated virtualenv and execute as normal. If gunicorn is -installed system-wide, it may be necessary to execute it from the virtualenv's bin path - -uWSGI -^^^^^ -Execute `uWSGI`_ using the ``-H`` option to specify the virtualenv root. See the `uWSGI documentation on virtualenv `_ for more details. - - -.. _activating virtualenv: http://www.virtualenv.org/en/latest/index.html#activate-script -.. _Gunicorn: http://gunicorn.org/ -.. _mod_wsgi: http://code.google.com/p/modwsgi/ -.. _uWSGI: http://projects.unbit.it/uwsgi -.. _Virtualenv: http://virtualenv.org/ - diff --git a/docs/install.rst b/docs/install.rst index 352b1d2ee..b3c7683cb 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -1,12 +1,18 @@ Installing Graphite =================== +There are several ways to install Graphite. Docker is the easiest way and is recommended for new +users. If you need to install Graphite directly on your system (not using Docker) then using +`Virtualenv`_ with `pip`_ would be recommended. With virtualenv all dependencies are installed +isolated so they will not interfere with your system Python. Installation from source should +only be used in specific cases (e.g. installing a development release). + Docker ------ Try Graphite in Docker and have it running in seconds: -.. code-block:: none +.. code-block:: bash docker run -d\ --name graphite\ @@ -33,19 +39,19 @@ been met or not. Basic Graphite requirements: * a UNIX-like Operating System -* Python 2.7 or greater (including experimental Python3 support) +* Python 2.7 or greater (including Python 3) * `cairocffi`_ -* `Django`_ 1.8 - 1.11 (for Python3 - 1.11 only) +* `Django`_ 1.8 - 2.1 * `django-tagging`_ 0.4.6 (not `django-taggit` yet) * `pytz`_ * `scandir`_ * `fontconfig`_ and at least one font package (a system package usually) * A WSGI server and web server. Popular choices are: - - `Apache`_ with `mod_wsgi`_ - - `gunicorn`_ with `nginx`_ + - `Apache`_ with `mod_wsgi`_ + - `uWSGI`_ with `nginx`_ Additionally, the Graphite webapp and Carbon require the Whisper database library which @@ -57,7 +63,9 @@ There are also several other dependencies required for additional features: * LDAP authentication: `python-ldap`_ (for LDAP authentication support in the webapp) * AMQP support: `txamqp`_ (version 0.8 is required) * RRD support: `python-rrdtool`_ -* Dependent modules for additional database support (MySQL, PostgreSQL, etc). See `Django database install`_ instructions and the `Django database`_ documentation for details +* Dependent modules for additional database support (MySQL, PostgreSQL, etc). See + `Django database install`_ instructions and the `Django database`_ documentation for details +* `pyhash`_ fnv1_ch hashing support .. seealso:: On some systems it is necessary to install fonts for Cairo to use. If the webapp is running but all graphs return as broken images, this may be why. @@ -69,75 +77,123 @@ There are also several other dependencies required for additional features: Fulfilling Dependencies ----------------------- Most current Linux distributions have all of the requirements available in the base packages. -RHEL based distributions may require the `EPEL`_ repository for requirements. -Python module dependencies can be install with `pip`_ rather than system packages if desired or if using -a Python version that differs from the system default. Some modules (such as Cairo) may require -library development headers to be available. +Python module dependencies can be install with `pip`_ rather than system packages if desired +or if using a Python version that differs from the system default. Some modules (such as Cairo) +may require library development headers to be available. + + +RHEL/Centos 7 +^^^^^^^^^^^^^ +For RHEL based distributions enable the `EPEL`_ repository. + +.. code-block:: bash + + yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm + yum install dejavu-sans-fonts dejavu-serif-fonts python-pip python-virtualenv cairo + +Debian-based distributions +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. code-block:: bash + + apt-get install python-dev libcairo2-dev libffi-dev build-essential .. _default-installation-layout : Default Installation Layout --------------------------- -Graphite defaults to an installation layout that puts the entire install in its own directory: ``/opt/graphite`` - -Whisper -^^^^^^^ -Whisper is installed Python's system-wide site-packages directory with Whisper's utilities installed -in the bin dir of the system's default prefix (generally ``/usr/bin/``). +Graphite traditionally installed all components in ``/opt/graphite``, since release 1.2.0 +Graphite's installation location depends on your `Python prefix`_. If you are using `Virtualenv`_ +the ``prefix`` is set to the root of your virtualenv. You can find your ``prefix`` by running: -Carbon and Graphite-web -^^^^^^^^^^^^^^^^^^^^^^^ -Carbon and Graphite-web are installed in ``/opt/graphite/`` with the following layout: +.. code-block:: bash -- ``bin/`` -- ``conf/`` -- ``lib/`` + python -c 'import sys; print(sys.prefix)' - Carbon ``PYTHONPATH`` +Directory layout: -- ``storage/`` +- ``PREFIX/`` Usually ``/opt/graphite/`` - - ``log`` + - ``conf/`` Carbon configuration files - Log directory for Carbon and Graphite-web + - ``storage/`` - - ``rrd`` + - ``log`` Log directory for Carbon and Graphite-web - Location for RRD files to be read + - ``rrd`` Location for RRD files to be read - - ``whisper`` + - ``whisper`` Location for Whisper data files to be stored and read - Location for Whisper data files to be stored and read + - ``ceres`` Location for Ceres data files to be stored and read - - ``ceres`` - Location for Ceres data files to be stored and read +.. note:: Graphite-web's config file `local_settings.py` is located in the project + :doc:`directory ` -- ``webapp/`` +Using Virtualenv +---------------- +`Virtualenv`_ provides an isolated Python environment to run Graphite in. It is recommended to +install Graphite in Virtualenv so that dependent libraries will not interfere with other +applications. - Graphite-web ``PYTHONPATH`` +Create a virtualenv in ``/opt/graphite`` and activate it: - - ``graphite/`` +.. code-block:: bash - Location of ``local_settings.py`` + virtualenv /opt/graphite + source /opt/graphite/bin/activate - - ``content/`` +Once the virtualenv is activated, Graphite and Carbon can be installed the regular way +:ref:`via pip ` or :ref:`from source `. - Graphite-web static content directory +.. note:: Before installing dependencies or running Graphite the virtualenv needs to be + activated. Deactivating virtualenv can be done by running ``deactivate``. +.. _install-pip : -Installing Graphite +Installing From Pip ------------------- -Several installation options exist: -.. toctree:: - :maxdepth: 2 +Versioned Graphite releases can be installed via `pip`_. When installing with pip, +installation of Python package dependencies will automatically be attempted. - install-source - install-pip - install-virtualenv +To install Graphite execute: +.. code-block:: bash + + pip install whisper + pip install carbon + pip install graphite-web + +.. _install-source : + +Installing From Source +---------------------- + +The latest source tarballs for Graphite-web, Carbon, and Whisper may be fetched from the +Graphite project `download page`_ or the latest development branches may be cloned from +the `Github project page`_: + +.. code-block:: bash + + git clone https://github.com/graphite-project/whisper.git + git clone https://github.com/graphite-project/carbon.git + git clone https://github.com/graphite-project/graphite-web.git + + +To install with pip (which will automatically install dependent Python libraries): + +.. code-block:: bash + + pip install ./whisper/ + pip install ./carbon/ + pip install ./graphite-web/ + +Or without using pip, run from every directory: + +.. code-block:: bash + + python setup.py install --single-version-externally-managed Initial Configuration --------------------- @@ -145,7 +201,7 @@ Initial Configuration .. toctree:: :maxdepth: 2 - config-database-setup + config-webapp-setup config-webapp config-local-settings config-carbon @@ -166,9 +222,6 @@ Post-Install Tasks Initially none of the config files are created by the installer but example files are provided. Simply copy the ``.example`` files and customize. -:doc:`Administering Carbon ` - Once Carbon is configured, you need to start it up. - :doc:`Feeding In Your Data ` Once it's up and running, you need to feed it some data. @@ -176,9 +229,6 @@ Post-Install Tasks With data getting into carbon, you probably want to look at graphs of it. So now we turn our attention to the webapp. -:doc:`Administering The Webapp ` - Once its configured you'll need to get it running. - :doc:`Using the Composer ` Now that the webapp is running, you probably want to learn how to use it. @@ -201,7 +251,7 @@ Unfortunately, native Graphite on Windows is unsupported, but you can run Graphi .. _mod_wsgi: https://modwsgi.readthedocs.io/ .. _nginx: http://nginx.org/ .. _NOT Python 3: https://python3wos.appspot.com/ -.. _pip: https://pip.pypa.io/ +.. _pip: https://pypi.org/project/pip/ .. _python-ldap: https://www.python-ldap.org/ .. _python-memcache: https://www.tummy.com/software/python-memcached/ .. _python-rrdtool: http://oss.oetiker.ch/rrdtool/prog/rrdpython.en.html @@ -212,3 +262,8 @@ Unfortunately, native Graphite on Windows is unsupported, but you can run Graphi .. _uWSGI: http://uwsgi-docs.readthedocs.io/ .. _Docker: https://www.docker.com/ .. _docker repo: https://github.com/graphite-project/docker-graphite-statsd +.. _Virtualenv: http://virtualenv.org/ +.. _Github project page: http://github.com/graphite-project +.. _download page: https://launchpad.net/graphite/+download +.. _pyhash: https://pypi.org/project/pyhash/ +.. _Python prefix: https://docs.python.org/3/library/sys.html#sys.prefix diff --git a/examples/example-graphite-vhost.conf b/examples/example-graphite-vhost.conf index 6b78ca8ca..ac09fce40 100644 --- a/examples/example-graphite-vhost.conf +++ b/examples/example-graphite-vhost.conf @@ -15,6 +15,13 @@ LoadModule wsgi_module modules/mod_wsgi.so +# Virtualenv +# You have to set WSGIPythonHome to the root of your virtualenv installation +# when you are using virtualenv +# +# WSGIPythonHome /opt/graphite + + # XXX You need to set this up! # Read http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGISocketPrefix # For example, create a directory /var/run/wsgi and use that. @@ -43,7 +50,7 @@ WSGISocketPrefix run/wsgi # * Collect static files in a directory by running: # django-admin.py collectstatic --noinput --settings=graphite.settings # And set an alias to serve static files with Apache: - Alias /static/ /opt/graphite/static/ + # Alias /static/ /opt/graphite/static/ ######################## # URL-prefixed install # From caed07bdfc74170e11f6c4f12de150d4d5aefe7a Mon Sep 17 00:00:00 2001 From: Piotr Date: Thu, 7 Feb 2019 10:44:03 +0100 Subject: [PATCH 09/12] Docs: Add upgrade instructions Fix some spelling --- docs/{ceres.rst => Ceres.rst} | 8 +- docs/{faq.rst => FAQ.rst} | 2 +- docs/{whisper.rst => Whisper.rst} | 6 +- docs/composer.rst | 3 - docs/conf.py | 6 +- docs/config-webapp.rst | 10 +- docs/feeding-carbon.rst | 2 +- docs/index.rst | 7 +- docs/install.rst | 40 ++++--- docs/releases.rst | 1 + docs/releases/1_2_0.rst | 132 ++++++++++++++++++++++ webapp/graphite/local_settings.py.example | 2 +- 12 files changed, 179 insertions(+), 40 deletions(-) rename docs/{ceres.rst => Ceres.rst} (94%) rename docs/{faq.rst => FAQ.rst} (99%) rename docs/{whisper.rst => Whisper.rst} (98%) delete mode 100644 docs/composer.rst create mode 100644 docs/releases/1_2_0.rst diff --git a/docs/ceres.rst b/docs/Ceres.rst similarity index 94% rename from docs/ceres.rst rename to docs/Ceres.rst index cc3fb6cf2..798fc1fb3 100644 --- a/docs/ceres.rst +++ b/docs/Ceres.rst @@ -6,7 +6,7 @@ for Graphite. In contrast with Whisper, Ceres is not a fixed-size database and i better support sparse data of arbitrary fixed-size resolutions. This allows Graphite to distribute individual time-series across multiple servers or mounts. -Ceres is not actively developped at the moment. For alternatives to whisper look at :doc:`alternative storage backends `. +Ceres is not actively developed at the moment. For alternatives to whisper look at :doc:`alternative storage backends `. Storage Overview ---------------- @@ -61,12 +61,12 @@ large but allowed gap occurs it has to get filled in, which means instead of a s new file we could end up doing an ``(8 * MAX_SLICE_GAP)``-byte write to the latest slice. -Rollup Aggregation ------------------- +Roll-up Aggregation +------------------- Expected features such as roll-up aggregation and data expiration are not provided by Ceres itself, but instead are implemented as maintenance plugins. -Such a rollup plugin exists in Ceres that aggregates data points in a way that is similar behavior of +Such a roll-up plugin exists in Ceres that aggregates data points in a way that is similar behavior of Whisper archives. Where multiple data points are collapsed and written to a lower precision slice, and data points outside of the set slice retentions are trimmed. By default, an average function is used, however alternative methods can be chosen by changing the metadata. diff --git a/docs/faq.rst b/docs/FAQ.rst similarity index 99% rename from docs/faq.rst rename to docs/FAQ.rst index d2752b665..65342b7b1 100644 --- a/docs/faq.rst +++ b/docs/FAQ.rst @@ -52,7 +52,7 @@ The `Apache 2.0 License`_. Does Graphite use RRDtool? -------------------------- -No, not since Graphite was first written in 2006 at least. Graphite has its own specialized database library called :doc:`whisper `, which is very similar in design to RRD, but has a subtle yet fundamentally important difference that Graphite requires. There are two reasons whisper was created. The first reason is that RRD is designed under the assumption that data will always be inserted into the database on a regular basis, and this assumption causes RRD behave undesirably when given irregularly occurring data. Graphite was built to facilitate visualization of various application metrics that do not always occur regularly, like when an uncommon request is handled and the latency is measured and sent to Graphite. Using RRD, the data gets put into a temporary area inside the database where it is not accessible until the current time interval has passed *and* another value is inserted into the database for the following interval. If that does not happen within an allotted period of time, the original data point will get overwritten and is lost. Now for some metrics, the lack of a value can be correctly interpreted as a value of zero, however this is not the case for metrics like latency because a zero indicates that work was done in zero time, which is different than saying no work was done. Assuming a zero value for latency also screws up analysis like calculating the average latency, etc. +No, not since Graphite was first written in 2006 at least. Graphite has its own specialized database library called :doc:`whisper `, which is very similar in design to RRD, but has a subtle yet fundamentally important difference that Graphite requires. There are two reasons whisper was created. The first reason is that RRD is designed under the assumption that data will always be inserted into the database on a regular basis, and this assumption causes RRD behave undesirably when given irregularly occurring data. Graphite was built to facilitate visualization of various application metrics that do not always occur regularly, like when an uncommon request is handled and the latency is measured and sent to Graphite. Using RRD, the data gets put into a temporary area inside the database where it is not accessible until the current time interval has passed *and* another value is inserted into the database for the following interval. If that does not happen within an allotted period of time, the original data point will get overwritten and is lost. Now for some metrics, the lack of a value can be correctly interpreted as a value of zero, however this is not the case for metrics like latency because a zero indicates that work was done in zero time, which is different than saying no work was done. Assuming a zero value for latency also screws up analysis like calculating the average latency, etc. The second reason whisper was written is performance. RRDtool is very fast; in fact it is much faster than whisper. But the problem with RRD (at the time whisper was written) was that RRD only allowed you to insert a single value into a database at a time, while whisper was written to allow the insertion of multiple data points at once, compacting them into a single write operation. This improves performance drastically under high load because Graphite operates on many many files, and with such small operations being done (write a few bytes here, a few over there, etc) the bottleneck is caused by the *number of I/O operations*. Consider the scenario where Graphite is receiving 100,000 distinct metric values each minute; in order to sustain that load Graphite must be able to write that many data points to disk each minute. But assume that your underlying storage can only handle 20,000 I/O operations per minute. With RRD (at the time whisper was written), there was no chance of keeping up. But with whisper, we can keep caching the incoming data until we accumulate say 10 minutes worth of data for a given metric, then instead of doing 10 I/O operations to write those 10 data points, whisper can do it in one operation. The reason I have kept mentioning "at the time whisper was written" is that RRD now supports this behavior. However Graphite will continue to use whisper as long as the first issue still exists. diff --git a/docs/whisper.rst b/docs/Whisper.rst similarity index 98% rename from docs/whisper.rst rename to docs/Whisper.rst index 1e485e55c..4a0d69683 100644 --- a/docs/whisper.rst +++ b/docs/Whisper.rst @@ -39,8 +39,8 @@ That is, a pair of archives with retentions of 1 month and 1 year will not provi as may be guessed. Instead, it will provide 1 year of storage - the length of its longest archive. -Rollup Aggregation ------------------- +Roll-up Aggregation +------------------- Whisper databases with more than a single archive need a strategy to collapse multiple data points for when the data rolls up a lower precision archive. By default, an average function is used. Available aggregation methods are: @@ -56,7 +56,7 @@ Multi-Archive Storage and Retrieval Behavior -------------------------------------------- When Whisper writes to a database with multiple archives, the incoming data point is written to all archives at once. The data point will be written to the highest resolution archive as-is, and will be -aggregated by the configured aggregation method (see `Rollup Aggregation`_) and placed into each +aggregated by the configured aggregation method (see `Roll-up Aggregation`_) and placed into each of the higher-retention archives. If you are in need for aggregation of the highest resolution points, please consider using :doc:`carbon-aggregator ` for that purpose. diff --git a/docs/composer.rst b/docs/composer.rst deleted file mode 100644 index 9d90aeab0..000000000 --- a/docs/composer.rst +++ /dev/null @@ -1,3 +0,0 @@ -Using The Composer -================== -... diff --git a/docs/conf.py b/docs/conf.py index cf2b5a83e..6a745d2ba 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -80,16 +80,16 @@ def setup(app): # General information about the project. project = u'Graphite' -copyright = u'2008-2012, Chris Davis; 2011-2017 The Graphite Project' +copyright = u'2008-2012, Chris Davis; 2011-2019 The Graphite Project' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = '1.1.5' +version = '1.2.0' # The full version, including alpha/beta/rc tags. -release = '1.1.5' +release = '1.2.0-pre' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/config-webapp.rst b/docs/config-webapp.rst index 826158297..0a8f7fe65 100644 --- a/docs/config-webapp.rst +++ b/docs/config-webapp.rst @@ -3,13 +3,13 @@ Configuring The Webapp There are multiple ways to expose the Graphite webapp. The following stack configurations exist: -* nginx + gunicorn +* nginx + Gunicorn * Apache + mod_wsgi * nginx + uWSGI Depending on the configuration you choose, the webapp configuration is slightly different. -nginx + gunicorn +nginx + Gunicorn ---------------- In this setup, nginx will proxy requests for Gunicorn, which will itself listen locally on port 8080 and serve the webapp (Django application). @@ -169,7 +169,6 @@ Then create the graphite.wsgi. (You can find example of graphite.wsgi file on th # /opt/graphite/conf/graphite.wsgi import sys - sys.path.append('/opt/graphite/webapp') from graphite.wsgi import application Finally, configure the apache vhost. (You can find example of Graphite vhost configuration in the `contrib`_ directory of source ditribution): @@ -266,7 +265,6 @@ Then create the file ``wsgi.py``: # /opt/graphite/conf/wsgi.py import sys - sys.path.append('/opt/graphite/webapp') from graphite.wsgi import application Enable ``graphite.ini`` and restart uWSGI: @@ -303,8 +301,8 @@ Enable the vhost and restart nginx: $ service nginx restart -Acnowlegments -------------- +Acknowledgments +--------------- Portions of that manual are based on `Graphite-API deployment manual`_. diff --git a/docs/feeding-carbon.rst b/docs/feeding-carbon.rst index b8a271adf..3e497bbb0 100644 --- a/docs/feeding-carbon.rst +++ b/docs/feeding-carbon.rst @@ -101,7 +101,7 @@ When using a tagged naming scheme it is much easier to add or alter individual t Step 2 - Configure your Data Retention -------------------------------------- -Graphite is built on fixed-size databases (see :doc:`Whisper. `) so we have to configure in advance how much data we intend to store and at what level of precision. For instance you could store your data with 1-minute precision (meaning you will have one data point for each minute) for say 2 hours. Additionally you could store your data with 10-minute precision for 2 weeks, etc. The idea is that the storage cost is determined by the number of data points you want to store, the less fine your precision, the more time you can cover with fewer points. +Graphite is built on fixed-size databases (see :doc:`Whisper. `) so we have to configure in advance how much data we intend to store and at what level of precision. For instance you could store your data with 1-minute precision (meaning you will have one data point for each minute) for say 2 hours. Additionally you could store your data with 10-minute precision for 2 weeks, etc. The idea is that the storage cost is determined by the number of data points you want to store, the less fine your precision, the more time you can cover with fewer points. To determine the best retention configuration, you must answer all of the following questions. 1. How often can you produce your data? diff --git a/docs/index.rst b/docs/index.rst index b6e0329d6..06afabd52 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,19 +6,18 @@ Graphite Documentation :maxdepth: 1 overview - faq + FAQ install carbon-daemons config-carbon feeding-carbon config-local-settings config-webapp - composer render_api functions dashboard - whisper - ceres + Whisper + Ceres storage-backends events tags diff --git a/docs/install.rst b/docs/install.rst index b3c7683cb..796e6fa1c 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -3,7 +3,7 @@ Installing Graphite There are several ways to install Graphite. Docker is the easiest way and is recommended for new users. If you need to install Graphite directly on your system (not using Docker) then using -`Virtualenv`_ with `pip`_ would be recommended. With virtualenv all dependencies are installed +`Virtualenv`_ with `pip`_ would be recommended. With Virtualenv all dependencies are installed isolated so they will not interfere with your system Python. Installation from source should only be used in specific cases (e.g. installing a development release). @@ -48,7 +48,7 @@ Basic Graphite requirements: * `fontconfig`_ and at least one font package (a system package usually) * A WSGI server and web server. Popular choices are: - - `gunicorn`_ with `nginx`_ + - `Gunicorn`_ with `nginx`_ - `Apache`_ with `mod_wsgi`_ @@ -91,12 +91,20 @@ For RHEL based distributions enable the `EPEL`_ repository. yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install dejavu-sans-fonts dejavu-serif-fonts python-pip python-virtualenv cairo -Debian-based distributions -^^^^^^^^^^^^^^^^^^^^^^^^^^ +Debian +^^^^^^ .. code-block:: bash apt-get install python-dev libcairo2-dev libffi-dev build-essential +.. note:: This might be outdated + +Ubuntu 18.04 +^^^^^^^^^^^^ +.. code-block:: bash + + apt-get install python-pip libcairo2 + .. _default-installation-layout : Default Installation Layout @@ -104,7 +112,10 @@ Default Installation Layout Graphite traditionally installed all components in ``/opt/graphite``, since release 1.2.0 Graphite's installation location depends on your `Python prefix`_. If you are using `Virtualenv`_ -the ``prefix`` is set to the root of your virtualenv. You can find your ``prefix`` by running: +the ``prefix`` is set to the root of your virtualenv. For more information on custom prefixes +see `Custom Installation Locations`_. See the release notes for :doc:`upgrading ` + +You can find your ``prefix`` by running: .. code-block:: bash @@ -170,9 +181,14 @@ To install Graphite execute: Installing From Source ---------------------- -The latest source tarballs for Graphite-web, Carbon, and Whisper may be fetched from the -Graphite project `download page`_ or the latest development branches may be cloned from -the `Github project page`_: +The latest source releases for Graphite-web, Carbon, and Whisper may be fetched from the +GitHub release pages: + +* `Whisper releases `_ +* `Carbon releases `_ +* `Graphite-web releases `_ + +The latest development branches may be cloned from the `GitHub project page`_: .. code-block:: bash @@ -229,10 +245,6 @@ Post-Install Tasks With data getting into carbon, you probably want to look at graphs of it. So now we turn our attention to the webapp. -:doc:`Using the Composer ` - Now that the webapp is running, you probably want to learn how to use it. - - Windows Users ------------- Unfortunately, native Graphite on Windows is unsupported, but you can run Graphite on Windows in `Docker`_. @@ -263,7 +275,7 @@ Unfortunately, native Graphite on Windows is unsupported, but you can run Graphi .. _Docker: https://www.docker.com/ .. _docker repo: https://github.com/graphite-project/docker-graphite-statsd .. _Virtualenv: http://virtualenv.org/ -.. _Github project page: http://github.com/graphite-project -.. _download page: https://launchpad.net/graphite/+download +.. _GitHub project page: http://github.com/graphite-project .. _pyhash: https://pypi.org/project/pyhash/ .. _Python prefix: https://docs.python.org/3/library/sys.html#sys.prefix +.. _Custom Installation Locations: https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations diff --git a/docs/releases.rst b/docs/releases.rst index 113980efc..4f44d0af8 100644 --- a/docs/releases.rst +++ b/docs/releases.rst @@ -5,6 +5,7 @@ Release Notes :maxdepth: 1 :glob: + releases/1_2_0 releases/1_1_5 releases/1_1_4 releases/1_1_3 diff --git a/docs/releases/1_2_0.rst b/docs/releases/1_2_0.rst new file mode 100644 index 000000000..9abedec89 --- /dev/null +++ b/docs/releases/1_2_0.rst @@ -0,0 +1,132 @@ +.. _1-2-0: + +1.2.0-pre +=========================== +*02/03/2018* + +Graphite 1.2.0-pre is now available for usage. This release changes the installation procedure. +Graphite does not install in ``/opt/graphite`` by default anymore. See the +:ref:`upgrading ` section for migration instructions. + +Main features +------------- +* Removed hardcoded ``/opt/graphite installation`` prefix +* Static files are served by whitenoise by default, no need webserver configuration and ``collectstatic`` anymore +* TODO: + +Thanks a lot for all Graphite contributors and users! You are the best! + +Source bundles are available from GitHub: + +* https://github.com/graphite-project/graphite-web/archive/1.1.5.tar.gz +* https://github.com/graphite-project/carbon/archive/1.1.5.tar.gz +* https://github.com/graphite-project/whisper/archive/1.1.5.tar.gz +* https://github.com/graphite-project/carbonate/archive/1.1.5.tar.gz + +Graphite can also be installed from `PyPI `_ via +`pip `_. PyPI bundles are here: + +* http://pypi.python.org/pypi/graphite-web/ +* http://pypi.python.org/pypi/carbon/ +* http://pypi.python.org/pypi/whisper/ +* http://pypi.python.org/pypi/carbonate/ + +You can also use docker image from https://hub.docker.com/r/graphiteapp/graphite-statsd/ + +.. _upgrading : + +Upgrading +--------- +Create a virtualenv (skip if you already are using one), activate it and install the packages. + +.. code-block:: bash + + virtualenv /opt/graphite + source /opt/graphite/bin/activate + + pip install --upgrade whisper + pip install --upgrade carbon + pip install --upgrade graphite-web + +Then copy your local_settings.py to the new directory. If you don't have a local_settings.py +then you can copy the local_settings.py.example or skip this step. + +.. code-block:: bash + + cp /opt/graphite/webapp/graphite/local_settings.py /opt/graphite/lib/python2.7/site-packages/graphite/local_settings.py + + +Backup and remove old files: + +.. code-block:: bash + + cd /opt/graphite + mkdir backup + mv lib/carbon* lib/twisted/ webapp/ backup/ + +Depending on your webserver you will have to configure your wsgi.py and or webserver config. +Configuration for static files can be removed as they is now served from the application +directly. + +Gunicorn +^^^^^^^^ +Install gunicorn in the virtualenv ``pip install gunicorn`` with the virtualenv activated. +Gunicorn then automatically picks up the virtualenv when run from ``/opt/graphite/bin/gunicorn`` +(no need to activate the virtualenv. + +Apache+mod_wsgi +^^^^^^^^^^^^^^^ +Add ``WSGIPythonHome /opt/graphite`` to your apache httpd config. You can remove +``sys.path.append('/opt/graphite/webapp')`` from your wsgi.conf. + +uWSGI +^^^^^ +Add ``virtualenv = /opt/graphite`` to your ``graphite.ini`` config file. You can remove +``sys.path.append('/opt/graphite/webapp')`` from your wsgi.conf. + +Incompatible changes +-------------------- +Default installation prefix is removed, be careful with upgrading, check if the correct libraries +and configurations are being loaded. + +Security Notes +-------------- +None + +New features +------------ + +Graphite-Web +^^^^^^^^^^^^ +* TODO: + +Carbon +^^^^^^ +* TODO: + +Whisper +^^^^^^^ +* TODO: + +Carbonate +^^^^^^^^^ +* None + +Bug Fixes +--------- + +Graphite-Web +^^^^^^^^^^^^ +* TODO + +Carbon +^^^^^^ +* TODO + +Whisper +^^^^^^^ +* TODO + +Carbonate +^^^^^^^^^ +kA None diff --git a/webapp/graphite/local_settings.py.example b/webapp/graphite/local_settings.py.example index 1967f4dc3..f7062e2fe 100644 --- a/webapp/graphite/local_settings.py.example +++ b/webapp/graphite/local_settings.py.example @@ -99,7 +99,7 @@ DEFAULT_XFILES_FACTOR = 0 # Static Files # ##################################### # -# Graphite servers static files (.html, .css, .js) directly from the +# Graphite serves static files (.html, .css, .js) directly from the # application by using whitenoise. If you want to serve the files from a # webserver instead: # - Uncomment following lines From de040e26341aa2cb7dcd7edcf652e8d42d08b704 Mon Sep 17 00:00:00 2001 From: Piotr Date: Wed, 20 Feb 2019 17:53:10 +0100 Subject: [PATCH 10/12] cleanup setup.py and logger.py --- setup.py | 8 +++----- webapp/graphite/logger.py | 4 +--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/setup.py b/setup.py index b413357ab..ac950f389 100644 --- a/setup.py +++ b/setup.py @@ -1,16 +1,14 @@ #!/usr/bin/env python from glob import glob -from collections import defaultdict from setuptools import setup import os +# Needed to prevent pip from deleting data dirs when uninstalling storage_dirs = [] - -for subdir in ('whisper/dummy.txt', 'ceres/dummy.txt', 'rrd/dummy.txt', - 'log/dummy.txt', 'log/webapp/dummy.txt'): - storage_dirs.append(('storage/%s' % subdir, [])) +for subdir in ('whisper', 'ceres', 'rrd', 'log', 'log/webapp'): + storage_dirs.append(('storage/%s/dummy.txt' % subdir, [])) conf_files = [('conf', glob('conf/*.example'))] examples = [('examples', glob('examples/example-*'))] diff --git a/webapp/graphite/logger.py b/webapp/graphite/logger.py index c4fa9a143..079932dc6 100644 --- a/webapp/graphite/logger.py +++ b/webapp/graphite/logger.py @@ -40,9 +40,7 @@ def _mkdir_p(path): try: os.makedirs(path) except OSError as exc: # Directory already exists - if exc.errno == errno.EEXIST and os.path.isdir(path): - pass - else: + if not (exc.errno == errno.EEXIST and os.path.isdir(path)): raise From e18778dac566426c11e6fe78ae73ced6c274177b Mon Sep 17 00:00:00 2001 From: Piotr Date: Mon, 27 Apr 2020 21:34:33 +0200 Subject: [PATCH 11/12] pin whitenoise < 5 --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 9c7978225..888ecc10f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -48,7 +48,7 @@ cairocffi git+git://github.com/graphite-project/whisper.git#egg=whisper # Ceres is optional # git+git://github.com/graphite-project/ceres.git#egg=ceres -whitenoise +whitenoise<5 scandir urllib3 six diff --git a/setup.py b/setup.py index 208b09f05..fb452f943 100644 --- a/setup.py +++ b/setup.py @@ -59,7 +59,7 @@ def read(fname): install_requires=[ 'Django>=1.8,<3.1', 'django-tagging==0.4.3', 'pytz', 'pyparsing', 'cairocffi', 'urllib3', 'scandir', 'six', - 'whitenoise'], + 'whitenoise<5'], classifiers=[ 'Intended Audience :: Developers', 'Natural Language :: English', From 42cc6d25fb0a5231d60e13efc1d7aaa105b8beaf Mon Sep 17 00:00:00 2001 From: Piotr Date: Sat, 16 May 2020 20:51:37 +0200 Subject: [PATCH 12/12] Keep /opt/graphite as default GRAPHITE_ROOT --- docs/install.rst | 16 ++-------------- webapp/graphite/settings.py | 2 +- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/docs/install.rst b/docs/install.rst index 6183f61c4..fca605014 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -110,20 +110,9 @@ Ubuntu 18.04 Default Installation Layout --------------------------- -Graphite traditionally installed all components in ``/opt/graphite``, since release 1.2.0 -Graphite's installation location depends on your `Python prefix`_. If you are using `Virtualenv`_ -the ``prefix`` is set to the root of your virtualenv. For more information on custom prefixes -see `Custom Installation Locations`_. See the release notes for :doc:`upgrading ` +The default directory layout: -You can find your ``prefix`` by running: - -.. code-block:: bash - - python -c 'import sys; print(sys.prefix)' - -Directory layout: - -- ``PREFIX/`` Usually ``/opt/graphite/`` +- ``GRAPHITE_ROOT`` configurable in local_settings.py, defaults to ``/opt/graphite/`` - ``conf/`` Carbon configuration files @@ -277,5 +266,4 @@ Unfortunately, native Graphite on Windows is unsupported, but you can run Graphi .. _Virtualenv: http://virtualenv.org/ .. _GitHub project page: http://github.com/graphite-project .. _pyhash: https://pypi.org/project/pyhash/ -.. _Python prefix: https://docs.python.org/3/library/sys.html#sys.prefix .. _Custom Installation Locations: https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations diff --git a/webapp/graphite/settings.py b/webapp/graphite/settings.py index 9cfbcc8f7..1791fe090 100644 --- a/webapp/graphite/settings.py +++ b/webapp/graphite/settings.py @@ -36,7 +36,7 @@ # Filesystem layout WEB_DIR = dirname(abspath(__file__)) -GRAPHITE_ROOT = sys.prefix +GRAPHITE_ROOT = '/opt/graphite' # Initialize additional path variables # Defaults for these are set after local_settings is imported STATIC_ROOT = ''