From c50cdd29768c03a84d6d7b53e6d3cef59c884a5e Mon Sep 17 00:00:00 2001 From: liuzheng712 Date: Mon, 22 Aug 2016 23:53:14 +0800 Subject: [PATCH 1/3] add webterminal --- .gitignore | 1 + apps/webterminal/__init__.py | 0 apps/webterminal/admin.py | 3 +++ apps/webterminal/apps.py | 7 +++++++ apps/webterminal/models.py | 5 +++++ apps/webterminal/tests.py | 3 +++ apps/webterminal/views.py | 3 +++ 7 files changed, 22 insertions(+) create mode 100644 apps/webterminal/__init__.py create mode 100644 apps/webterminal/admin.py create mode 100644 apps/webterminal/apps.py create mode 100644 apps/webterminal/models.py create mode 100644 apps/webterminal/tests.py create mode 100644 apps/webterminal/views.py 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/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/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/views.py b/apps/webterminal/views.py new file mode 100644 index 000000000..91ea44a21 --- /dev/null +++ b/apps/webterminal/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. From 91f0800e269da5e26628259e5fef786b90f413a9 Mon Sep 17 00:00:00 2001 From: liuzheng712 Date: Tue, 23 Aug 2016 22:34:52 +0800 Subject: [PATCH 2/3] add webterminal --- apps/jumpserver/settings.py | 40 ++++-- apps/jumpserver/urls.py | 1 + apps/webterminal/templates/main.html | 176 +++++++++++++++++++++++++++ apps/webterminal/urls.py | 11 ++ apps/webterminal/views.py | 25 ++++ 5 files changed, 245 insertions(+), 8 deletions(-) create mode 100644 apps/webterminal/templates/main.html create mode 100644 apps/webterminal/urls.py diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 8b69953ee..00be039e1 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', @@ -55,6 +54,8 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'ws4redis', + ] MIDDLEWARE = [ @@ -80,6 +81,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', ], }, }, @@ -87,7 +91,6 @@ TEMPLATES = [ WSGI_APPLICATION = 'jumpserver.wsgi.application' - # Database # https://docs.djangoproject.com/en/1.10/ref/settings/#databases @@ -110,7 +113,6 @@ else: } } - # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators @@ -129,7 +131,6 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] - # Internationalization # https://docs.djangoproject.com/en/1.10/topics/i18n/ @@ -143,7 +144,6 @@ USE_L10N = True USE_TZ = True - # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.10/howto/static-files/ @@ -166,4 +166,28 @@ AUTH_USER_MODEL = 'users.User' BOOTSTRAP_COLUMN_COUNT = 11 # Init data or generate fake data source for development -FIXTURE_DIRS = [os.path.join(BASE_DIR, 'fixtures'), ] \ No newline at end of file +FIXTURE_DIRS = [os.path.join(BASE_DIR, 'fixtures'), ] + +# 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' \ No newline at end of file diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py index a362f54d6..f4053c74a 100644 --- a/apps/jumpserver/urls.py +++ b/apps/jumpserver/urls.py @@ -22,6 +22,7 @@ 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'^admin/', admin.site.urls), ] 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/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 index 91ea44a21..0f9be9384 100644 --- a/apps/webterminal/views.py +++ b/apps/webterminal/views.py @@ -1,3 +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') From 400d744938d326a874e4d86352534e23e259ba33 Mon Sep 17 00:00:00 2001 From: liuzheng712 Date: Tue, 23 Aug 2016 23:29:33 +0800 Subject: [PATCH 3/3] add api redirect --- apps/jumpserver/urls.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py index f4053c74a..1e39950c7 100644 --- a/apps/jumpserver/urls.py +++ b/apps/jumpserver/urls.py @@ -17,12 +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), ]