Skip to main content

A Django Admin Shell

Project description

Django Admin Shell

A Django Web Shell using Xterm.js and Django Channels.

Note: This package depends on websockets therefore you'll need to use an ASGI application to use it. If you are not using Django channels then read through the official Channels' documentation on installing Channels, also see the Channels' documentation on running ASGI applications.

Demo

GIF The demo is from Django.wtf's admin.

Features

  • Fully responsive terminal using Xterm.js.
  • Accessible through the admin.
  • Authentication with Django auth, configurable to allow only superusers.
  • The commands written are tied to a user.
  • Saves command in a new model and create favorite commands.
  • Filterable command history.
  • LogEntry of all commands ran.
  • Custom admin site to add Terminal links to the admin.
  • Full screen mode.
  • Working autocomplete.

Installation

Install the package using pip:

pip install django-admin-shellx

Add django_admin_shellx to your INSTALLED_APPS:

INSTALLED_APPS = [
    # ...
    'django_admin_shellx',
    # ...
]

The package uses websockets for real-time communication between a pseudo-shell on the server and Xterm.js in the browser. Django doesn't handle websockets natively, so we have to deploy a second WSGI server for this purpose.

We will have to add an ASGI configuration file for the websocket server:

import os

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application

# Follows the path of cookiecutter-django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")

# The ASGI application
django_application = get_asgi_application()

# Remember to import the urlpatters after the asgi application!
# pylint: disable=wrong-import-position
from django_admin_shellx.urls import websocket_urlpatterns

application = ProtocolTypeRouter(
    {
        "websocket": AllowedHostsOriginValidator(
            AuthMiddlewareStack(URLRouter(websocket_urlpatterns))
        ),
    }
)

When running the server in production you'll have:

  1. A Django server which serves all of your traditional HTTP traffic (wsgi.py).
  2. A Websocket server which serves the terminal traffic (asgi.py).
  3. A reverse proxy which routes traditional traffic to the HTTP server and all websocket traffic (prefixed with /ws) to your websocket server.

To start the traditional server you'll use Gunicorn as usual.

To start the websocket server you use Daphne.

daphne config.asgi:application -b 0.0.0.0 -p 80

Lastly, we'll need to use a custom admin site to add a link to the terminal, add the following to your INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    "django_admin_shellx",
    "django_admin_shellx_custom_admin.apps.CustomAdminConfig",
]

Ensure to remove the default admin app from the INSTALLED_APPS if you are using the custom admin site.

INSTALLED_APPS = [
    ...
    # 'django.contrib.admin',
    ...
]

The above is optional and only adds a view button to the admin that links to the terminal. Otherwise, there will not be a link since it's not a model and can not be added to the admin. The terminal will either be accessible through the path /admin/django_admin_shellx/terminalcommand/terminal/ and if you use the custom admin site, it will be accessible through a link in the admin.

Usage

Head over to the admin and click on the Terminal link. You'll be presented with a terminal that you can use to run commands. The default commands are ./manage.py shell_plus, ./manage.py shell and /bin/bash. You can change the default commands by setting the DJANGO_ADMIN_SHELLX_COMMAND setting.

Each command is saved in the database and can be accessed through the admin. You can also add new commands through the admin and favorite existing commands. Each command ran is also saved as a LogEntry.

Settings

Name Description Type Default Required
DJANGO_ADMIN_SHELLX_SUPERUSER_ONLY Only allow superusers to access the admin shellx. boolean True no
DJANGO_ADMIN_SHELLX_COMMANDS The default commands to use when opening the terminal. list[list[str]] [["./manage.py", "shell_plus"], ["./manage.py", "shell"], ["/bin/bash"]] no
DJANGO_ADMIN_SHELLX_WS_PORT The port to use for the websocket. int None no

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_admin_shellx-0.3.1.tar.gz (98.9 kB view details)

Uploaded Source

Built Distribution

django_admin_shellx-0.3.1-py3-none-any.whl (101.1 kB view details)

Uploaded Python 3

File details

Details for the file django_admin_shellx-0.3.1.tar.gz.

File metadata

  • Download URL: django_admin_shellx-0.3.1.tar.gz
  • Upload date:
  • Size: 98.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for django_admin_shellx-0.3.1.tar.gz
Algorithm Hash digest
SHA256 976f822eb988b02236acd585601e909a5f48b6806ee53586287ddff626f19ab0
MD5 7782cfddbb069ec5ca28e752f27497e2
BLAKE2b-256 e7545dc907f92f400b0977e7ab6dad291c2026c77cec8d1b96e9abc3ae1d1b12

See more details on using hashes here.

File details

Details for the file django_admin_shellx-0.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for django_admin_shellx-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5ebec39269577c1cd531ae8c8f7b57a77040e61fa34a649a5276f1401748356f
MD5 6c7904c4bc24e678a85ce65d710aca84
BLAKE2b-256 92544a1b70563e14d516f6728ee6f87ac9ae631e616929d45458be65f694ec56

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page