diff --git a/.gitignore b/.gitignore index 1e7d62fa6..f7543c572 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ migrations/ .idea/ db.sqlite3 config.py +*/migrations/* diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 90b9aa94e..94d3215a6 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -13,7 +13,6 @@ https://docs.djangoproject.com/en/1.10/ref/settings/ import os import sys - # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -22,11 +21,11 @@ sys.path.append(os.path.dirname(BASE_DIR)) # Import project config setting try: from config import config as env_config, env + CONFIG = env_config.get(env, 'default')() except ImportError: CONFIG = type('_', (), {'__getattr__': None})() - # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ @@ -38,13 +37,13 @@ DEBUG = CONFIG.DEBUG or False ALLOWED_HOSTS = CONFIG.ALLOWED_HOSTS or [] - # Application definition INSTALLED_APPS = [ 'users.apps.UsersConfig', 'assets.apps.AssetsConfig', 'perms.apps.PermsConfig', + 'webterminal.apps.WebterminalConfig', 'ops.apps.OpsConfig', 'audits.apps.AuditsConfig', 'common.apps.CommonConfig', @@ -56,6 +55,8 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'ws4redis', + ] MIDDLEWARE = [ @@ -81,6 +82,9 @@ TEMPLATES = [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', + 'django.template.context_processors.static', + 'django.template.context_processors.request', + 'ws4redis.context_processors.default', ], }, }, @@ -88,7 +92,6 @@ TEMPLATES = [ WSGI_APPLICATION = 'jumpserver.wsgi.application' - # Database # https://docs.djangoproject.com/en/1.10/ref/settings/#databases @@ -111,7 +114,6 @@ else: } } - # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators @@ -130,7 +132,6 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] - # Internationalization # https://docs.djangoproject.com/en/1.10/topics/i18n/ @@ -144,7 +145,6 @@ USE_L10N = True USE_TZ = True - # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.10/howto/static-files/ @@ -175,4 +175,27 @@ REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' ], -} \ No newline at end of file +} +# This setting is required to override the Django's main loop, when running in +# development mode, such as ./manage runserver +WSGI_APPLICATION = 'ws4redis.django_runserver.application' + +# URL that distinguishes websocket connections from normal requests +WEBSOCKET_URL = '/ws/' +# WebSocket Redis +WS4REDIS_CONNECTION = { + 'host': '127.0.0.1', + 'port': 6379, + 'db': 2, +} + +# Set the number of seconds each message shall persited +WS4REDIS_EXPIRE = 3600 + +WS4REDIS_HEARTBEAT = 'love you' + +WS4REDIS_PREFIX = 'demo' + +SESSION_ENGINE = 'redis_sessions.session' + +SESSION_REDIS_PREFIX = 'session' diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py index 491c2ad70..c6d525871 100644 --- a/apps/jumpserver/urls.py +++ b/apps/jumpserver/urls.py @@ -17,11 +17,21 @@ from django.conf.urls import url, include from django.conf import settings from django.conf.urls.static import static from django.views.generic.base import TemplateView +from django.http import HttpResponseRedirect + + +def view(request, **kwargs): + if kwargs: + print kwargs + return HttpResponseRedirect('/' + kwargs["module"] + '/' + kwargs["version"] + '/' + kwargs["api"]) + urlpatterns = [ url(r'^$', TemplateView.as_view(template_name='base.html')), url(r'^users/', include('users.urls')), url(r'^assets/', include('assets.urls')), + url(r'^terminal/', include('webterminal.urls')), + url(r'^api/(?P.*)/(?P.*)/(?P.*)', view), # url(r'^admin/', admin.site.urls), ] diff --git a/apps/webterminal/__init__.py b/apps/webterminal/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/webterminal/admin.py b/apps/webterminal/admin.py new file mode 100644 index 000000000..8c38f3f3d --- /dev/null +++ b/apps/webterminal/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/webterminal/apps.py b/apps/webterminal/apps.py new file mode 100644 index 000000000..0e6932f9a --- /dev/null +++ b/apps/webterminal/apps.py @@ -0,0 +1,7 @@ +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class WebterminalConfig(AppConfig): + name = 'webterminal' diff --git a/apps/webterminal/models.py b/apps/webterminal/models.py new file mode 100644 index 000000000..bd4b2abe9 --- /dev/null +++ b/apps/webterminal/models.py @@ -0,0 +1,5 @@ +from __future__ import unicode_literals + +from django.db import models + +# Create your models here. diff --git a/apps/webterminal/templates/main.html b/apps/webterminal/templates/main.html new file mode 100644 index 000000000..0c9dd8e17 --- /dev/null +++ b/apps/webterminal/templates/main.html @@ -0,0 +1,176 @@ +{% extends 'base.html' %} +{% block content %} + +
+
+
+
+
+ + + +
+{% endblock %} + +{% block custom_foot_js %} + + + + +{% endblock %} diff --git a/apps/webterminal/tests.py b/apps/webterminal/tests.py new file mode 100644 index 000000000..7ce503c2d --- /dev/null +++ b/apps/webterminal/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/webterminal/urls.py b/apps/webterminal/urls.py new file mode 100644 index 000000000..b8c6af98a --- /dev/null +++ b/apps/webterminal/urls.py @@ -0,0 +1,11 @@ +# coding:utf-8 +from django.conf.urls import url +from .views import * +from django.contrib import admin +admin.autodiscover() + +app_name = 'webterminal' + +urlpatterns = [ + url(r'^$', TerminalView.as_view(), name='webterminal'), +] \ No newline at end of file diff --git a/apps/webterminal/views.py b/apps/webterminal/views.py new file mode 100644 index 000000000..0f9be9384 --- /dev/null +++ b/apps/webterminal/views.py @@ -0,0 +1,28 @@ +from django.shortcuts import render +from django.urls import reverse_lazy +from django.db.models import Q +from django.views.generic.list import ListView +from django.views.generic.edit import CreateView, DeleteView, UpdateView +from django.views.generic.detail import DetailView +from django.views.generic.base import TemplateView +from django.views import View +from django.http import HttpResponse +from ws4redis.redis_store import RedisMessage +from ws4redis.publisher import RedisPublisher +from django.conf import settings + + +# Create your views here. +class TerminalView(TemplateView): + template_name = 'main.html' + + def get(self, request, *args, **kwargs): + welcome = RedisMessage('Hello everybody') # create a welcome message to be sent to everybody + RedisPublisher(facility='foobar', broadcast=True).publish_message(welcome) + return super(TerminalView, self).get(request, *args, **kwargs) + + def post(self, request, *args, **kwargs): + redis_publisher = RedisPublisher(facility='foobar', groups=[request.POST.get('group')]) + message = RedisMessage(request.POST.get('message')) + redis_publisher.publish_message(message) + return HttpResponse('OK')