mirror of https://github.com/jumpserver/jumpserver
hehe
commit
3842f7795b
|
@ -7,9 +7,7 @@ from django.template import RequestContext
|
|||
from django.shortcuts import render_to_response
|
||||
|
||||
from jasset.models import IDC, Asset, BisGroup, AssetAlias
|
||||
from juser.models import UserGroup, DEPT
|
||||
from jperm.models import Perm, SudoPerm
|
||||
from jumpserver.views import pages
|
||||
from jumpserver.api import *
|
||||
|
||||
cryptor = PyCrypt(KEY)
|
||||
|
|
|
@ -10,6 +10,7 @@ from binascii import b2a_hex, a2b_hex
|
|||
import ldap
|
||||
from ldap import modlist
|
||||
import hashlib
|
||||
import datetime
|
||||
from django.core.paginator import Paginator, EmptyPage, InvalidPage
|
||||
from django.http import HttpResponse, Http404
|
||||
from juser.models import User, UserGroup, DEPT
|
||||
|
@ -289,6 +290,7 @@ def user_perm_asset_api(username):
|
|||
asset_list.extend(asset_group.asset_set.all())
|
||||
|
||||
return asset_list
|
||||
return []
|
||||
|
||||
|
||||
def asset_perm_api(asset):
|
||||
|
@ -359,4 +361,4 @@ def validate(request, user_group=None, user=None, asset_group=None, asset=None,
|
|||
|
||||
def get_dept_asset(request):
|
||||
dept_id = get_user_dept(request)
|
||||
dept_asset = DEPT.objects.get(id=dept_id).asset_set.all()
|
||||
dept_asset = DEPT.objects.get(id=dept_id).asset_set.all()
|
||||
|
|
|
@ -2,6 +2,7 @@ from juser.models import User
|
|||
from jasset.models import Asset
|
||||
from jumpserver.api import *
|
||||
|
||||
|
||||
def name_proc(request):
|
||||
user_id = request.session.get('user_id')
|
||||
role_id = request.session.get('role_id')
|
||||
|
|
|
@ -57,7 +57,7 @@ def groups_str2(group_list):
|
|||
|
||||
|
||||
@register.filter(name='group_str2_all')
|
||||
def groups_str2(group_list):
|
||||
def group_str2_all(group_list):
|
||||
group_lis = []
|
||||
for i in group_list:
|
||||
if str(i) != 'ALL':
|
||||
|
@ -107,6 +107,12 @@ def member_count(group_id):
|
|||
return group.user_set.count()
|
||||
|
||||
|
||||
@register.filter(name='group_user_count')
|
||||
def group_user_count(group_id):
|
||||
group = UserGroup.objects.get(id=group_id)
|
||||
return group.user_set.count()
|
||||
|
||||
|
||||
@register.filter(name='dept_user_num')
|
||||
def dept_user_num(dept_id):
|
||||
dept = DEPT.objects.filter(id=dept_id)
|
||||
|
@ -230,3 +236,31 @@ def to_avatar(role_id='0'):
|
|||
@register.filter(name='get_user_asset_group')
|
||||
def get_user_asset_group(user):
|
||||
return user_perm_group_api(user)
|
||||
|
||||
|
||||
@register.filter(name='group_asset_list')
|
||||
def group_asset_list(group):
|
||||
return group.asset_set.all()
|
||||
|
||||
|
||||
@register.filter(name='group_asset_list_count')
|
||||
def group_asset_list_count(group):
|
||||
return group.asset_set.all().count()
|
||||
|
||||
|
||||
@register.filter(name='time_delta')
|
||||
def time_delta(time_before):
|
||||
delta = datetime.datetime.now() - time_before
|
||||
days = delta.days
|
||||
if days:
|
||||
return "%s 天前" % days
|
||||
else:
|
||||
hours = delta.seconds/3600
|
||||
if hours:
|
||||
return "%s 小时前" % hours
|
||||
else:
|
||||
mins = delta.seconds/60
|
||||
if mins:
|
||||
return '%s 分钟前' % mins
|
||||
else:
|
||||
return '%s 秒前' % delta.seconds
|
||||
|
|
|
@ -15,9 +15,12 @@ urlpatterns = patterns('',
|
|||
(r'^base/$', 'jumpserver.views.base'),
|
||||
(r'^login/$', 'jumpserver.views.login'),
|
||||
(r'^logout/$', 'jumpserver.views.logout'),
|
||||
(r'^upload/$', 'jumpserver.views.upload'),
|
||||
(r'^download/$', 'jumpserver.views.download'),
|
||||
(r'^juser/', include('juser.urls')),
|
||||
(r'^jasset/', include('jasset.urls')),
|
||||
(r'^jlog/', include('jlog.urls')),
|
||||
(r'^jperm/', include('jperm.urls')),
|
||||
|
||||
|
||||
)
|
||||
|
|
|
@ -45,78 +45,37 @@ def get_data(data, items, option):
|
|||
return dic
|
||||
|
||||
|
||||
@require_login
|
||||
def index(request):
|
||||
users = User.objects.all()
|
||||
hosts = Asset.objects.all()
|
||||
online = Log.objects.filter(is_finished=0)
|
||||
online_host = online.values('host').distinct()
|
||||
online_user = online.values('user').distinct()
|
||||
active_users = User.objects.filter(is_active=1)
|
||||
active_hosts = Asset.objects.filter(is_active=1)
|
||||
|
||||
# percent of dashboard
|
||||
percent_user = format(active_users.count() / users.count(), '.0%')
|
||||
percent_host = format(active_hosts.count() / hosts.count(), '.0%')
|
||||
percent_online_user = format(online_user.count() / users.count(), '.0%')
|
||||
percent_online_host = format(online_host.count() / hosts.count(), '.0%')
|
||||
|
||||
li_date, li_str = getDaysByNum(7)
|
||||
today = datetime.datetime.now().day
|
||||
from_week = datetime.datetime.now() - datetime.timedelta(days=7)
|
||||
week_data = Log.objects.filter(start_time__range=[from_week, datetime.datetime.now()])
|
||||
user_top_ten = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:10]
|
||||
host_top_ten = week_data.values('host').annotate(times=Count('host')).order_by('-times')[:10]
|
||||
user_dic, host_dic = get_data(week_data, user_top_ten, 'user'), get_data(week_data, host_top_ten, 'host')
|
||||
|
||||
# a week data
|
||||
week_users = week_data.values('user').distinct().count()
|
||||
week_hosts = week_data.count()
|
||||
|
||||
user_top_five = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:5]
|
||||
color = ['label-success', 'label-info', 'label-primary', 'label-default', 'label-warnning']
|
||||
|
||||
# perm apply latest 10
|
||||
perm_apply_10 = Apply.objects.order_by('-date_add')[:10]
|
||||
|
||||
# latest 10 login
|
||||
login_10 = Log.objects.order_by('-start_time')[:10]
|
||||
|
||||
# a week top 10
|
||||
for user_info in user_top_ten:
|
||||
username = user_info.get('user')
|
||||
last = Log.objects.filter(user=username).latest('start_time')
|
||||
user_info['last'] = last
|
||||
print user_top_ten
|
||||
|
||||
top = {'user': '活跃用户数', 'host': '活跃主机数', 'times': '登录次数'}
|
||||
top_dic = {}
|
||||
for key, value in top.items():
|
||||
li = []
|
||||
for t in li_date:
|
||||
year, month, day = t.year, t.month, t.day
|
||||
if key != 'times':
|
||||
times = week_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).values(key).distinct().count()
|
||||
else:
|
||||
times = week_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).count()
|
||||
li.append(times)
|
||||
top_dic[value] = li
|
||||
return render_to_response('index.html', locals(), context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@require_admin
|
||||
def admin_index(request):
|
||||
user_id = request.session.get('user_id', '')
|
||||
user = User.objects.get(id=user_id)
|
||||
dept = user.dept
|
||||
dept_name = user.dept.name
|
||||
users = User.objects.filter(dept=dept)
|
||||
hosts = Asset.objects.filter(dept=dept)
|
||||
online = Log.objects.filter(dept_name=dept_name, is_finished=0)
|
||||
online_host = online.values('host').distinct()
|
||||
online_user = online.values('user').distinct()
|
||||
active_users = users.filter(is_active=1)
|
||||
active_hosts = hosts.filter(is_active=1)
|
||||
def index(request):
|
||||
li_date, li_str = getDaysByNum(7)
|
||||
today = datetime.datetime.now().day
|
||||
from_week = datetime.datetime.now() - datetime.timedelta(days=7)
|
||||
if is_super_user(request):
|
||||
users = User.objects.all()
|
||||
hosts = Asset.objects.all()
|
||||
online = Log.objects.filter(is_finished=0)
|
||||
online_host = online.values('host').distinct()
|
||||
online_user = online.values('user').distinct()
|
||||
active_users = User.objects.filter(is_active=1)
|
||||
active_hosts = Asset.objects.filter(is_active=1)
|
||||
week_data = Log.objects.filter(start_time__range=[from_week, datetime.datetime.now()])
|
||||
elif is_group_admin(request):
|
||||
user_id = request.session.get('user_id', '')
|
||||
user = User.objects.get(id=user_id)
|
||||
dept = user.dept
|
||||
dept_name = user.dept.name
|
||||
users = User.objects.filter(dept=dept)
|
||||
hosts = Asset.objects.filter(dept=dept)
|
||||
online = Log.objects.filter(dept_name=dept_name, is_finished=0)
|
||||
online_host = online.values('host').distinct()
|
||||
online_user = online.values('user').distinct()
|
||||
active_users = users.filter(is_active=1)
|
||||
active_hosts = hosts.filter(is_active=1)
|
||||
week_data = Log.objects.filter(dept_name=dept_name, start_time__range=[from_week, datetime.datetime.now()])
|
||||
|
||||
user_top_ten = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:10]
|
||||
host_top_ten = week_data.values('host').annotate(times=Count('host')).order_by('-times')[:10]
|
||||
user_dic, host_dic = get_data(week_data, user_top_ten, 'user'), get_data(week_data, host_top_ten, 'host')
|
||||
|
||||
# percent of dashboard
|
||||
percent_user = format(active_users.count() / users.count(), '.0%')
|
||||
|
@ -124,14 +83,6 @@ def admin_index(request):
|
|||
percent_online_user = format(online_user.count() / users.count(), '.0%')
|
||||
percent_online_host = format(online_host.count() / hosts.count(), '.0%')
|
||||
|
||||
li_date, li_str = getDaysByNum(7)
|
||||
today = datetime.datetime.now().day
|
||||
from_week = datetime.datetime.now() - datetime.timedelta(days=7)
|
||||
week_data = Log.objects.filter(dept_name=dept_name, start_time__range=[from_week, datetime.datetime.now()])
|
||||
user_top_ten = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:10]
|
||||
host_top_ten = week_data.values('host').annotate(times=Count('host')).order_by('-times')[:10]
|
||||
user_dic, host_dic = get_data(week_data, user_top_ten, 'user'), get_data(week_data, host_top_ten, 'host')
|
||||
|
||||
# a week data
|
||||
week_users = week_data.values('user').distinct().count()
|
||||
week_hosts = week_data.count()
|
||||
|
|
|
@ -29,4 +29,5 @@ urlpatterns = patterns('juser.views',
|
|||
(r'^profile/$', 'profile'),
|
||||
(r'^chg_info/$', 'chg_info'),
|
||||
(r'^chg_role/$', 'chg_role'),
|
||||
(r'^down_key/$', 'down_key'),
|
||||
)
|
||||
|
|
|
@ -6,7 +6,6 @@ import random
|
|||
import subprocess
|
||||
from Crypto.PublicKey import RSA
|
||||
import crypt
|
||||
import datetime
|
||||
|
||||
from django.shortcuts import render_to_response
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
|
@ -32,9 +31,10 @@ def bash(cmd):
|
|||
return subprocess.call(cmd, shell=True)
|
||||
|
||||
|
||||
def is_dir(dir_name, mode=0755):
|
||||
def is_dir(dir_name, username='root', mode=0755):
|
||||
if not os.path.isdir(dir_name):
|
||||
os.makedirs(dir_name)
|
||||
bash("chown %s:%s '%s'" % (username, username, dir_name))
|
||||
os.chmod(dir_name, mode)
|
||||
|
||||
|
||||
|
@ -109,11 +109,11 @@ def db_del_user(username):
|
|||
|
||||
def gen_ssh_key(username, password=None, length=2048):
|
||||
private_key_dir = os.path.join(BASE_DIR, 'keys/jumpserver/')
|
||||
private_key_file = os.path.join(private_key_dir, username)
|
||||
private_key_file = os.path.join(private_key_dir, username+".pem")
|
||||
public_key_dir = '/home/%s/.ssh/' % username
|
||||
public_key_file = os.path.join(public_key_dir, 'authorized_keys')
|
||||
is_dir(private_key_dir)
|
||||
is_dir(public_key_dir, mode=0700)
|
||||
is_dir(public_key_dir, username, mode=0700)
|
||||
|
||||
key = RSA.generate(length)
|
||||
with open(private_key_file, 'w') as pri_f:
|
||||
|
@ -128,7 +128,7 @@ def gen_ssh_key(username, password=None, length=2048):
|
|||
|
||||
|
||||
def server_add_user(username, password, ssh_key_pwd):
|
||||
bash('useradd %s; echo %s | passwd --stdin %s' % (username, password, username))
|
||||
bash("useradd '%s'; echo '%s' | passwd --stdin '%s'" % (username, password, username))
|
||||
gen_ssh_key(username, ssh_key_pwd)
|
||||
|
||||
|
||||
|
@ -775,18 +775,26 @@ def user_list_adm(request):
|
|||
return render_to_response('juser/user_list.html', locals(), context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@require_admin
|
||||
@require_login
|
||||
def user_detail(request):
|
||||
user_id = request.GET.get('id', '')
|
||||
header_title, path1, path2 = '查看用户', '用户管理', '用户详情'
|
||||
if request.session.get('role_id') == 0:
|
||||
user_id = request.session.get('user_id')
|
||||
else:
|
||||
user_id = request.GET.get('id', '')
|
||||
if request.session.get('role_id') == 1:
|
||||
user, dept = get_session_user_dept(request)
|
||||
if not validate(request, user=[user_id]):
|
||||
return HttpResponseRedirect('/')
|
||||
if not user_id:
|
||||
return HttpResponseRedirect('/juser/user_list/')
|
||||
if request.session.get('role_id', '') == '1':
|
||||
if not validate(request, user=[user_id]):
|
||||
return HttpResponseRedirect('/juser/user_list/')
|
||||
|
||||
user = User.objects.filter(id=user_id)
|
||||
if user:
|
||||
user = user[0]
|
||||
asset_group_permed = user_perm_group_api(user)
|
||||
logs_last = Log.objects.filter(user=user.name).order_by('-start_time')[0:10]
|
||||
logs_all = Log.objects.filter(user=user.name).order_by('-start_time')
|
||||
|
||||
return render_to_response('juser/user_detail.html', locals(), context_instance=RequestContext(request))
|
||||
|
||||
|
@ -875,6 +883,7 @@ def user_edit(request):
|
|||
password = md5_crypt(password)
|
||||
|
||||
if ssh_key_pwd != user.ssh_key_pwd:
|
||||
gen_ssh_key(user.username, ssh_key_pwd)
|
||||
ssh_key_pwd = CRYPTOR.encrypt(ssh_key_pwd)
|
||||
|
||||
db_update_user(user_id=user_id,
|
||||
|
@ -953,11 +962,11 @@ def profile(request):
|
|||
if not user_id:
|
||||
return HttpResponseRedirect('/')
|
||||
user = User.objects.get(id=user_id)
|
||||
return render_to_response('juser/user_detail.html', locals(), context_instance=RequestContext(request))
|
||||
return render_to_response('juser/profile.html', locals(), context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def chg_info(request):
|
||||
header_title, path1, path2 = '修改信息 | Edit Info', '用户管理', '修改个人信息'
|
||||
header_title, path1, path2 = '修改信息', '用户管理', '修改个人信息'
|
||||
user_id = request.session.get('user_id')
|
||||
user_set = User.objects.filter(id=user_id)
|
||||
error = ''
|
||||
|
@ -983,9 +992,42 @@ def chg_info(request):
|
|||
password = md5_crypt(password)
|
||||
|
||||
if ssh_key_pwd != user.ssh_key_pwd:
|
||||
gen_ssh_key(user.username, ssh_key_pwd)
|
||||
ssh_key_pwd = md5_crypt(ssh_key_pwd)
|
||||
|
||||
user_set.update(name=name, password=password, ssh_key_pwd=ssh_key_pwd, email=email)
|
||||
msg = '修改成功'
|
||||
|
||||
return render_to_response('juser/chg_info.html', locals(), context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@require_login
|
||||
def down_key(request):
|
||||
user_id = ''
|
||||
if is_super_user(request):
|
||||
user_id = request.GET.get('id')
|
||||
|
||||
if is_group_admin(request):
|
||||
user_id = request.GET.get('id')
|
||||
if not validate(request, user=[user_id]):
|
||||
user_id = request.session.get('user_id')
|
||||
|
||||
if is_common_user(request):
|
||||
user_id = request.session.get('user_id')
|
||||
|
||||
if user_id:
|
||||
user = User.objects.filter(id=user_id)
|
||||
if user:
|
||||
user = user[0]
|
||||
username = user.username
|
||||
private_key_dir = os.path.join(BASE_DIR, 'keys/jumpserver/')
|
||||
private_key_file = os.path.join(private_key_dir, username+".pem")
|
||||
if os.path.isfile(private_key_file):
|
||||
f = open(private_key_file)
|
||||
data = f.read()
|
||||
f.close()
|
||||
response = HttpResponse(data, content_type='application/octet-stream')
|
||||
response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(private_key_file)
|
||||
return response
|
||||
|
||||
return HttpResponse('No Key File. Contact Admin.')
|
|
@ -0,0 +1,162 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load mytags %}
|
||||
{% block content %}
|
||||
{% include 'nav_cat_bar.html' %}
|
||||
|
||||
<div class="wrapper wrapper-content" xmlns="http://www.w3.org/1999/html">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<h5> 使用说明 </h5>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<i class="fa fa-wrench"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-user">
|
||||
<li><a href="#">未启用 1</a>
|
||||
</li>
|
||||
<li><a href="#">未启用 2</a>
|
||||
</li>
|
||||
</ul>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ibox-content" style="line-height: 26px">
|
||||
<span style="font-size: large">欢</span>迎使用<span class="text-navy"><b>Jumpserver</b></span>跳板机系统,
|
||||
首先需要 <b><a href="/juser/down_key/?id={{ user.id }}">下载</a></b> 登录跳板机的SSH密钥文件,然后导入到工具或者ssh命令指定密钥文件(确保密钥文件权限600),输入收到的密钥密码,登录跳板机。
|
||||
登录后根据提示进行操作。跳板机web界面支持修改密码、个人信息和上传下载文件等功能,可以向管理员申请权限。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<h5> 已授权主机 </h5>
|
||||
<div class="ibox-tools">
|
||||
<div class="label label-primary float-left"><b>总共:{{ host_count }}</b></div>
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<i class="fa fa-wrench"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-user">
|
||||
<li><a href="#">未启用 1</a>
|
||||
</li>
|
||||
<li><a href="#">未启用 2</a>
|
||||
</li>
|
||||
</ul>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ibox-content">
|
||||
<table class="table table-striped">
|
||||
{% for host_five in new_posts %}
|
||||
<tr>
|
||||
{% for host in host_five %}
|
||||
<td>{{ host.ip }}</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% ifequal host_count 0 %}
|
||||
(空)
|
||||
{% endifequal %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<span class="label label-primary"><b>{{ user.name }}</b></span>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<i class="fa fa-wrench"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-user">
|
||||
<li><a href="#"></a>
|
||||
</li>
|
||||
<li><a href="#"></a>
|
||||
</li>
|
||||
</ul>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<div>
|
||||
<div class="text-left">
|
||||
<table class="table">
|
||||
<tr>
|
||||
<td class="text-navy">ID</td>
|
||||
<td>{{ user.id }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">用户名</td>
|
||||
<td>{{ user.username }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">姓名</td>
|
||||
<td>{{ user.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">角色</td>
|
||||
<td>{{ user.id | get_role }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">部门</td>
|
||||
<td>{{ user.dept.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">Email</td>
|
||||
<td>{{ user.email }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">激活</td>
|
||||
<td>{{ user.is_active|bool2str }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">添加日期</td>
|
||||
<td>{{ user.date_joined|date:"Y-m-d H:i:s" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">最后登录</td>
|
||||
<td>{{ user.last_login|date:"Y-m-d H:i:s" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">所在用户组</td>
|
||||
<td>
|
||||
<table class="table">
|
||||
{% for group in user.group.all %}
|
||||
<tr>
|
||||
<td>{{ group.name }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{% endblock %}
|
|
@ -8,7 +8,7 @@
|
|||
<div class="col-lg-6">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<h5>授权用户 <small> User.</small></h5>
|
||||
<h5>用户详情</h5>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
<div class="col-sm-8">
|
||||
<input id="ssh_key_pwd" name="ssh_key_pwd" placeholder="SSH Key Password" type="password" class="form-control" value="{{ user.ssh_key_pwd }}">
|
||||
<span class="help-block m-b-none">
|
||||
登陆 Jumpserver 使用的SSH密钥的密码
|
||||
登陆 Jumpserver 使用的SSH密钥的密码,更改密钥密码需要重新下载密钥
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
{% load mytags %}
|
||||
<html>
|
||||
<head>
|
||||
{% include 'link_css.html' %}
|
||||
|
||||
<style type="text/css">
|
||||
body
|
||||
{
|
||||
background: #FFFFFF;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="row">
|
||||
<div class="contact-box">
|
||||
<h2 class="text-center">{{ user.name }} 用户详情</h2>
|
||||
<div class="ibox-content">
|
||||
|
||||
<table class="table table-striped table-bordered table-hover " id="editable" >
|
||||
<thead>
|
||||
<tr>
|
||||
<td class="text-center" width="120">ID</td>
|
||||
<td class="text-center">用户名</td>
|
||||
<td class="text-center">姓名</td>
|
||||
<td class="text-center">角色</td>
|
||||
<td class="text-center">部门</td>
|
||||
<td class="text-center">Email</td>
|
||||
<td class="text-center">激活</td>
|
||||
{# <td class="text-center">添加时间</td>#}
|
||||
{# <td class="text-center">最后登录</td>#}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="gradeX">
|
||||
|
||||
<td class="text-center">{{ user.id }}</td>
|
||||
<td class="text-center">{{ user.username }}</td>
|
||||
<td class="text-center">{{ user.name }}</td>
|
||||
<td class="text-center">{{ user.id | get_role }}</td>
|
||||
<td class="text-center">{{ user.dept.name }}</td>
|
||||
<td class="text-center">{{ user.email }}</td>
|
||||
<td class="text-center">{{ user.is_active|bool2str }}</td>
|
||||
{# <td class="text-center">{{ user.date_joined }}</td>#}
|
||||
{# <td class="text-center">{{ user.last_login }}</td>#}
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-center">添加日期: </td>
|
||||
<td colspan="2" class="text-center">{{ user.date_joined }}</td>
|
||||
<td class="text-center">最后登录: </td>
|
||||
<td colspan="3" class="text-center">{{ user.last_login }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="1" class="text-center">用户组:</td>
|
||||
<td colspan="6" class="text-center">
|
||||
{% for group in user.group.all %}
|
||||
<b>{{ group.name }}</b>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
{# <tr>#}
|
||||
{# <td colspan="1" class="text-center">授权主机组:</td>#}
|
||||
{# <td colspan="6" class="text-center">#}
|
||||
{# {% for group in user|get_user_asset_group %}#}
|
||||
{# <b>{{ group.name }}</b>#}
|
||||
{# {% endfor %}#}
|
||||
{# </td>#}
|
||||
{# </tr>#}
|
||||
{# #}
|
||||
{# <tr class="gradeX">#}
|
||||
{# <td class="text-center">授权主机组</td>#}
|
||||
{# <td class="text-center">#}
|
||||
{# {% for asset_group in asset_group_permed %}#}
|
||||
{# {{ asset_group.name }}#}
|
||||
{# {% endfor %}#}
|
||||
{# </td>#}
|
||||
{# </tr>#}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -1,82 +1,218 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load mytags %}
|
||||
<html>
|
||||
<head>
|
||||
{% include 'link_css.html' %}
|
||||
|
||||
<style type="text/css">
|
||||
body
|
||||
{
|
||||
background: #FFFFFF;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
{% block content %}
|
||||
{% include 'nav_cat_bar.html' %}
|
||||
<div class="wrapper wrapper-content animated fadeInRight">
|
||||
<div class="row">
|
||||
<div class="contact-box">
|
||||
<h2 class="text-center">{{ user.name }} 用户详情</h2>
|
||||
<div class="ibox-content">
|
||||
|
||||
<table class="table table-striped table-bordered table-hover " id="editable" >
|
||||
<thead>
|
||||
<tr>
|
||||
<td class="text-center" width="120">ID</td>
|
||||
<td class="text-center">用户名</td>
|
||||
<td class="text-center">姓名</td>
|
||||
<td class="text-center">角色</td>
|
||||
<td class="text-center">部门</td>
|
||||
<td class="text-center">Email</td>
|
||||
<td class="text-center">激活</td>
|
||||
{# <td class="text-center">添加时间</td>#}
|
||||
{# <td class="text-center">最后登录</td>#}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="gradeX">
|
||||
|
||||
<td class="text-center">{{ user.id }}</td>
|
||||
<td class="text-center">{{ user.username }}</td>
|
||||
<td class="text-center">{{ user.name }}</td>
|
||||
<td class="text-center">{{ user.id | get_role }}</td>
|
||||
<td class="text-center">{{ user.dept.name }}</td>
|
||||
<td class="text-center">{{ user.email }}</td>
|
||||
<td class="text-center">{{ user.is_active|bool2str }}</td>
|
||||
{# <td class="text-center">{{ user.date_joined }}</td>#}
|
||||
{# <td class="text-center">{{ user.last_login }}</td>#}
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-center">添加日期: </td>
|
||||
<td colspan="2" class="text-center">{{ user.date_joined }}</td>
|
||||
<td class="text-center">最后登录: </td>
|
||||
<td colspan="3" class="text-center">{{ user.last_login }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="1" class="text-center">用户组:</td>
|
||||
<td colspan="6" class="text-center">
|
||||
{% for group in user.group.all %}
|
||||
<b>{{ group.name }}</b>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="1" class="text-center">授权主机组:</td>
|
||||
<td colspan="6" class="text-center">
|
||||
{% for group in user|get_user_asset_group %}
|
||||
<b>{{ group.name }}</b>
|
||||
{% endfor %}
|
||||
</td>
|
||||
</tr>
|
||||
{# #}
|
||||
{# <tr class="gradeX">#}
|
||||
{# <td class="text-center">授权主机组</td>#}
|
||||
{# <td class="text-center">#}
|
||||
{# {% for asset_group in asset_group_permed %}#}
|
||||
{# {{ asset_group.name }}#}
|
||||
{# {% endfor %}#}
|
||||
{# </td>#}
|
||||
{# </tr>#}
|
||||
</table>
|
||||
<div class="col-lg-4">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<span class="label label-primary"><b>{{ user.name }}</b></span>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<i class="fa fa-wrench"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-user">
|
||||
<li><a href="#"></a>
|
||||
</li>
|
||||
<li><a href="#"></a>
|
||||
</li>
|
||||
</ul>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<div>
|
||||
<div class="text-left">
|
||||
<table class="table">
|
||||
<tr>
|
||||
<td class="text-navy">ID</td>
|
||||
<td>{{ user.id }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">用户名</td>
|
||||
<td>{{ user.username }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">姓名</td>
|
||||
<td>{{ user.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">角色</td>
|
||||
<td>{{ user.id | get_role }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">部门</td>
|
||||
<td>{{ user.dept.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">Email</td>
|
||||
<td>{{ user.email }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">激活</td>
|
||||
<td>{{ user.is_active|bool2str }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">添加日期</td>
|
||||
<td>{{ user.date_joined|date:"Y-m-d H:i:s" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">最后登录</td>
|
||||
<td>{{ user.last_login|date:"Y-m-d H:i:s" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-navy">所在用户组</td>
|
||||
<td>
|
||||
<table class="table">
|
||||
{% for group in user.group.all %}
|
||||
<tr>
|
||||
<td>{{ group.name }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
<div class="col-lg-4">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<h5>授权主机/组</h5>
|
||||
<div class="ibox-tools">
|
||||
<a class="collapse-link">
|
||||
<i class="fa fa-chevron-up"></i>
|
||||
</a>
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||
<i class="fa fa-wrench"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-user">
|
||||
<li><a href="#">Config option 1</a>
|
||||
</li>
|
||||
<li><a href="#">Config option 2</a>
|
||||
</li>
|
||||
</ul>
|
||||
<a class="close-link">
|
||||
<i class="fa fa-times"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content ibox-heading">
|
||||
<h3>用户的所有授权主机</h3>
|
||||
<small><i class="fa fa-map-marker"></i> 这里包含了用户所有的主机组和组下的主机.</small>
|
||||
</div>
|
||||
<div class="ibox-content inspinia-timeline">
|
||||
{% for group in user|get_user_asset_group %}
|
||||
<div class="timeline-item">
|
||||
<div class="row">
|
||||
<div class="col-xs-3 date">
|
||||
<i class="fa fa-repeat"></i>
|
||||
<b>{{ group.name }}</b>
|
||||
<br>
|
||||
<small class="text-navy">共: {{ group | group_asset_list_count }}台</small>
|
||||
</div>
|
||||
<div class="col-xs-7 content no-top-border">
|
||||
<p class="m-b-xs"><strong>{{ group.comment }}</strong></p>
|
||||
|
||||
<p>
|
||||
{% for asset in group|group_asset_list %}
|
||||
{{ asset.ip }}<br>
|
||||
{% endfor %}
|
||||
</p>
|
||||
<p></p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% if not user|get_user_asset_group %}
|
||||
(无)
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4">
|
||||
<div class="ibox float-e-margins">
|
||||
<div class="ibox-title">
|
||||
<h5>登录记录</h5>
|
||||
<div class="ibox-tools">
|
||||
<span class="label label-warning-light">最近登录</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
|
||||
<div id="last">
|
||||
<div class="feed-activity-list" >
|
||||
{% for log in logs_last %}
|
||||
<div class="feed-element">
|
||||
<a href="profile.html" class="pull-left">
|
||||
<img alt="image" class="img-circle" src="/static/img/{{ session_role_id | to_avatar }}.png">
|
||||
</a>
|
||||
<div class="media-body ">
|
||||
<small class="pull-right">{{ log.start_time|time_delta }}</small>
|
||||
<strong>{{ log.user }}</strong> 登录了 <span class="text-navy">{{ log.host }}. </span><br>
|
||||
<small class="text-muted">{{ log.start_time|date:"Y-m-d H:i:s" }}</small>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% if not logs_last %}
|
||||
(无)
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> Show All</button>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="all" style="display: none">
|
||||
<div class="feed-activity-list" >
|
||||
{% for log in logs_all %}
|
||||
|
||||
<div class="feed-element">
|
||||
<a href="profile.html" class="pull-left">
|
||||
<img alt="image" class="img-circle" src="/static/img/{{ session_role_id | to_avatar }}.png">
|
||||
</a>
|
||||
<div class="media-body ">
|
||||
<small class="pull-right">{{ log.start_time|time_delta }}</small>
|
||||
<strong>{{ log.user }}</strong> 登录了 <span class="text-navy">{{ log.host }}. </span><br>
|
||||
<small class="text-muted">{{ log.start_time|date:"Y-m-d H:i:s" }}</small>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
$('#show').click(function(){
|
||||
$('#last').css('display', 'none');
|
||||
$('#all').css('display', 'block');
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
{% endblock %}
|
|
@ -59,7 +59,7 @@
|
|||
<div class="col-sm-8">
|
||||
<input id="ssh_key_pwd" name="ssh_key_pwd" placeholder="SSH Key Password" type="password" class="form-control" value="{{ user.ssh_key_pwd }}">
|
||||
<span class="help-block m-b-none">
|
||||
登陆 Jumpserver 使用的SSH密钥的密码
|
||||
登陆 Jumpserver 使用的SSH密钥的密码,更改密钥密码需要重新下载密钥
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
<th class="text-center">小组</th>
|
||||
<th class="text-center">角色</th>
|
||||
<th class="text-center">激活</th>
|
||||
<th class="text-center">下载密钥</th>
|
||||
<th class="text-center">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
@ -71,8 +72,9 @@
|
|||
<td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.group.all | group_str2 }} </td>
|
||||
<td class="text-center"> {{ user.id | get_role }}</td>
|
||||
<td class="text-center">{{ user.is_active|bool2str }}</td>
|
||||
<td class="text-center"><a href="/juser/down_key/?id={{ user.id }}">下载</a></td>
|
||||
<td class="text-center">
|
||||
<a title="[ {{ user.name }} ] 详情" value="../user_detail/?id={{ user.id }}" class="iframe btn btn-xs btn-primary">详情</a>
|
||||
<a href="../user_detail/?id={{ user.id }}" class="btn btn-xs btn-primary">详情</a>
|
||||
{% ifequal session_role_id 2 %}
|
||||
<a href="../user_edit/?id={{ user.id }}" class="btn btn-xs btn-info">编辑</a>
|
||||
<a href="../user_del/?id={{ user.id }}" class="btn btn-xs btn-danger">删除</a>
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
<li class="dept_add"><a href="/juser/dept_add/">添加部门</a></li>
|
||||
<li class="group_list group_edit"><a href="/juser/group_list/">查看小组</a></li>
|
||||
<li class="group_add"><a href="/juser/group_add/">添加小组</a></li>
|
||||
<li class="user_list user_edit"><a href="/juser/user_list/">查看用户<span class="label {% ifequal user_active_num user_total_num %}label-primary {% else %}label-warning {% endifequal %}pull-right">{{ user_active_num }}/{{ user_total_num }}</span></a></li>
|
||||
<li class="user_list user_edit user_detail"><a href="/juser/user_list/">查看用户<span class="label {% ifequal user_active_num user_total_num %}label-primary {% else %}label-warning {% endifequal %}pull-right">{{ user_active_num }}/{{ user_total_num }}</span></a></li>
|
||||
<li class="user_add"><a href="/juser/user_add/">添加用户</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -136,8 +136,8 @@
|
|||
<li>
|
||||
<a href="/"><i class="fa fa-th-large"></i> <span class="nav-label">仪表盘</span><span class="label label-info pull-right"></span></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/"><i class="fa fa-rebel"></i> <span class="nav-label">个人信息</span><span class="label label-info pull-right"></span></a>
|
||||
<li class="user_detail">
|
||||
<a href="/juser/user_detail/?id={{ session_user_id }}"><i class="fa fa-rebel"></i> <span class="nav-label">个人信息</span><span class="label label-info pull-right"></span></a>
|
||||
</li>
|
||||
<li id="jasset">
|
||||
<a href="/jasset/host_list/"><i class="fa fa-cube"></i> <span class="nav-label">查看主机</span><span class="label label-info pull-right"></span></a>
|
||||
|
@ -156,13 +156,10 @@
|
|||
<li>
|
||||
<a href="#"><i class="fa fa-download"></i> <span class="nav-label">上传下载</span><span class="fa arrow"></span></a>
|
||||
<ul class="nav nav-second-level">
|
||||
<li><a href="/file/upload/">文件上传</a></li>
|
||||
<li><a href="/file/download/">文件下载</a></li>
|
||||
<li><a href="/upload/">文件上传</a></li>
|
||||
<li><a href="/download/">文件下载</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/"><i class="fa fa-files-o"></i> <span class="nav-label">使用说明</span><span class="label label-info pull-right"></span></a>
|
||||
</li>
|
||||
|
||||
<li class="special_link">
|
||||
<a href="http://www.jumpserver.org" target="_blank"><i class="fa fa-database"></i> <span class="nav-label">访问官网</span></a>
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
<span class="clear"> <span class="block m-t-xs"> <strong class="font-bold">{{ session_user_id | to_name}}</strong>
|
||||
</span> <span class="text-muted text-xs block">{{ session_role_id | to_role_name }} <b class="caret"></b></span> </span> </a>
|
||||
<ul class="dropdown-menu animated fadeInRight m-t-xs">
|
||||
<li><a value="/juser/user_detail/?id={{ session_user_id }}" class="iframe">个人信息</a></li>
|
||||
<li><a value="/juser/profile/?id={{ session_user_id }}" class="iframe">个人信息</a></li>
|
||||
<li><a href="/juser/chg_info/">修改信息</a></li>
|
||||
<li><a href="/juser/chg_role/">切换角色</a></li>
|
||||
|
||||
|
|
Loading…
Reference in New Issue