mirror of https://github.com/jumpserver/jumpserver
feat: replay setting page and api
parent
1f3b11a223
commit
459d0668a8
|
@ -9,7 +9,7 @@ from django.core.mail import get_connection, send_mail
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
from .permissions import IsSuperUser
|
from .permissions import IsSuperUser, IsAppUser
|
||||||
from .serializers import MailTestSerializer, LDAPTestSerializer
|
from .serializers import MailTestSerializer, LDAPTestSerializer
|
||||||
|
|
||||||
|
|
||||||
|
@ -102,4 +102,3 @@ class DjangoSettingsAPI(APIView):
|
||||||
if i.isupper():
|
if i.isupper():
|
||||||
configs[i] = str(getattr(settings, i))
|
configs[i] = str(getattr(settings, i))
|
||||||
return Response(configs)
|
return Response(configs)
|
||||||
|
|
||||||
|
|
|
@ -127,7 +127,8 @@ class LDAPSettingForm(BaseForm):
|
||||||
"name": "sn",
|
"name": "sn",
|
||||||
"email": "mail"
|
"email": "mail"
|
||||||
}),
|
}),
|
||||||
help_text=_("User attr map present how to map LDAP user attr to jumpserver, username,name,email is jumpserver attr")
|
help_text=_(
|
||||||
|
"User attr map present how to map LDAP user attr to jumpserver, username,name,email is jumpserver attr")
|
||||||
)
|
)
|
||||||
# AUTH_LDAP_GROUP_SEARCH_OU = CONFIG.AUTH_LDAP_GROUP_SEARCH_OU
|
# AUTH_LDAP_GROUP_SEARCH_OU = CONFIG.AUTH_LDAP_GROUP_SEARCH_OU
|
||||||
# AUTH_LDAP_GROUP_SEARCH_FILTER = CONFIG.AUTH_LDAP_GROUP_SEARCH_FILTER
|
# AUTH_LDAP_GROUP_SEARCH_FILTER = CONFIG.AUTH_LDAP_GROUP_SEARCH_FILTER
|
||||||
|
@ -160,3 +161,10 @@ class TerminalSettingForm(BaseForm):
|
||||||
"You can set other storage and some terminal using"
|
"You can set other storage and some terminal using"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
TERMINAL_REPLAY_STORAGE = DictField(
|
||||||
|
label=_("Replay storage"), help_text=_(
|
||||||
|
"Set replay storage setting, `default` is the using as default,"
|
||||||
|
"You can set other storage and some terminal using"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
|
@ -12,16 +12,20 @@
|
||||||
<div class="panel-options">
|
<div class="panel-options">
|
||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs">
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'settings:basic-setting' %}" class="text-center"><i class="fa fa-cubes"></i> {% trans 'Basic setting' %}</a>
|
<a href="{% url 'settings:basic-setting' %}" class="text-center"><i
|
||||||
|
class="fa fa-cubes"></i> {% trans 'Basic setting' %}</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'settings:email-setting' %}" class="text-center"><i class="fa fa-envelope"></i> {% trans 'Email setting' %} </a>
|
<a href="{% url 'settings:email-setting' %}" class="text-center"><i
|
||||||
|
class="fa fa-envelope"></i> {% trans 'Email setting' %} </a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'settings:ldap-setting' %}" class="text-center"><i class="fa fa-archive"></i> {% trans 'LDAP setting' %} </a>
|
<a href="{% url 'settings:ldap-setting' %}" class="text-center"><i
|
||||||
|
class="fa fa-archive"></i> {% trans 'LDAP setting' %} </a>
|
||||||
</li>
|
</li>
|
||||||
<li class="active">
|
<li class="active">
|
||||||
<a href="{% url 'settings:terminal-setting' %}" class="text-center"><i class="fa fa-hdd-o"></i> {% trans 'Terminal setting' %} </a>
|
<a href="{% url 'settings:terminal-setting' %}" class="text-center"><i
|
||||||
|
class="fa fa-hdd-o"></i> {% trans 'Terminal setting' %} </a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -41,13 +45,14 @@
|
||||||
{% bootstrap_field field layout="horizontal" %}
|
{% bootstrap_field field layout="horizontal" %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="{{ field.id_for_label }}" class="col-sm-2 control-label">{{ field.label }}</label>
|
<label for="{{ field.id_for_label }}"
|
||||||
|
class="col-sm-2 control-label">{{ field.label }}</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<div class="col-sm-1">
|
<div class="col-sm-1">
|
||||||
{{ field }}
|
{{ field }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<span class="help-block" >{{ field.help_text }}</span>
|
<span class="help-block">{{ field.help_text }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -56,7 +61,7 @@
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<h3>{% trans "Command storage" %}</h3>
|
<h3>{% trans "Command storage" %}</h3>
|
||||||
<table class="table table-hover " id="task-history-list-table" >
|
<table class="table table-hover " id="task-history-list-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{% trans 'Name' %}</th>
|
<th>{% trans 'Name' %}</th>
|
||||||
|
@ -72,15 +77,35 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{# <button class="btn btn-default btn-circle btn-add-command-storage" data-toggle="modal" data-target="#add_command_storage_model" tabindex="0" type="button"><i class="fa fa-plus"></i></button>#}
|
{# <button class="btn btn-default btn-circle btn-add-command-storage" data-toggle="modal" data-target="#add_command_storage_model" tabindex="0" type="button"><i class="fa fa-plus"></i></button>#}
|
||||||
{# <div class="hr-line-dashed"></div>#}
|
{# <div class="hr-line-dashed"></div>#}
|
||||||
{# <h3>{% trans "Replay storage" %}</h3>#}
|
{# <h3>{% trans "Replay storage" %}</h3>#}
|
||||||
|
<div class="hr-line-dashed"></div>
|
||||||
|
<h3>{% trans "Replay storage" %}</h3>
|
||||||
|
<table class="table table-hover " id="task-history-list-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans 'Name' %}</th>
|
||||||
|
<th>{% trans 'Type' %}</th>
|
||||||
|
<th>{% trans 'Setting' %}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for name, setting in replay_storage.items %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ name }}</td>
|
||||||
|
<td>{{ setting.TYPE }}</td>
|
||||||
|
<td>{{ setting }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-4 col-sm-offset-2">
|
<div class="col-sm-4 col-sm-offset-2">
|
||||||
<button class="btn btn-default" type="reset"> {% trans 'Reset' %}</button>
|
<button class="btn btn-default" type="reset"> {% trans 'Reset' %}</button>
|
||||||
<button id="submit_button" class="btn btn-primary" type="submit">{% trans 'Submit' %}</button>
|
<button id="submit_button" class="btn btn-primary"
|
||||||
|
type="submit">{% trans 'Submit' %}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -94,10 +119,10 @@
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block custom_foot_js %}
|
{% block custom_foot_js %}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
})
|
})
|
||||||
.on("click", ".btn-test", function () {
|
.on("click", ".btn-test", function () {
|
||||||
var data = {};
|
var data = {};
|
||||||
var form = $("form").serializeArray();
|
var form = $("form").serializeArray();
|
||||||
$.each(form, function (i, field) {
|
$.each(form, function (i, field) {
|
||||||
|
@ -113,6 +138,7 @@ $(document).ready(function () {
|
||||||
function success(message) {
|
function success(message) {
|
||||||
toastr.success(message.msg)
|
toastr.success(message.msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
APIUpdateAttr({
|
APIUpdateAttr({
|
||||||
url: the_url,
|
url: the_url,
|
||||||
body: JSON.stringify(data),
|
body: JSON.stringify(data),
|
||||||
|
@ -121,9 +147,9 @@ $(document).ready(function () {
|
||||||
success: success,
|
success: success,
|
||||||
error: error
|
error: error
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.on('click', '', function () {
|
.on('click', '', function () {
|
||||||
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -97,10 +97,12 @@ class TerminalSettingView(AdminUserRequiredMixin, TemplateView):
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
command_storage = settings.TERMINAL_COMMAND_STORAGE
|
command_storage = settings.TERMINAL_COMMAND_STORAGE
|
||||||
|
replay_storage = settings.TERMINAL_REPLAY_STORAGE
|
||||||
context = {
|
context = {
|
||||||
'app': _('Settings'),
|
'app': _('Settings'),
|
||||||
'action': _('Terminal setting'),
|
'action': _('Terminal setting'),
|
||||||
'form': self.form_class(),
|
'form': self.form_class(),
|
||||||
|
'replay_storage': replay_storage,
|
||||||
'command_storage': command_storage,
|
'command_storage': command_storage,
|
||||||
}
|
}
|
||||||
kwargs.update(context)
|
kwargs.update(context)
|
||||||
|
@ -117,3 +119,4 @@ class TerminalSettingView(AdminUserRequiredMixin, TemplateView):
|
||||||
context = self.get_context_data()
|
context = self.get_context_data()
|
||||||
context.update({"form": form})
|
context.update({"form": form})
|
||||||
return render(request, self.template_name, context)
|
return render(request, self.template_name, context)
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@ import ldap
|
||||||
from django_auth_ldap.config import LDAPSearch
|
from django_auth_ldap.config import LDAPSearch
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
|
|
||||||
|
|
||||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
PROJECT_DIR = os.path.dirname(BASE_DIR)
|
PROJECT_DIR = os.path.dirname(BASE_DIR)
|
||||||
|
@ -39,11 +38,9 @@ SECRET_KEY = CONFIG.SECRET_KEY
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
DEBUG = CONFIG.DEBUG or False
|
DEBUG = CONFIG.DEBUG or False
|
||||||
|
|
||||||
|
|
||||||
# Absolute url for some case, for example email link
|
# Absolute url for some case, for example email link
|
||||||
SITE_URL = CONFIG.SITE_URL or 'http://localhost'
|
SITE_URL = CONFIG.SITE_URL or 'http://localhost'
|
||||||
|
|
||||||
|
|
||||||
# LOG LEVEL
|
# LOG LEVEL
|
||||||
LOG_LEVEL = 'DEBUG' if DEBUG else CONFIG.LOG_LEVEL or 'WARNING'
|
LOG_LEVEL = 'DEBUG' if DEBUG else CONFIG.LOG_LEVEL or 'WARNING'
|
||||||
|
|
||||||
|
@ -114,7 +111,7 @@ LOGIN_URL = reverse_lazy('users:login')
|
||||||
|
|
||||||
SESSION_COOKIE_DOMAIN = CONFIG.SESSION_COOKIE_DOMAIN or None
|
SESSION_COOKIE_DOMAIN = CONFIG.SESSION_COOKIE_DOMAIN or None
|
||||||
CSRF_COOKIE_DOMAIN = CONFIG.CSRF_COOKIE_DOMAIN or None
|
CSRF_COOKIE_DOMAIN = CONFIG.CSRF_COOKIE_DOMAIN or None
|
||||||
SESSION_COOKIE_AGE = CONFIG.SESSION_COOKIE_AGE or 3600*24
|
SESSION_COOKIE_AGE = CONFIG.SESSION_COOKIE_AGE or 3600 * 24
|
||||||
|
|
||||||
MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
|
MESSAGE_STORAGE = 'django.contrib.messages.storage.cookie.CookieStorage'
|
||||||
# Database
|
# Database
|
||||||
|
@ -250,7 +247,6 @@ STATIC_URL = '/static/'
|
||||||
STATIC_ROOT = os.path.join(PROJECT_DIR, "data", "static")
|
STATIC_ROOT = os.path.join(PROJECT_DIR, "data", "static")
|
||||||
STATIC_DIR = os.path.join(BASE_DIR, "static")
|
STATIC_DIR = os.path.join(BASE_DIR, "static")
|
||||||
|
|
||||||
|
|
||||||
STATICFILES_DIRS = (
|
STATICFILES_DIRS = (
|
||||||
os.path.join(BASE_DIR, "static"),
|
os.path.join(BASE_DIR, "static"),
|
||||||
)
|
)
|
||||||
|
@ -265,7 +261,7 @@ MEDIA_ROOT = os.path.join(PROJECT_DIR, 'data', 'media').replace('\\', '/') + '/'
|
||||||
# BOOTSTRAP_COLUMN_COUNT = 11
|
# BOOTSTRAP_COLUMN_COUNT = 11
|
||||||
|
|
||||||
# Init data or generate fake data source for development
|
# Init data or generate fake data source for development
|
||||||
FIXTURE_DIRS = [os.path.join(BASE_DIR, 'fixtures'),]
|
FIXTURE_DIRS = [os.path.join(BASE_DIR, 'fixtures'), ]
|
||||||
|
|
||||||
# Email config
|
# Email config
|
||||||
EMAIL_HOST = CONFIG.EMAIL_HOST
|
EMAIL_HOST = CONFIG.EMAIL_HOST
|
||||||
|
@ -308,7 +304,6 @@ AUTHENTICATION_BACKENDS = [
|
||||||
# Custom User Auth model
|
# Custom User Auth model
|
||||||
AUTH_USER_MODEL = 'users.User'
|
AUTH_USER_MODEL = 'users.User'
|
||||||
|
|
||||||
|
|
||||||
# Auth LDAP settings
|
# Auth LDAP settings
|
||||||
AUTH_LDAP = CONFIG.AUTH_LDAP
|
AUTH_LDAP = CONFIG.AUTH_LDAP
|
||||||
AUTH_LDAP_SERVER_URI = CONFIG.AUTH_LDAP_SERVER_URI
|
AUTH_LDAP_SERVER_URI = CONFIG.AUTH_LDAP_SERVER_URI
|
||||||
|
@ -332,7 +327,6 @@ AUTH_LDAP_BACKEND = 'django_auth_ldap.backend.LDAPBackend'
|
||||||
if AUTH_LDAP:
|
if AUTH_LDAP:
|
||||||
AUTHENTICATION_BACKENDS.insert(0, AUTH_LDAP_BACKEND)
|
AUTHENTICATION_BACKENDS.insert(0, AUTH_LDAP_BACKEND)
|
||||||
|
|
||||||
|
|
||||||
# Celery using redis as broker
|
# Celery using redis as broker
|
||||||
CELERY_BROKER_URL = 'redis://:%(password)s@%(host)s:%(port)s/3' % {
|
CELERY_BROKER_URL = 'redis://:%(password)s@%(host)s:%(port)s/3' % {
|
||||||
'password': CONFIG.REDIS_PASSWORD if CONFIG.REDIS_PASSWORD else '',
|
'password': CONFIG.REDIS_PASSWORD if CONFIG.REDIS_PASSWORD else '',
|
||||||
|
@ -354,7 +348,6 @@ CELERY_REDIRECT_STDOUTS = True
|
||||||
CELERY_REDIRECT_STDOUTS_LEVEL = "INFO"
|
CELERY_REDIRECT_STDOUTS_LEVEL = "INFO"
|
||||||
CELERY_WORKER_HIJACK_ROOT_LOGGER = False
|
CELERY_WORKER_HIJACK_ROOT_LOGGER = False
|
||||||
|
|
||||||
|
|
||||||
# Cache use redis
|
# Cache use redis
|
||||||
CACHES = {
|
CACHES = {
|
||||||
'default': {
|
'default': {
|
||||||
|
@ -387,6 +380,11 @@ TERMINAL_COMMAND_STORAGE = {
|
||||||
# },
|
# },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TERMINAL_REPLAY_STORAGE = {
|
||||||
|
"default": {
|
||||||
|
"TYPE": "server",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
# Django bootstrap3 setting, more see http://django-bootstrap3.readthedocs.io/en/latest/settings.html
|
# Django bootstrap3 setting, more see http://django-bootstrap3.readthedocs.io/en/latest/settings.html
|
||||||
BOOTSTRAP3 = {
|
BOOTSTRAP3 = {
|
||||||
|
|
Loading…
Reference in New Issue