OpenWISP 2 controller module (built using Python and the Django web-framework).
Want to help OpenWISP? Find out how to help us grow here.
Table of Contents:
An automated installer is available at ansible-openwisp2.
- Python >= 3.6
- OpenSSL
Install from pypi:
pip install openwisp-controllerInstall tarball:
pip install https://github.com/openwisp/openwisp-controller/tarball/masterAlternatively you can install via pip using git:
pip install -e git+git://github.com/openwisp/openwisp-controller#egg=openwisp_controllerIf you want to contribute, follow the instructions in Installing for development.
INSTALLED_APPS and EXTENDED_APPS (an internal openwisp2 setting) in settings.py
should look like the following (ordering is important):
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.gis',
# openwisp2 admin theme
# (must be loaded here)
'openwisp_utils.admin_theme',
# all-auth
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
'django_extensions',
# openwisp2 module
'openwisp_controller.config',
'openwisp_controller.pki',
'openwisp_controller.geo',
'openwisp_controller.connection',
'openwisp_users',
# admin
'django.contrib.admin',
# other dependencies
'sortedm2m',
'reversion',
'leaflet',
# rest framework
'rest_framework',
'rest_framework_gis',
# channels
'channels',
]
EXTENDED_APPS = ('django_netjsonconfig', 'django_x509', 'django_loci',)Ensure you are using one of the available geodjango backends, eg:
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.spatialite',
'NAME': 'openwisp-controller.db',
}
}Add openwisp_utils.staticfiles.DependencyFinder to STATICFILES_FINDERS in your settings.py:
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'openwisp_utils.staticfiles.DependencyFinder',
]Add openwisp_utils.loaders.DependencyLoader to template loaders
and openwisp_utils.admin_theme.context_processor.menu_items to
context processors in the TEMPLATES setting of settings.py:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'OPTIONS': {
'loaders': [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
'openwisp_utils.loaders.DependencyLoader',
],
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'openwisp_utils.admin_theme.context_processor.menu_items'
],
},
}
]Add the following settings to settings.py:
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
ASGI_APPLICATION = 'openwisp_controller.geo.channels.routing.channel_routing'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels.layers.InMemoryChannelLayer'
},
}
LOGIN_REDIRECT_URL = 'admin:index'
ACCOUNT_LOGOUT_REDIRECT_URL = LOGIN_REDIRECT_URLurls.py:
from django.conf import settings
from django.conf.urls import include, url
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'', include('openwisp_controller.urls')),
]
urlpatterns += staticfiles_urlpatterns()| type: | tuple |
| default: | (
('openwisp_controller.connection.connectors.ssh.Ssh', 'SSH'),
) |
Available connector classes. Connectors are python classes that specify ways in which OpenWISP can connect to devices in order to launch commands.
| type: | tuple |
| default: | (
('openwisp_controller.connection.connectors.openwrt.ssh.OpenWrt', 'OpenWRT SSH'),
) |
Available update strategies. An update strategy is a subclass of a
connector class which defines an update_config method which is
in charge of updating the configuratio of the device.
This operation is launched in a background worker when the configuration of a device is changed.
It's possible to write custom update strategies and add them to this setting to make them available in OpenWISP.
| type: | dict |
| default: | {
'netjsonconfig.OpenWrt': OPENWISP_UPDATE_STRATEGIES[0][0],
} |
A dictionary that maps configuration backends to update strategies in order to automatically determine the update strategy of a device connection if the update strategy field is left blank by the user.
Install the dependencies:
sudo apt -y install sqlite3 libsqlite3-dev openssl libssl-dev
sudo apt -y install gdal-bin libproj-dev libgeos-dev libspatialite-dev libsqlite3-mod-spatialite
sudo apt -y install redisInstall your forked repo with pipenv:
git clone git://github.com/<your_fork>/openwisp-controller
cd openwisp-controller/
pipenv install --three --dev --skip-lock # skip-lock is faster (optional)
pipenv run install_devCreate database:
cd tests/
pipenv run ./manage.py migrate
pipenv run ./manage.py createsuperuserLaunch celery worker (for background jobs):
celery -A openwisp2 worker -l infoLaunch development server:
pipenv run ./manage.py runserver 0.0.0.0:8000You can access the admin interface at http://127.0.0.1:8000/admin/.
Run tests with:
pipenv run testBuild from the Dockerfile:
docker-compose buildRun the docker container:
docker-compose upYou may encounter some issues while installing GeoDjango.
If you are getting below exception:
django.core.exceptions.ImproperlyConfigured: Unable to load the SpatiaLite library extension
then, You need to specify SPATIALITE_LIBRARY_PATH in your settings.py as explained in
django documentation regarding how to install and configure spatialte.
Please refer troubleshooting issues related to geospatial libraries.
Please read the OpenWISP contributing guidelines and also keep in mind the following:
- Announce your intentions in the OpenWISP Mailing List
- Fork this repo and install it
- Follow PEP8, Style Guide for Python Code
- Write code
- Write tests for your code
- Ensure all tests pass
- Ensure test coverage does not decrease
- Document your changes
- Send pull request
See CHANGES.
See LICENSE.