diff --git a/.gitignore b/.gitignore index 7f7cccc..846097d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,60 +1,6 @@ -# ---> Python -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ +build/ *.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover - -# Translations -*.mo -*.pot - -# Django stuff: -*.log - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - +*.pyc +._* +*.sqlite3 diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..06763cd --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Florian Neagu - michaelneagu@gmail.com - https://github.com/k3oni/ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..f570f8d --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,4 @@ +include LICENSE.md +include README.rst +recursive-include pydash/static * +recursive-include pydash/templates * diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..caa70f9 --- /dev/null +++ b/README.rst @@ -0,0 +1,162 @@ +pyDash - v1.4.6 +=============== + +A reusable django app for monitoring your linux server. + +Supported Python versions: + +:: + + Python 2.x + Python 3.x + +Requirements: + +:: + + Django >= 1.5 + + +Installation +============ + +Clone the repository to your pc and, assuming that ``pip`` is installed, +run the following commands: + +- ``python setup.py sdist`` +- ``pip install dist/django-pydash-app-*.tar.gz`` + +Make sure that ``django.contrib.auth`` is installed and working. + +Open your project’s ``settings.py`` and add ``pydash`` to +``INSTALLED_APPS``: + +:: + + INSTALLED_APPS = ( + 'pydash', + ) + +Open your project’s ``urls.py`` and include the ``pydash`` urls. + +:: + + urlpatterns = patterns('', + (r'^pydash/', include('pydash.urls')), + ) + +Make sure ``AppDirectoriesFinder`` is enabled in your +``STATICFILES_FINDERS``: + +:: + + STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + ) + +Before deploying to a live server, run the following command in order to +collect the static files stored in pydash’s directory: + +:: + + $ python manage.py collectstatic + +Settings +======== + +There are 3 different refresh settings which are measured in +``miliseconds``: + +:: + + TIME_JS_REFRESH = 30000 #30 seconds + TIME_JS_REFRESH_LONG = 120000 #120 seconds + TIME_JS_REFRESH_NET = 2000 #2 seconds + +If you wish to override the default settings, simply set those fields +with the new values in your application’s ``settings.py`` file. + +The refresh settings for each table are as follows: + +:: + + Memory Usage - TIME_JS_REFRESH + Load Average - TIME_JS_REFRESH + CPU Usage - TIME_JS_REFRESH + Traffic Usage - TIME_JS_REFRESH_NET + Disk Reads/Writes - TIME_JS_REFRESH_NET + Uptime - TIME_JS_REFRESH_LONG + Disk Usage - TIME_JS_REFRESH_LONG + Online Users - TIME_JS_REFRESH_LONG + Processes - TIME_JS_REFRESH_LONG + Netstat - TIME_JS_REFRESH_LONG + +Remote data retrieval +===================== + +pyDash allows you to retrieve data remotely. + +Data is returned in JSON and can be easily retrieved as long as the user +agent has been authenticated by the web application. + +pyDash has a list of short URLs which you can use to retrieve the +specific data: + +:: + + /info/uptime/ - Uptime + /info/platform/hostname/ - Hostname + /info/platform/osname/ - OS Name + /info/platform/kernel/ - Kernel + /info/getcpus/cpucount/ - Number of CPU cores + /info/getcpus/cputype/ - Type/Name of CPU + /info/memory/ - Memory Usage + /info/cpuusage/ - CPU Usage in percentage(%), free and used + /info/getdisk/ - Disk Usage + /info/getusers/ - Online Users + /info/getips/ - IP Addresses + /info/gettraffic/ - Internet Traffic + /info/getdiskio/ - Disk Reads/Writes + /info/proc/ - Running Processes + /info/loadaverage/ - Load Average + /info/getnetstat/ - Netstat + +To see the format of the JSON returned datasets or data you can access any of the URLs from your browser +as http://youpydaship/url , ex. http://demo.pydash.net/info/uptime/ . + +OS Support +========== + +pyDash was tested and runs under the following OSes: + +:: + +- Centos +- Fedora +- Ubuntu +- Debian +- Raspbian +- Pidora +- Arch Linux + +It might work under others, but it hasn’t been tested yet. + +Contributors +============ + +George Zografos - george.p.zografos@gmail.com + +License +======= + +`MIT `_ + +Issues +====== + +Report any issues/bugs at `https://github.com/k3oni/pydash-django-app `_ + +Credits +======= + +`Dashboard Template `_, `Bootstrap `_, `Font Awesome `_ diff --git a/example/example/__init__.py b/example/example/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/example/example/settings.py b/example/example/settings.py new file mode 100644 index 0000000..de5a709 --- /dev/null +++ b/example/example/settings.py @@ -0,0 +1,135 @@ +""" +Django settings for pydash project. + +For more information on this file, see +https://docs.djangoproject.com/en/1.6/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.6/ref/settings/ +""" + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os + +BASE_DIR = os.path.dirname(os.path.dirname(__file__)) + +# SITE_ID = 1 + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '1)$crmowu-23tz@i2-d=7tb3t+1u&(pm!lnjyuarki^72h!3af' +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +TEMPLATE_DEBUG = True + +ADMINS = ( +) + +MANAGERS = ADMINS + + +ALLOWED_HOSTS = ['*'] + +# Application definition + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + # Add pydash here + 'pydash' +) + +MIDDLEWARE_CLASSES = ( + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + # 'django.middleware.clickjacking.XFrameOptionsMiddleware', +) + +ROOT_URLCONF = 'example.urls' + +WSGI_APPLICATION = 'example.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.6/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3') + } +} + +# Internationalization +# https://docs.djangoproject.com/en/1.6/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + # 'django.template.loaders.eggs.Loader', +) + +TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'templates'),) + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.6/howto/static-files/ + +STATIC_ROOT = os.path.join(os.path.dirname(__file__), '..', 'static') +STATIC_URL = '/static/' + +STATICFILES_DIRS = ( +) + +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + #'django.contrib.staticfiles.finders.DefaultStorageFinder', +) + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} + +try: + from local_settings import * +except ImportError: + pass diff --git a/example/example/urls.py b/example/example/urls.py new file mode 100644 index 0000000..a808d4b --- /dev/null +++ b/example/example/urls.py @@ -0,0 +1,4 @@ +from django.conf.urls import patterns, include, url + +urlpatterns = patterns('', + url(r'^pydash/', include('pydash.urls'))) diff --git a/example/example/wsgi.py b/example/example/wsgi.py new file mode 100644 index 0000000..2cc360a --- /dev/null +++ b/example/example/wsgi.py @@ -0,0 +1,14 @@ +""" +WSGI config for example project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ +""" + +import os +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings") + +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() diff --git a/example/manage.py b/example/manage.py new file mode 100644 index 0000000..2605e37 --- /dev/null +++ b/example/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/example/pydash b/example/pydash new file mode 120000 index 0000000..37111fb --- /dev/null +++ b/example/pydash @@ -0,0 +1 @@ +../pydash \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f61efdb --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +django>=1.5 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..10a91d0 --- /dev/null +++ b/setup.py @@ -0,0 +1,39 @@ +import os +from setuptools import setup + +README = open(os.path.join(os.path.dirname(__file__), 'README.rst')).read() + +# allow setup.py to be run from any path +os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) + +setup( + name='django-pydash-app', + version='1.4.6', + packages=['pydash'], + include_package_data=True, + license='MIT', + description='A reusable django app for monitoring your linux server.', + long_description=README, + url='https://github.com/k3oni/pydash-django-app', + author='Florian N.', + author_email='michaelneagu@gmail.com', + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Environment :: Web Environment', + 'Framework :: Django', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: MIT License', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.0', + 'Programming Language :: Python :: 3.1', + 'Programming Language :: Python :: 3.2', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Topic :: Internet :: WWW/HTTP', + 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', + ], +)