mirror of https://github.com/jumpserver/jumpserver
[Bugfix] 修复一些bug
parent
22b7b84a45
commit
3d705dbeaa
|
@ -224,11 +224,14 @@ class SystemUserForm(forms.ModelForm):
|
||||||
password = self.cleaned_data.get('password', None)
|
password = self.cleaned_data.get('password', None)
|
||||||
private_key_file = self.cleaned_data.get('private_key_file')
|
private_key_file = self.cleaned_data.get('private_key_file')
|
||||||
auto_generate_key = self.cleaned_data.get('auto_generate_key')
|
auto_generate_key = self.cleaned_data.get('auto_generate_key')
|
||||||
|
private_key = None
|
||||||
|
public_key = None
|
||||||
|
|
||||||
if auto_generate_key:
|
if auto_generate_key:
|
||||||
logger.info('Auto set system user auth')
|
logger.info('Auto set system user auth')
|
||||||
system_user.auto_gen_auth()
|
system_user.auto_gen_auth()
|
||||||
else:
|
else:
|
||||||
|
if private_key_file:
|
||||||
private_key = private_key_file.read().strip().decode('utf-8')
|
private_key = private_key_file.read().strip().decode('utf-8')
|
||||||
public_key = ssh_pubkey_gen(private_key=private_key)
|
public_key = ssh_pubkey_gen(private_key=private_key)
|
||||||
system_user.set_auth(password=password, private_key=private_key, public_key=public_key)
|
system_user.set_auth(password=password, private_key=private_key, public_key=public_key)
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
<th class="text-center">{% trans 'Hardware' %}</th>
|
<th class="text-center">{% trans 'Hardware' %}</th>
|
||||||
<th class="text-center">{% trans 'Active' %}</th>
|
<th class="text-center">{% trans 'Active' %}</th>
|
||||||
<th class="text-center">{% trans 'Connective' %}</th>
|
<th class="text-center">{% trans 'Connective' %}</th>
|
||||||
|
<th class="text-center">{% trans 'Action' %}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@ -70,12 +71,18 @@ function initTable() {
|
||||||
} else {
|
} else {
|
||||||
$(td).html('<i class="fa fa-circle text-navy"></i>')
|
$(td).html('<i class="fa fa-circle text-navy"></i>')
|
||||||
}
|
}
|
||||||
|
}},
|
||||||
|
{targets: 9, createdCell: function (td, cellData, rowData) {
|
||||||
|
var conn_btn = '<a href="{% url "terminal:web-terminal" %}?id={{ DEFAULT_PK }}" class="btn btn-xs btn-info">{% trans "Connect" %}</a>'.replace("{{ DEFAULT_PK }}", cellData);
|
||||||
|
$(td).html(conn_btn)
|
||||||
}}
|
}}
|
||||||
],
|
],
|
||||||
ajax_url: '{% url "api-assets:asset-list" %}',
|
ajax_url: '{% url "api-assets:asset-list" %}',
|
||||||
columns: [{data: "id"}, {data: "hostname" }, {data: "ip" }, {data: "port" },
|
columns: [
|
||||||
|
{data: "id"}, {data: "hostname" }, {data: "ip" }, {data: "port" },
|
||||||
{data: "get_type_display" }, {data: "get_env_display"}, {data: "hardware_info"},
|
{data: "get_type_display" }, {data: "get_env_display"}, {data: "hardware_info"},
|
||||||
{data: "is_active" }, {data: "is_connective"}],
|
{data: "is_active" }, {data: "is_connective"}, {data: "id"}
|
||||||
|
],
|
||||||
op_html: $('#actions').html()
|
op_html: $('#actions').html()
|
||||||
};
|
};
|
||||||
return jumpserver.initDataTable(options);
|
return jumpserver.initDataTable(options);
|
||||||
|
|
|
@ -15,6 +15,7 @@ urlpatterns = [
|
||||||
url(r'^terminal/(?P<pk>[0-9a-zA-Z\-]{36})/connect/$', views.TerminalConnectView.as_view(), name='terminal-connect'),
|
url(r'^terminal/(?P<pk>[0-9a-zA-Z\-]{36})/connect/$', views.TerminalConnectView.as_view(), name='terminal-connect'),
|
||||||
url(r'^terminal/(?P<pk>[0-9a-zA-Z\-]{36})/update/$', views.TerminalUpdateView.as_view(), name='terminal-update'),
|
url(r'^terminal/(?P<pk>[0-9a-zA-Z\-]{36})/update/$', views.TerminalUpdateView.as_view(), name='terminal-update'),
|
||||||
url(r'^(?P<pk>[0-9a-zA-Z\-]{36})/accept/$', views.TerminalAcceptView.as_view(), name='terminal-accept'),
|
url(r'^(?P<pk>[0-9a-zA-Z\-]{36})/accept/$', views.TerminalAcceptView.as_view(), name='terminal-accept'),
|
||||||
|
url(r'^web-terminal/$', views.WebTerminalView.as_view(), name='web-terminal'),
|
||||||
|
|
||||||
# Session view
|
# Session view
|
||||||
url(r'^session-online/$', views.SessionOnlineListView.as_view(), name='session-online-list'),
|
url(r'^session-online/$', views.SessionOnlineListView.as_view(), name='session-online-list'),
|
||||||
|
|
|
@ -18,8 +18,6 @@ def get_session_system_user_list():
|
||||||
return set(list(Session.objects.values_list('system_user', flat=True)))
|
return set(list(Session.objects.values_list('system_user', flat=True)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_user_list_from_cache():
|
def get_user_list_from_cache():
|
||||||
return cache.get(USERS_CACHE_KEY)
|
return cache.get(USERS_CACHE_KEY)
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
# ~*~ coding: utf-8 ~*~
|
# ~*~ coding: utf-8 ~*~
|
||||||
#
|
#
|
||||||
|
|
||||||
from django.views.generic import ListView, UpdateView, DeleteView, \
|
from django.views.generic import ListView, UpdateView, DeleteView, \
|
||||||
DetailView, TemplateView
|
DetailView, View
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
from django.shortcuts import redirect
|
||||||
from django.urls import reverse_lazy, reverse
|
from django.urls import reverse_lazy, reverse
|
||||||
|
|
||||||
from common.mixins import JSONResponseMixin
|
from common.mixins import JSONResponseMixin
|
||||||
|
@ -16,6 +16,7 @@ from ..hands import AdminUserRequiredMixin
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"TerminalListView", "TerminalUpdateView", "TerminalDetailView",
|
"TerminalListView", "TerminalUpdateView", "TerminalDetailView",
|
||||||
"TerminalDeleteView", "TerminalConnectView", "TerminalAcceptView",
|
"TerminalDeleteView", "TerminalConnectView", "TerminalAcceptView",
|
||||||
|
"WebTerminalView",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -115,3 +116,8 @@ class TerminalConnectView(LoginRequiredMixin, DetailView):
|
||||||
|
|
||||||
kwargs.update(context)
|
kwargs.update(context)
|
||||||
return super(TerminalConnectView, self).get_context_data(**kwargs)
|
return super(TerminalConnectView, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class WebTerminalView(LoginRequiredMixin, View):
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
return redirect('/luna/?' + request.GET.urlencode())
|
||||||
|
|
|
@ -6,6 +6,7 @@ import threading
|
||||||
import time
|
import time
|
||||||
import argparse
|
import argparse
|
||||||
import platform
|
import platform
|
||||||
|
import sys
|
||||||
|
|
||||||
from apps import __version__
|
from apps import __version__
|
||||||
|
|
||||||
|
@ -27,6 +28,7 @@ EXIT_EVENT = threading.Event()
|
||||||
EXIT_MSGS = []
|
EXIT_MSGS = []
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
os.makedirs(os.path.join(BASE_DIR, "data", "static"))
|
os.makedirs(os.path.join(BASE_DIR, "data", "static"))
|
||||||
os.makedirs(os.path.join(BASE_DIR, "data", "media"))
|
os.makedirs(os.path.join(BASE_DIR, "data", "media"))
|
||||||
|
@ -54,9 +56,8 @@ def start_gunicorn():
|
||||||
cmd = "gunicorn jumpserver.wsgi -b {}:{} -w {}".format(HTTP_HOST, HTTP_PORT, WORKERS)
|
cmd = "gunicorn jumpserver.wsgi -b {}:{} -w {}".format(HTTP_HOST, HTTP_PORT, WORKERS)
|
||||||
if DEBUG:
|
if DEBUG:
|
||||||
cmd += " --reload"
|
cmd += " --reload"
|
||||||
subprocess.call(cmd, shell=True)
|
p = subprocess.Popen(cmd, shell=True, stdout=sys.stdout, stderr=sys.stderr)
|
||||||
EXIT_MSGS.append("Gunicorn start failed")
|
return p
|
||||||
EXIT_EVENT.set()
|
|
||||||
|
|
||||||
|
|
||||||
def start_celery():
|
def start_celery():
|
||||||
|
@ -68,16 +69,15 @@ def start_celery():
|
||||||
if platform.platform().startswith("Linux"):
|
if platform.platform().startswith("Linux"):
|
||||||
cmd = """
|
cmd = """
|
||||||
id jumpserver || useradd -s /sbin/nologin jumpserver;
|
id jumpserver || useradd -s /sbin/nologin jumpserver;
|
||||||
su jumpserver -c 'celery -A common worker -l {}'
|
su jumpserver -c 'celery -A common worker -l {}';
|
||||||
""".format(LOG_LEVEL.lower())
|
""".format(LOG_LEVEL.lower())
|
||||||
else:
|
else:
|
||||||
cmd = """
|
cmd = """
|
||||||
export C_FORCE_ROOT=1;celery -A common worker -l {}'
|
export C_FORCE_ROOT=1;celery -A common worker -l {}
|
||||||
""".format(LOG_LEVEL.lower())
|
""".format(LOG_LEVEL.lower())
|
||||||
|
|
||||||
subprocess.call(cmd, shell=True)
|
p = subprocess.Popen(cmd, shell=True, stdout=sys.stdout, stderr=sys.stderr)
|
||||||
EXIT_MSGS.append("Celery start failed")
|
return p
|
||||||
EXIT_EVENT.set()
|
|
||||||
|
|
||||||
|
|
||||||
def start_beat():
|
def start_beat():
|
||||||
|
@ -86,40 +86,44 @@ def start_beat():
|
||||||
os.environ.setdefault('PYTHONOPTIMIZE', '1')
|
os.environ.setdefault('PYTHONOPTIMIZE', '1')
|
||||||
os.environ.setdefault('C_FORCE_ROOT', '1')
|
os.environ.setdefault('C_FORCE_ROOT', '1')
|
||||||
scheduler = "django_celery_beat.schedulers:DatabaseScheduler"
|
scheduler = "django_celery_beat.schedulers:DatabaseScheduler"
|
||||||
cmd = 'celery -A common beat -l {} --scheduler {} --max-interval 5 '.format(LOG_LEVEL, scheduler)
|
cmd = 'celery -A common beat -l {} --scheduler {} --max-interval 60 '.format(LOG_LEVEL, scheduler)
|
||||||
subprocess.call(cmd, shell=True)
|
p = subprocess.Popen(cmd, shell=True, stdout=sys.stdout, stderr=sys.stderr)
|
||||||
EXIT_MSGS.append("Beat start failed")
|
return p
|
||||||
EXIT_EVENT.set()
|
|
||||||
|
|
||||||
|
|
||||||
def start_service(services):
|
def start_service(services):
|
||||||
make_migrations()
|
|
||||||
|
|
||||||
print(time.ctime())
|
print(time.ctime())
|
||||||
print('Jumpserver version {}, more see https://www.jumpserver.org'.format(
|
print('Jumpserver version {}, more see https://www.jumpserver.org'.format(
|
||||||
__version__))
|
__version__))
|
||||||
print('Quit the server with CONTROL-C.')
|
print('Quit the server with CONTROL-C.')
|
||||||
|
|
||||||
threads = []
|
processes = {}
|
||||||
if 'gunicorn' in args.services:
|
services_all = {
|
||||||
threads.append(threading.Thread(target=start_gunicorn, args=()))
|
"gunicorn": start_gunicorn,
|
||||||
if 'celery' in args.services:
|
"celery": start_celery,
|
||||||
threads.append(threading.Thread(target=start_celery, args=()))
|
"beat": start_beat
|
||||||
if 'beat' in args.services:
|
}
|
||||||
threads.append(threading.Thread(target=start_beat, args=()))
|
|
||||||
if 'all' in args.services:
|
|
||||||
_threads = []
|
|
||||||
for func in (start_gunicorn, start_celery, start_beat):
|
|
||||||
t = threading.Thread(target=func, args=())
|
|
||||||
_threads.append(t)
|
|
||||||
threads = _threads
|
|
||||||
|
|
||||||
for t in threads:
|
if 'all' in services:
|
||||||
t.start()
|
for name, func in services_all.items():
|
||||||
|
processes[name] = func()
|
||||||
|
else:
|
||||||
|
for name in services:
|
||||||
|
func = services_all.get(name)
|
||||||
|
processes[name] = func()
|
||||||
|
|
||||||
if EXIT_EVENT.wait():
|
stop_event = threading.Event()
|
||||||
print("\n\n" + "####" * 30)
|
while not stop_event.is_set():
|
||||||
print("\n".join(EXIT_MSGS))
|
for name, proc in processes.items():
|
||||||
|
if proc.poll() is not None:
|
||||||
|
print("\n\n" + "####"*10 + " ERROR OCCUR " + "####"*10)
|
||||||
|
print("Start service {} [FAILED]".format(name))
|
||||||
|
for _, p in processes.items():
|
||||||
|
p.terminate()
|
||||||
|
stop_event.set()
|
||||||
|
print("Exited".format(name))
|
||||||
|
break
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
Loading…
Reference in New Issue