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/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/ceres.rst b/docs/Ceres.rst similarity index 97% rename from docs/ceres.rst rename to docs/Ceres.rst index 1ec57980f..798fc1fb3 100644 --- a/docs/ceres.rst +++ b/docs/Ceres.rst @@ -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 95% rename from docs/faq.rst rename to docs/FAQ.rst index 7dc8c4c85..65342b7b1 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? @@ -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. @@ -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/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/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/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/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..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). @@ -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; } @@ -131,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): @@ -144,6 +181,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 +201,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 +212,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 @@ -234,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: @@ -271,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/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/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 6652f408e..06afabd52 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,21 +6,18 @@ Graphite Documentation :maxdepth: 1 overview - faq + FAQ install carbon-daemons config-carbon feeding-carbon - admin-carbon config-local-settings config-webapp - admin-webapp - composer render_api functions dashboard - whisper - ceres + Whisper + Ceres storage-backends events tags 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-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-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 05f76a84a..fca605014 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,18 +39,18 @@ 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 - 2.2 (for Python3 - 1.11 and newer), 1.11.19 or newer is recommended +* `Django`_ 1.8 - 3.0 (for Python3 - 1.11 and newer), 1.11.19 or newer is recommended * `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`_ - - `gunicorn`_ with `nginx`_ + - `Apache`_ with `mod_wsgi`_ - `uWSGI`_ with `nginx`_ @@ -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,84 +77,136 @@ 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 +^^^^^^ +.. 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 --------------------------- -Graphite defaults to an installation layout that puts the entire install in its own directory: ``/opt/graphite`` +The default directory layout: -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_ROOT`` configurable in local_settings.py, defaults to ``/opt/graphite/`` -Carbon and Graphite-web -^^^^^^^^^^^^^^^^^^^^^^^ -Carbon and Graphite-web are installed in ``/opt/graphite/`` with the following layout: + - ``conf/`` Carbon configuration files -- ``bin/`` -- ``conf/`` -- ``lib/`` + - ``storage/`` - Carbon ``PYTHONPATH`` + - ``log`` Log directory for Carbon and Graphite-web -- ``storage/`` + - ``rrd`` Location for RRD files to be read - - ``log`` + - ``whisper`` Location for Whisper data files to be stored and read - Log directory for Carbon and Graphite-web + - ``ceres`` Location for Ceres data files to be stored and read - - ``rrd`` - Location for RRD files to be read +.. note:: Graphite-web's config file `local_settings.py` is located in the project + :doc:`directory ` - - ``whisper`` +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. - Location for Whisper data files to be stored and read +Create a virtualenv in ``/opt/graphite`` and activate it: - - ``ceres`` +.. code-block:: bash - Location for Ceres data files to be stored and read + virtualenv /opt/graphite + source /opt/graphite/bin/activate -- ``webapp/`` +Once the virtualenv is activated, Graphite and Carbon can be installed the regular way +:ref:`via pip ` or :ref:`from source `. - Graphite-web ``PYTHONPATH`` +.. note:: Before installing dependencies or running Graphite the virtualenv needs to be + activated. Deactivating virtualenv can be done by running ``deactivate``. - - ``graphite/`` +.. _install-pip : - Location of ``local_settings.py`` +Installing From Pip +------------------- - - ``content/`` +Versioned Graphite releases can be installed via `pip`_. When installing with pip, +installation of Python package dependencies will automatically be attempted. - Graphite-web static content directory +To install Graphite execute: +.. code-block:: bash -Installing Graphite -------------------- -Several installation options exist: + pip install whisper + pip install carbon + pip install graphite-web -.. toctree:: - :maxdepth: 2 +.. _install-source : - install-source - install-pip - install-virtualenv - install-synthesize +Installing From Source +---------------------- +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 + + 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 --------------------- .. toctree:: :maxdepth: 2 - - config-database-setup + + config-webapp-setup config-webapp config-local-settings config-carbon @@ -167,9 +227,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. @@ -177,16 +234,9 @@ 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. - - 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 @@ -202,7 +252,7 @@ Unfortunately, native Graphite on Windows is completely unsupported, but you can .. _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 @@ -213,3 +263,7 @@ Unfortunately, native Graphite on Windows is completely unsupported, but you can .. _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 +.. _pyhash: https://pypi.org/project/pyhash/ +.. _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 77f9a8b3f..90af647b2 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_7 releases/1_1_6 releases/1_1_5 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/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 # 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 286af1d79..fb452f943 100644 --- a/setup.py +++ b/setup.py @@ -1,75 +1,16 @@ #!/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 +# Needed to prevent pip from deleting data dirs when uninstalling storage_dirs = [] +for subdir in ('whisper', 'ceres', 'rrd', 'log', 'log/webapp'): + storage_dirs.append(('storage/%s/dummy.txt' % 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) - -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): @@ -77,66 +18,63 @@ def read(fname): 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=[ - 'graphite', - 'graphite.account', - 'graphite.account.migrations', - 'graphite.browser', - 'graphite.composer', - 'graphite.dashboard', - 'graphite.dashboard.migrations', - 'graphite.events', - 'graphite.events.migrations', - 'graphite.finders', - 'graphite.functions', - 'graphite.functions.custom', - 'graphite.metrics', - 'graphite.readers', - 'graphite.render', - 'graphite.tags', - 'graphite.tags.migrations', - 'graphite.url_shortener', - 'graphite.url_shortener.migrations', - '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,<3.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 :: 3.8', - '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) +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', + 'graphite.browser', + 'graphite.composer', + 'graphite.dashboard', + 'graphite.dashboard.migrations', + 'graphite.events', + 'graphite.events.migrations', + 'graphite.finders', + 'graphite.functions', + 'graphite.functions.custom', + 'graphite.metrics', + 'graphite.readers', + 'graphite.render', + 'graphite.tags', + 'graphite.tags.migrations', + 'graphite.url_shortener', + 'graphite.url_shortener.migrations', + 'graphite.version', + 'graphite.whitelist', + 'graphite.worker_pool', + ], + scripts=glob('bin/*'), + include_package_data=True, + data_files=storage_dirs + conf_files + examples, + install_requires=[ + 'Django>=1.8,<3.1', 'django-tagging==0.4.3', 'pytz', + 'pyparsing', 'cairocffi', 'urllib3', 'scandir', 'six', + 'whitenoise<5'], + 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 :: 3.8', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: PyPy', + ], + zip_safe=False +) diff --git a/webapp/graphite/local_settings.py.example b/webapp/graphite/local_settings.py.example index b3057e0c8..1fd149197 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 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 +# - 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 # ##################################### @@ -361,6 +384,7 @@ DEFAULT_XFILES_FACTOR = 0 # This should usually match the value configured in Carbon. #REPLICATION_FACTOR = 1 + ##################################### # TagDB Settings # ##################################### @@ -386,6 +410,7 @@ DEFAULT_XFILES_FACTOR = 0 # Does the remote TagDB support autocomplete? #TAGDB_HTTP_AUTOCOMPLETE = False + ##################################### # Function plugins # ##################################### @@ -393,6 +418,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/logger.py b/webapp/graphite/logger.py index 7b0d54287..7aebbf6d9 100644 --- a/webapp/graphite/logger.py +++ b/webapp/graphite/logger.py @@ -12,12 +12,25 @@ See the License for the specific language governing permissions and limitations under the License.""" +import errno import os import logging + from logging.handlers import TimedRotatingFileHandler as Rotater from logging import NullHandler, 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 not (exc.errno == errno.EEXIST and os.path.isdir(path)): + raise class GraphiteLogger: @@ -63,6 +76,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) @@ -93,4 +114,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 diff --git a/webapp/graphite/settings.py b/webapp/graphite/settings.py index 660dcf020..1791fe090 100644 --- a/webapp/graphite/settings.py +++ b/webapp/graphite/settings.py @@ -35,9 +35,8 @@ DATE_FORMAT = '%m/%d' # Filesystem layout -WEB_DIR = dirname( abspath(__file__) ) -WEBAPP_DIR = dirname(WEB_DIR) -GRAPHITE_ROOT = dirname(WEBAPP_DIR) +WEB_DIR = dirname(abspath(__file__)) +GRAPHITE_ROOT = '/opt/graphite' # Initialize additional path variables # Defaults for these are set after local_settings is imported STATIC_ROOT = '' @@ -232,11 +231,6 @@ if not GRAPHITE_WEB_APP_SETTINGS_LOADED: from graphite.app_settings import * # noqa - -STATICFILES_DIRS = ( - join(WEBAPP_DIR, 'content'), -) - # 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 @@ -244,7 +238,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