Commit 3842f779 authored by halcyon's avatar halcyon

hehe

parents d28d72c4 25ce24a1
...@@ -7,9 +7,7 @@ from django.template import RequestContext ...@@ -7,9 +7,7 @@ from django.template import RequestContext
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from jasset.models import IDC, Asset, BisGroup, AssetAlias from jasset.models import IDC, Asset, BisGroup, AssetAlias
from juser.models import UserGroup, DEPT
from jperm.models import Perm, SudoPerm from jperm.models import Perm, SudoPerm
from jumpserver.views import pages
from jumpserver.api import * from jumpserver.api import *
cryptor = PyCrypt(KEY) cryptor = PyCrypt(KEY)
......
...@@ -10,6 +10,7 @@ from binascii import b2a_hex, a2b_hex ...@@ -10,6 +10,7 @@ from binascii import b2a_hex, a2b_hex
import ldap import ldap
from ldap import modlist from ldap import modlist
import hashlib import hashlib
import datetime
from django.core.paginator import Paginator, EmptyPage, InvalidPage from django.core.paginator import Paginator, EmptyPage, InvalidPage
from django.http import HttpResponse, Http404 from django.http import HttpResponse, Http404
from juser.models import User, UserGroup, DEPT from juser.models import User, UserGroup, DEPT
...@@ -289,6 +290,7 @@ def user_perm_asset_api(username): ...@@ -289,6 +290,7 @@ def user_perm_asset_api(username):
asset_list.extend(asset_group.asset_set.all()) asset_list.extend(asset_group.asset_set.all())
return asset_list return asset_list
return []
def asset_perm_api(asset): def asset_perm_api(asset):
......
...@@ -2,6 +2,7 @@ from juser.models import User ...@@ -2,6 +2,7 @@ from juser.models import User
from jasset.models import Asset from jasset.models import Asset
from jumpserver.api import * from jumpserver.api import *
def name_proc(request): def name_proc(request):
user_id = request.session.get('user_id') user_id = request.session.get('user_id')
role_id = request.session.get('role_id') role_id = request.session.get('role_id')
......
...@@ -57,7 +57,7 @@ def groups_str2(group_list): ...@@ -57,7 +57,7 @@ def groups_str2(group_list):
@register.filter(name='group_str2_all') @register.filter(name='group_str2_all')
def groups_str2(group_list): def group_str2_all(group_list):
group_lis = [] group_lis = []
for i in group_list: for i in group_list:
if str(i) != 'ALL': if str(i) != 'ALL':
...@@ -107,6 +107,12 @@ def member_count(group_id): ...@@ -107,6 +107,12 @@ def member_count(group_id):
return group.user_set.count() 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') @register.filter(name='dept_user_num')
def dept_user_num(dept_id): def dept_user_num(dept_id):
dept = DEPT.objects.filter(id=dept_id) dept = DEPT.objects.filter(id=dept_id)
...@@ -230,3 +236,31 @@ def to_avatar(role_id='0'): ...@@ -230,3 +236,31 @@ def to_avatar(role_id='0'):
@register.filter(name='get_user_asset_group') @register.filter(name='get_user_asset_group')
def get_user_asset_group(user): def get_user_asset_group(user):
return user_perm_group_api(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('', ...@@ -15,9 +15,12 @@ urlpatterns = patterns('',
(r'^base/$', 'jumpserver.views.base'), (r'^base/$', 'jumpserver.views.base'),
(r'^login/$', 'jumpserver.views.login'), (r'^login/$', 'jumpserver.views.login'),
(r'^logout/$', 'jumpserver.views.logout'), (r'^logout/$', 'jumpserver.views.logout'),
(r'^upload/$', 'jumpserver.views.upload'),
(r'^download/$', 'jumpserver.views.download'),
(r'^juser/', include('juser.urls')), (r'^juser/', include('juser.urls')),
(r'^jasset/', include('jasset.urls')), (r'^jasset/', include('jasset.urls')),
(r'^jlog/', include('jlog.urls')), (r'^jlog/', include('jlog.urls')),
(r'^jperm/', include('jperm.urls')), (r'^jperm/', include('jperm.urls')),
) )
...@@ -45,8 +45,12 @@ def get_data(data, items, option): ...@@ -45,8 +45,12 @@ def get_data(data, items, option):
return dic return dic
@require_login @require_admin
def index(request): 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() users = User.objects.all()
hosts = Asset.objects.all() hosts = Asset.objects.all()
online = Log.objects.filter(is_finished=0) online = Log.objects.filter(is_finished=0)
...@@ -54,58 +58,8 @@ def index(request): ...@@ -54,58 +58,8 @@ def index(request):
online_user = online.values('user').distinct() online_user = online.values('user').distinct()
active_users = User.objects.filter(is_active=1) active_users = User.objects.filter(is_active=1)
active_hosts = Asset.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()]) 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] elif is_group_admin(request):
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_id = request.session.get('user_id', '')
user = User.objects.get(id=user_id) user = User.objects.get(id=user_id)
dept = user.dept dept = user.dept
...@@ -117,6 +71,11 @@ def admin_index(request): ...@@ -117,6 +71,11 @@ def admin_index(request):
online_user = online.values('user').distinct() online_user = online.values('user').distinct()
active_users = users.filter(is_active=1) active_users = users.filter(is_active=1)
active_hosts = hosts.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 of dashboard
percent_user = format(active_users.count() / users.count(), '.0%') percent_user = format(active_users.count() / users.count(), '.0%')
...@@ -124,14 +83,6 @@ def admin_index(request): ...@@ -124,14 +83,6 @@ def admin_index(request):
percent_online_user = format(online_user.count() / users.count(), '.0%') percent_online_user = format(online_user.count() / users.count(), '.0%')
percent_online_host = format(online_host.count() / hosts.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 # a week data
week_users = week_data.values('user').distinct().count() week_users = week_data.values('user').distinct().count()
week_hosts = week_data.count() week_hosts = week_data.count()
......
...@@ -29,4 +29,5 @@ urlpatterns = patterns('juser.views', ...@@ -29,4 +29,5 @@ urlpatterns = patterns('juser.views',
(r'^profile/$', 'profile'), (r'^profile/$', 'profile'),
(r'^chg_info/$', 'chg_info'), (r'^chg_info/$', 'chg_info'),
(r'^chg_role/$', 'chg_role'), (r'^chg_role/$', 'chg_role'),
(r'^down_key/$', 'down_key'),
) )
...@@ -6,7 +6,6 @@ import random ...@@ -6,7 +6,6 @@ import random
import subprocess import subprocess
from Crypto.PublicKey import RSA from Crypto.PublicKey import RSA
import crypt import crypt
import datetime
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
...@@ -32,9 +31,10 @@ def bash(cmd): ...@@ -32,9 +31,10 @@ def bash(cmd):
return subprocess.call(cmd, shell=True) 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): if not os.path.isdir(dir_name):
os.makedirs(dir_name) os.makedirs(dir_name)
bash("chown %s:%s '%s'" % (username, username, dir_name))
os.chmod(dir_name, mode) os.chmod(dir_name, mode)
...@@ -109,11 +109,11 @@ def db_del_user(username): ...@@ -109,11 +109,11 @@ def db_del_user(username):
def gen_ssh_key(username, password=None, length=2048): def gen_ssh_key(username, password=None, length=2048):
private_key_dir = os.path.join(BASE_DIR, 'keys/jumpserver/') 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_dir = '/home/%s/.ssh/' % username
public_key_file = os.path.join(public_key_dir, 'authorized_keys') public_key_file = os.path.join(public_key_dir, 'authorized_keys')
is_dir(private_key_dir) is_dir(private_key_dir)
is_dir(public_key_dir, mode=0700) is_dir(public_key_dir, username, mode=0700)
key = RSA.generate(length) key = RSA.generate(length)
with open(private_key_file, 'w') as pri_f: with open(private_key_file, 'w') as pri_f:
...@@ -128,7 +128,7 @@ def gen_ssh_key(username, password=None, length=2048): ...@@ -128,7 +128,7 @@ def gen_ssh_key(username, password=None, length=2048):
def server_add_user(username, password, ssh_key_pwd): 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) gen_ssh_key(username, ssh_key_pwd)
...@@ -775,18 +775,26 @@ def user_list_adm(request): ...@@ -775,18 +775,26 @@ def user_list_adm(request):
return render_to_response('juser/user_list.html', locals(), context_instance=RequestContext(request)) return render_to_response('juser/user_list.html', locals(), context_instance=RequestContext(request))
@require_admin @require_login
def user_detail(request): def user_detail(request):
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', '') user_id = request.GET.get('id', '')
if not user_id: if request.session.get('role_id') == 1:
return HttpResponseRedirect('/juser/user_list/') user, dept = get_session_user_dept(request)
if request.session.get('role_id', '') == '1':
if not validate(request, user=[user_id]): if not validate(request, user=[user_id]):
return HttpResponseRedirect('/')
if not user_id:
return HttpResponseRedirect('/juser/user_list/') return HttpResponseRedirect('/juser/user_list/')
user = User.objects.filter(id=user_id) user = User.objects.filter(id=user_id)
if user: if user:
user = user[0] user = user[0]
asset_group_permed = user_perm_group_api(user) 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)) return render_to_response('juser/user_detail.html', locals(), context_instance=RequestContext(request))
...@@ -875,6 +883,7 @@ def user_edit(request): ...@@ -875,6 +883,7 @@ def user_edit(request):
password = md5_crypt(password) password = md5_crypt(password)
if ssh_key_pwd != user.ssh_key_pwd: if ssh_key_pwd != user.ssh_key_pwd:
gen_ssh_key(user.username, ssh_key_pwd)
ssh_key_pwd = CRYPTOR.encrypt(ssh_key_pwd) ssh_key_pwd = CRYPTOR.encrypt(ssh_key_pwd)
db_update_user(user_id=user_id, db_update_user(user_id=user_id,
...@@ -953,11 +962,11 @@ def profile(request): ...@@ -953,11 +962,11 @@ def profile(request):
if not user_id: if not user_id:
return HttpResponseRedirect('/') return HttpResponseRedirect('/')
user = User.objects.get(id=user_id) 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): def chg_info(request):
header_title, path1, path2 = '修改信息 | Edit Info', '用户管理', '修改个人信息' header_title, path1, path2 = '修改信息', '用户管理', '修改个人信息'
user_id = request.session.get('user_id') user_id = request.session.get('user_id')
user_set = User.objects.filter(id=user_id) user_set = User.objects.filter(id=user_id)
error = '' error = ''
...@@ -983,9 +992,42 @@ def chg_info(request): ...@@ -983,9 +992,42 @@ def chg_info(request):
password = md5_crypt(password) password = md5_crypt(password)
if ssh_key_pwd != user.ssh_key_pwd: if ssh_key_pwd != user.ssh_key_pwd:
gen_ssh_key(user.username, ssh_key_pwd)
ssh_key_pwd = md5_crypt(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) user_set.update(name=name, password=password, ssh_key_pwd=ssh_key_pwd, email=email)
msg = '修改成功' msg = '修改成功'
return render_to_response('juser/chg_info.html', locals(), context_instance=RequestContext(request)) 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.')
\ No newline at end of file
{% 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 %}
\ No newline at end of file
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<div class="col-lg-6"> <div class="col-lg-6">
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
<div class="ibox-title"> <div class="ibox-title">
<h5>授权用户 <small> User.</small></h5> <h5>用户详情</h5>
<div class="ibox-tools"> <div class="ibox-tools">
<a class="collapse-link"> <a class="collapse-link">
<i class="fa fa-chevron-up"></i> <i class="fa fa-chevron-up"></i>
......
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
<div class="col-sm-8"> <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 }}"> <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"> <span class="help-block m-b-none">
登陆 Jumpserver 使用的SSH密钥的密码 登陆 Jumpserver 使用的SSH密钥的密码,更改密钥密码需要重新下载密钥
</span> </span>
</div> </div>
</div> </div>
......
{% 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>
\ No newline at end of file
This diff is collapsed.
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
<div class="col-sm-8"> <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 }}"> <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"> <span class="help-block m-b-none">
登陆 Jumpserver 使用的SSH密钥的密码 登陆 Jumpserver 使用的SSH密钥的密码,更改密钥密码需要重新下载密钥
</span> </span>
</div> </div>
</div> </div>
......
...@@ -56,6 +56,7 @@ ...@@ -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> <th class="text-center">激活</th>
<th class="text-center">下载密钥</th>
<th class="text-center">操作</th> <th class="text-center">操作</th>
</tr> </tr>
</thead> </thead>
...@@ -71,8 +72,9 @@ ...@@ -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" 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.id | get_role }}</td>
<td class="text-center">{{ user.is_active|bool2str }}</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"> <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 %} {% ifequal session_role_id 2 %}
<a href="../user_edit/?id={{ user.id }}" class="btn btn-xs btn-info">编辑</a> <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> <a href="../user_del/?id={{ user.id }}" class="btn btn-xs btn-danger">删除</a>
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
<li class="dept_add"><a href="/juser/dept_add/">添加部门</a></li> <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_list group_edit"><a href="/juser/group_list/">查看小组</a></li>
<li class="group_add"><a href="/juser/group_add/">添加小组</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> <li class="user_add"><a href="/juser/user_add/">添加用户</a></li>
</ul> </ul>
</li> </li>
...@@ -136,8 +136,8 @@ ...@@ -136,8 +136,8 @@
<li> <li>
<a href="/"><i class="fa fa-th-large"></i> <span class="nav-label">仪表盘</span><span class="label label-info pull-right"></span></a> <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>
<li> <li class="user_detail">
<a href="/"><i class="fa fa-rebel"></i> <span class="nav-label">个人信息</span><span class="label label-info pull-right"></span></a> <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>
<li id="jasset"> <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> <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 @@ ...@@ -156,13 +156,10 @@
<li> <li>
<a href="#"><i class="fa fa-download"></i> <span class="nav-label">上传下载</span><span class="fa arrow"></span></a> <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"> <ul class="nav nav-second-level">
<li><a href="/file/upload/">文件上传</a></li> <li><a href="/upload/">文件上传</a></li>
<li><a href="/file/download/">文件下载</a></li> <li><a href="/download/">文件下载</a></li>
</ul> </ul>
</li> </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"> <li class="special_link">
<a href="http://www.jumpserver.org" target="_blank"><i class="fa fa-database"></i> <span class="nav-label">访问官网</span></a> <a href="http://www.jumpserver.org" target="_blank"><i class="fa fa-database"></i> <span class="nav-label">访问官网</span></a>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<span class="clear"> <span class="block m-t-xs"> <strong class="font-bold">{{ session_user_id | to_name}}</strong> <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> </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"> <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_info/">修改信息</a></li>
<li><a href="/juser/chg_role/">切换角色</a></li> <li><a href="/juser/chg_role/">切换角色</a></li>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment