mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-07-19 17:26:52 +00:00
merge
This commit is contained in:
commit
d6171f7fe7
285
jasset/views.py
285
jasset/views.py
@ -8,7 +8,6 @@ from django.shortcuts import render_to_response
|
|||||||
|
|
||||||
from jasset.models import IDC, Asset, BisGroup, AssetAlias
|
from jasset.models import IDC, Asset, BisGroup, AssetAlias
|
||||||
from jperm.models import Perm, SudoPerm
|
from jperm.models import Perm, SudoPerm
|
||||||
from django.shortcuts import redirect
|
|
||||||
from jumpserver.api import *
|
from jumpserver.api import *
|
||||||
|
|
||||||
cryptor = PyCrypt(KEY)
|
cryptor = PyCrypt(KEY)
|
||||||
@ -18,12 +17,17 @@ class RaiseError(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def my_render(template, data, request):
|
||||||
|
return render_to_response(template, data, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def httperror(request, emg):
|
def httperror(request, emg):
|
||||||
message = emg
|
message = emg
|
||||||
return render_to_response('error.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('error.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def get_host_groups(groups):
|
def get_host_groups(groups):
|
||||||
|
""" 获取主机所属的组类 """
|
||||||
ret = []
|
ret = []
|
||||||
for group_id in groups:
|
for group_id in groups:
|
||||||
group = BisGroup.objects.filter(id=group_id)
|
group = BisGroup.objects.filter(id=group_id)
|
||||||
@ -34,6 +38,7 @@ def get_host_groups(groups):
|
|||||||
|
|
||||||
|
|
||||||
def get_host_depts(depts):
|
def get_host_depts(depts):
|
||||||
|
""" 获取主机所属的部门类 """
|
||||||
ret = []
|
ret = []
|
||||||
for dept_id in depts:
|
for dept_id in depts:
|
||||||
dept = DEPT.objects.filter(id=dept_id)
|
dept = DEPT.objects.filter(id=dept_id)
|
||||||
@ -43,8 +48,9 @@ def get_host_depts(depts):
|
|||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def db_host_insert(ip, port, idc, jtype, group, dept, active, comment, username='', password=''):
|
def db_host_insert(host_info, username='', password=''):
|
||||||
""" 添加主机时数据库操作函数 """
|
""" 添加主机时数据库操作函数 """
|
||||||
|
ip, port, idc, jtype, group, dept, active, comment = host_info
|
||||||
idc = IDC.objects.filter(id=idc)
|
idc = IDC.objects.filter(id=idc)
|
||||||
if idc:
|
if idc:
|
||||||
idc = idc[0]
|
idc = idc[0]
|
||||||
@ -72,10 +78,11 @@ def db_host_insert(ip, port, idc, jtype, group, dept, active, comment, username=
|
|||||||
a.bis_group = groups
|
a.bis_group = groups
|
||||||
a.dept = depts
|
a.dept = depts
|
||||||
a.save()
|
a.save()
|
||||||
|
|
||||||
|
|
||||||
def db_host_update(ip, port, idc, jtype, group, dept, active, comment, host, username='', password=''):
|
def db_host_update(host_info, username='', password=''):
|
||||||
""" 修改主机时数据库操作函数 """
|
""" 修改主机时数据库操作函数 """
|
||||||
|
ip, port, idc, jtype, group, dept, active, comment, host = host_info
|
||||||
idc = IDC.objects.filter(id=idc)
|
idc = IDC.objects.filter(id=idc)
|
||||||
if idc:
|
if idc:
|
||||||
idc = idc[0]
|
idc = idc[0]
|
||||||
@ -89,10 +96,8 @@ def db_host_update(ip, port, idc, jtype, group, dept, active, comment, host, use
|
|||||||
host.comment = comment
|
host.comment = comment
|
||||||
|
|
||||||
if jtype == 'M':
|
if jtype == 'M':
|
||||||
print password, host.password
|
|
||||||
if password != host.password:
|
if password != host.password:
|
||||||
password = cryptor.encrypt(password)
|
password = cryptor.encrypt(password)
|
||||||
print password
|
|
||||||
host.password = password
|
host.password = password
|
||||||
host.username = username
|
host.username = username
|
||||||
host.password = password
|
host.password = password
|
||||||
@ -102,8 +107,9 @@ def db_host_update(ip, port, idc, jtype, group, dept, active, comment, host, use
|
|||||||
host.save()
|
host.save()
|
||||||
|
|
||||||
|
|
||||||
def batch_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment, j_user='', j_password=''):
|
def batch_host_edit(host_info, j_user='', j_password=''):
|
||||||
""" 批量修改主机函数 """
|
""" 批量修改主机函数 """
|
||||||
|
j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment = host_info
|
||||||
groups, depts = [], []
|
groups, depts = [], []
|
||||||
is_active = {u'是': '1', u'否': '2'}
|
is_active = {u'是': '1', u'否': '2'}
|
||||||
login_types = {'LDAP': 'L', 'MAP': 'M'}
|
login_types = {'LDAP': 'L', 'MAP': 'M'}
|
||||||
@ -140,8 +146,37 @@ def batch_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active
|
|||||||
a.save()
|
a.save()
|
||||||
|
|
||||||
|
|
||||||
|
def db_host_delete(request, host_id):
|
||||||
|
""" 删除主机操作 """
|
||||||
|
if is_group_admin(request) and not validate(request, asset=[host_id]):
|
||||||
|
return httperror(request, '删除失败, 您无权删除!')
|
||||||
|
|
||||||
|
asset = Asset.objects.filter(id=host_id)
|
||||||
|
if asset:
|
||||||
|
asset.delete()
|
||||||
|
else:
|
||||||
|
return httperror(request, '删除失败, 没有此主机!')
|
||||||
|
|
||||||
|
|
||||||
|
def db_idc_delete(request, idc_id):
|
||||||
|
""" 删除IDC操作 """
|
||||||
|
if idc_id == 1:
|
||||||
|
return httperror(request, '删除失败, 默认IDC不能删除!')
|
||||||
|
|
||||||
|
default_idc = IDC.objects.get(id=1)
|
||||||
|
|
||||||
|
idc = IDC.objects.filter(id=idc_id)
|
||||||
|
if idc:
|
||||||
|
idc_class = idc.first()
|
||||||
|
idc_class.asset_set.update(idc=default_idc)
|
||||||
|
idc.delete()
|
||||||
|
else:
|
||||||
|
return httperror(request, '删除失败, 没有这个IDC!')
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def host_add(request):
|
def host_add(request):
|
||||||
|
""" 添加主机 """
|
||||||
header_title, path1, path2 = u'添加主机', u'资产管理', u'添加主机'
|
header_title, path1, path2 = u'添加主机', u'资产管理', u'添加主机'
|
||||||
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
||||||
eidc = IDC.objects.exclude(name='ALL')
|
eidc = IDC.objects.exclude(name='ALL')
|
||||||
@ -161,34 +196,34 @@ def host_add(request):
|
|||||||
j_active = request.POST.get('j_active')
|
j_active = request.POST.get('j_active')
|
||||||
j_comment = request.POST.get('j_comment')
|
j_comment = request.POST.get('j_comment')
|
||||||
j_dept = request.POST.getlist('j_dept')
|
j_dept = request.POST.getlist('j_dept')
|
||||||
|
|
||||||
|
host_info = [j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment]
|
||||||
if is_group_admin(request) and not verify(request, asset_group=j_group, edept=j_dept):
|
if is_group_admin(request) and not verify(request, asset_group=j_group, edept=j_dept):
|
||||||
emg = u'添加失败,您无权操作!'
|
return httperror(request, u'添加失败,您无权操作!')
|
||||||
return render_to_response('jasset/host_add.html', locals(), context_instance=RequestContext(request))
|
|
||||||
|
|
||||||
if Asset.objects.filter(ip=str(j_ip)):
|
if Asset.objects.filter(ip=str(j_ip)):
|
||||||
emg = u'该IP %s 已存在!' % j_ip
|
emg = u'该IP %s 已存在!' % j_ip
|
||||||
return render_to_response('jasset/host_add.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_add.html', locals(), request)
|
||||||
|
|
||||||
if j_type == 'M':
|
if j_type == 'M':
|
||||||
j_user = request.POST.get('j_user')
|
j_user = request.POST.get('j_user')
|
||||||
j_password = request.POST.get('j_password', '')
|
j_password = request.POST.get('j_password', '')
|
||||||
db_host_insert(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, j_user, j_password)
|
db_host_insert(host_info, j_user, j_password)
|
||||||
else:
|
else:
|
||||||
db_host_insert(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment)
|
db_host_insert(host_info)
|
||||||
smg = u'主机 %s 添加成功' % j_ip
|
smg = u'主机 %s 添加成功' % j_ip
|
||||||
|
|
||||||
return render_to_response('jasset/host_add.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_add.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def host_add_batch(request):
|
def host_add_batch(request):
|
||||||
|
""" 批量添加主机 """
|
||||||
header_title, path1, path2 = u'批量添加主机', u'资产管理', u'批量添加主机'
|
header_title, path1, path2 = u'批量添加主机', u'资产管理', u'批量添加主机'
|
||||||
login_types = {'LDAP': 'L', 'MAP': 'M'}
|
login_types = {'LDAP': 'L', 'MAP': 'M'}
|
||||||
active_types = {'激活': 1, '禁用': 0}
|
active_types = {'激活': 1, '禁用': 0}
|
||||||
dept_id = get_user_dept(request)
|
dept_id = get_user_dept(request)
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
multi_hosts = request.POST.get('j_multi').split('\n')
|
multi_hosts = request.POST.get('j_multi').split('\n')
|
||||||
print multi_hosts
|
|
||||||
for host in multi_hosts:
|
for host in multi_hosts:
|
||||||
if host == '':
|
if host == '':
|
||||||
break
|
break
|
||||||
@ -201,43 +236,44 @@ def host_add_batch(request):
|
|||||||
idc = IDC.objects.filter(name=j_idc)
|
idc = IDC.objects.filter(name=j_idc)
|
||||||
if idc:
|
if idc:
|
||||||
j_idc = idc[0].id
|
j_idc = idc[0].id
|
||||||
|
else:
|
||||||
|
return httperror(request, '添加失败, 没有%s这个IDC' % j_idc)
|
||||||
|
|
||||||
group_ids, dept_ids = [], []
|
group_ids, dept_ids = [], []
|
||||||
for group_name in j_group:
|
for group_name in j_group:
|
||||||
group = BisGroup.objects.filter(name=group_name)
|
group = BisGroup.objects.filter(name=group_name)
|
||||||
if group:
|
if group:
|
||||||
group_id = group[0].id
|
group_id = group[0].id
|
||||||
|
else:
|
||||||
|
return httperror(request, '添加失败, 没有%s这个主机组' % group_name)
|
||||||
group_ids.append(group_id)
|
group_ids.append(group_id)
|
||||||
|
|
||||||
for dept_name in j_dept:
|
for dept_name in j_dept:
|
||||||
dept = DEPT.objects.filter(name=dept_name)
|
dept = DEPT.objects.filter(name=dept_name)
|
||||||
if dept:
|
if dept:
|
||||||
dept_id = dept[0].id
|
dept_id = dept[0].id
|
||||||
|
else:
|
||||||
|
return httperror(request, '添加失败, 没有%s这个部门' % dept_name)
|
||||||
dept_ids.append(dept_id)
|
dept_ids.append(dept_id)
|
||||||
|
|
||||||
if is_group_admin(request) and not verify(request, asset_group=group_ids, edept=dept_ids):
|
if is_group_admin(request) and not verify(request, asset_group=group_ids, edept=dept_ids):
|
||||||
return httperror(request, '添加失败, 您无权添加!')
|
return httperror(request, '添加失败, 没有%s这个主机组' % group_name)
|
||||||
|
|
||||||
if Asset.objects.filter(ip=str(j_ip)):
|
if Asset.objects.filter(ip=str(j_ip)):
|
||||||
emg = u'该IP %s 已存在!' % j_ip
|
return httperror(request, '添加失败, 改IP%s已存在' % j_ip)
|
||||||
return render_to_response('jasset/host_add_multi.html', locals(),
|
|
||||||
context_instance=RequestContext(request))
|
|
||||||
|
|
||||||
# if j_type == 'M':
|
host_info = [j_ip, j_port, j_idc, j_type, group_ids, dept_ids, j_active, j_comment]
|
||||||
# j_user = request.POST.get('j_user')
|
db_host_insert(host_info)
|
||||||
# j_password = request.POST.get('j_password')
|
|
||||||
# db_host_insert(j_ip, j_port, j_idc, j_type, group_ids, dept_ids, j_active, j_comment)
|
|
||||||
# else:
|
|
||||||
db_host_insert(j_ip, j_port, j_idc, j_type, group_ids, dept_ids, j_active, j_comment)
|
|
||||||
|
|
||||||
smg = u'批量添加添加成功'
|
smg = u'批量添加添加成功'
|
||||||
return render_to_response('jasset/host_add_multi.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_add_multi.html', locals(), request)
|
||||||
|
|
||||||
return render_to_response('jasset/host_add_multi.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_add_multi.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def host_edit_batch(request):
|
def host_edit_batch(request):
|
||||||
|
""" 批量修改主机 """
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
len_table = request.POST.get('len_table')
|
len_table = request.POST.get('len_table')
|
||||||
for i in range(int(len_table)):
|
for i in range(int(len_table)):
|
||||||
@ -261,22 +297,23 @@ def host_edit_batch(request):
|
|||||||
j_active = request.POST.get(j_active).strip()
|
j_active = request.POST.get(j_active).strip()
|
||||||
j_comment = request.POST.get(j_comment).strip()
|
j_comment = request.POST.get(j_comment).strip()
|
||||||
|
|
||||||
batch_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment)
|
host_info = [j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment]
|
||||||
|
batch_host_edit(host_info)
|
||||||
|
|
||||||
return render_to_response('jasset/host_list.html')
|
return HttpResponseRedirect('/jasset/host_list/')
|
||||||
|
|
||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def host_edit_common_batch(request):
|
def host_edit_common_batch(request):
|
||||||
user_id = request.session.get('user_id', '')
|
""" 普通用户批量修改主机别名 """
|
||||||
u = User.objects.get(id=user_id)
|
u = get_session_user_info(request)[2]
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
len_table = request.POST.get('len_table')
|
len_table = request.POST.get('len_table')
|
||||||
for i in range(int(len_table)):
|
for i in range(int(len_table)):
|
||||||
j_id = "editable[" + str(i) + "][j_id]"
|
j_id = "editable[" + str(i) + "][j_id]"
|
||||||
j_alias = "editable[" + str(i) + "][j_alias]"
|
j_alias = "editable[" + str(i) + "][j_alias]"
|
||||||
j_id = request.POST.get(j_id).strip()
|
j_id = request.POST.get(j_id, '').strip()
|
||||||
j_alias = request.POST.get(j_alias).strip()
|
j_alias = request.POST.get(j_alias, '').strip()
|
||||||
a = Asset.objects.get(id=j_id)
|
a = Asset.objects.get(id=j_id)
|
||||||
asset_alias = AssetAlias.objects.filter(user=u, host=a)
|
asset_alias = AssetAlias.objects.filter(user=u, host=a)
|
||||||
if asset_alias:
|
if asset_alias:
|
||||||
@ -285,22 +322,29 @@ def host_edit_common_batch(request):
|
|||||||
asset_alias.save()
|
asset_alias.save()
|
||||||
else:
|
else:
|
||||||
AssetAlias.objects.create(user=u, host=a, alias=j_alias)
|
AssetAlias.objects.create(user=u, host=a, alias=j_alias)
|
||||||
return render_to_response('jasset/host_list_common.html')
|
return my_render('jasset/host_list_common.html')
|
||||||
|
|
||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def host_list(request):
|
def host_list(request):
|
||||||
|
""" 列出主机 """
|
||||||
header_title, path1, path2 = u'查看主机', u'资产管理', u'查看主机'
|
header_title, path1, path2 = u'查看主机', u'资产管理', u'查看主机'
|
||||||
keyword = request.GET.get('keyword', '')
|
keyword = request.GET.get('keyword', '')
|
||||||
dept_id = get_user_dept(request)
|
dept_id = get_session_user_info(request)[3]
|
||||||
dept = DEPT.objects.get(id=dept_id)
|
dept = DEPT.objects.get(id=dept_id)
|
||||||
did = request.GET.get('did', '')
|
did = request.GET.get('did', '')
|
||||||
gid = request.GET.get('gid', '')
|
gid = request.GET.get('gid', '')
|
||||||
sid = request.GET.get('sid', '')
|
sid = request.GET.get('sid', '')
|
||||||
|
post_all = Asset.objects.all().order_by('ip')
|
||||||
|
|
||||||
|
post_keyword_all = Asset.objects.filter(Q(ip__contains=keyword) |
|
||||||
|
Q(idc__name__contains=keyword) |
|
||||||
|
Q(bis_group__name__contains=keyword) |
|
||||||
|
Q(comment__contains=keyword)).distinct().order_by('ip')
|
||||||
if did:
|
if did:
|
||||||
dept = DEPT.objects.get(id=did)
|
dept = DEPT.objects.get(id=did)
|
||||||
posts = dept.asset_set.all()
|
posts = dept.asset_set.all()
|
||||||
return render_to_response('jasset/host_list_nop.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_list_nop.html', locals(), request)
|
||||||
|
|
||||||
elif gid:
|
elif gid:
|
||||||
posts = []
|
posts = []
|
||||||
@ -310,7 +354,7 @@ def host_list(request):
|
|||||||
for post in perm.asset_group.asset_set.all():
|
for post in perm.asset_group.asset_set.all():
|
||||||
posts.append(post)
|
posts.append(post)
|
||||||
posts = list(set(posts))
|
posts = list(set(posts))
|
||||||
return render_to_response('jasset/host_list_nop.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_list_nop.html', locals(), request)
|
||||||
|
|
||||||
elif sid:
|
elif sid:
|
||||||
posts = []
|
posts = []
|
||||||
@ -320,63 +364,52 @@ def host_list(request):
|
|||||||
for post in perm.asset_group.asset_set.all():
|
for post in perm.asset_group.asset_set.all():
|
||||||
posts.append(post)
|
posts.append(post)
|
||||||
posts = list(set(posts))
|
posts = list(set(posts))
|
||||||
return render_to_response('jasset/host_list_nop.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_list_nop.html', locals(), request)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if is_super_user(request):
|
if is_super_user(request):
|
||||||
if keyword:
|
if keyword:
|
||||||
posts = Asset.objects.filter(Q(ip__contains=keyword) | Q(idc__name__contains=keyword) |
|
posts = post_keyword_all
|
||||||
Q(bis_group__name__contains=keyword) | Q(
|
|
||||||
comment__contains=keyword)).distinct().order_by('ip')
|
|
||||||
else:
|
else:
|
||||||
posts = Asset.objects.all().order_by('ip')
|
posts = post_all
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
return render_to_response('jasset/host_list.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_list.html', locals(), request)
|
||||||
|
|
||||||
elif is_group_admin(request):
|
elif is_group_admin(request):
|
||||||
if keyword:
|
if keyword:
|
||||||
posts = Asset.objects.filter(Q(ip__contains=keyword) | Q(idc__name__contains=keyword) |
|
posts = post_keyword_all.filter(dept=dept)
|
||||||
Q(bis_group__name__contains=keyword) | Q(
|
|
||||||
comment__contains=keyword)).filter(dept=dept).distinct().order_by('ip')
|
|
||||||
else:
|
else:
|
||||||
posts = Asset.objects.all().filter(dept=dept).order_by('ip')
|
posts = post_all.filter(dept=dept)
|
||||||
|
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
return render_to_response('jasset/host_list.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_list.html', locals(), request)
|
||||||
|
|
||||||
elif is_common_user(request):
|
elif is_common_user(request):
|
||||||
user_id = get_session_user_info(request)[0]
|
user_id, username = get_session_user_info(request)[0:2]
|
||||||
username = get_session_user_info(request)[1]
|
|
||||||
posts = user_perm_asset_api(username)
|
posts = user_perm_asset_api(username)
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
return render_to_response('jasset/host_list_common.html', locals(),
|
return my_render('jasset/host_list_common.html', locals(), request)
|
||||||
context_instance=RequestContext(request))
|
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def host_del(request, offset):
|
def host_del(request, offset):
|
||||||
|
""" 删除主机 """
|
||||||
if offset == 'multi':
|
if offset == 'multi':
|
||||||
len_list = request.POST.get("len_list")
|
len_list = request.POST.get("len_list")
|
||||||
for i in range(int(len_list)):
|
for i in range(int(len_list)):
|
||||||
key = "id_list[" + str(i) + "]"
|
key = "id_list[" + str(i) + "]"
|
||||||
jid = request.POST.get(key)
|
host_id = request.POST.get(key)
|
||||||
if is_group_admin(request) and not validate(request, asset=[jid]):
|
db_host_delete(request, host_id)
|
||||||
return HttpResponseRedirect('/jasset/host_list/')
|
|
||||||
a = Asset.objects.get(id=jid).ip
|
|
||||||
Asset.objects.filter(id=jid).delete()
|
|
||||||
BisGroup.objects.filter(name=a).delete()
|
|
||||||
else:
|
else:
|
||||||
jid = int(offset)
|
host_id = int(offset)
|
||||||
if is_group_admin(request) and not validate(request, asset=[jid]):
|
db_host_delete(request, host_id)
|
||||||
return HttpResponseRedirect('/jasset/host_list/')
|
|
||||||
a = Asset.objects.get(id=jid).ip
|
|
||||||
BisGroup.objects.filter(name=a).delete()
|
|
||||||
Asset.objects.filter(id=jid).delete()
|
|
||||||
return HttpResponseRedirect('/jasset/host_list/')
|
return HttpResponseRedirect('/jasset/host_list/')
|
||||||
|
|
||||||
|
|
||||||
@require_super_user
|
@require_super_user
|
||||||
def host_edit(request):
|
def host_edit(request):
|
||||||
|
""" 修改主机 """
|
||||||
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
|
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
|
||||||
actives = {1: u'激活', 0: u'禁用'}
|
actives = {1: u'激活', 0: u'禁用'}
|
||||||
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
||||||
@ -403,21 +436,23 @@ def host_edit(request):
|
|||||||
j_active = request.POST.get('j_active', '')
|
j_active = request.POST.get('j_active', '')
|
||||||
j_comment = request.POST.get('j_comment', '')
|
j_comment = request.POST.get('j_comment', '')
|
||||||
|
|
||||||
|
host_info = [j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, post]
|
||||||
if j_type == 'M':
|
if j_type == 'M':
|
||||||
j_user = request.POST.get('j_user')
|
j_user = request.POST.get('j_user')
|
||||||
j_password = request.POST.get('j_password')
|
j_password = request.POST.get('j_password')
|
||||||
db_host_update(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, j_user, post, j_password, post)
|
db_host_update(host_info, j_user, j_password)
|
||||||
else:
|
else:
|
||||||
db_host_update(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, post)
|
db_host_update(host_info)
|
||||||
|
|
||||||
smg = u'主机 %s 修改成功' % j_ip
|
smg = u'主机 %s 修改成功' % j_ip
|
||||||
return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id)
|
return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id)
|
||||||
|
|
||||||
return render_to_response('jasset/host_edit.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_edit.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def host_edit_adm(request):
|
def host_edit_adm(request):
|
||||||
|
""" 部门管理员修改主机 """
|
||||||
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
|
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
|
||||||
actives = {1: u'激活', 0: u'禁用'}
|
actives = {1: u'激活', 0: u'禁用'}
|
||||||
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
||||||
@ -443,25 +478,28 @@ def host_edit_adm(request):
|
|||||||
j_active = request.POST.get('j_active')
|
j_active = request.POST.get('j_active')
|
||||||
j_comment = request.POST.get('j_comment')
|
j_comment = request.POST.get('j_comment')
|
||||||
|
|
||||||
|
host_info = [j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment]
|
||||||
|
|
||||||
if not verify(request, asset_group=j_group, edept=j_dept):
|
if not verify(request, asset_group=j_group, edept=j_dept):
|
||||||
emg = u'修改失败,您无权操作!'
|
emg = u'修改失败,您无权操作!'
|
||||||
return render_to_response('jasset/host_edit.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_edit.html', locals(), request)
|
||||||
|
|
||||||
if j_type == 'M':
|
if j_type == 'M':
|
||||||
j_user = request.POST.get('j_user')
|
j_user = request.POST.get('j_user')
|
||||||
j_password = request.POST.get('j_password')
|
j_password = request.POST.get('j_password')
|
||||||
db_host_update(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, post, j_user, j_password)
|
db_host_update(host_info, j_user, j_password, post)
|
||||||
else:
|
else:
|
||||||
db_host_update(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, post)
|
db_host_update(host_info, post)
|
||||||
|
|
||||||
smg = u'主机 %s 修改成功' % j_ip
|
smg = u'主机 %s 修改成功' % j_ip
|
||||||
return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id)
|
return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id)
|
||||||
|
|
||||||
return render_to_response('jasset/host_edit.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_edit.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def host_detail(request):
|
def host_detail(request):
|
||||||
|
""" 主机详情 """
|
||||||
header_title, path1, path2 = u'主机详细信息', u'资产管理', u'主机详情'
|
header_title, path1, path2 = u'主机详细信息', u'资产管理', u'主机详情'
|
||||||
host_id = request.GET.get('id', '')
|
host_id = request.GET.get('id', '')
|
||||||
post = Asset.objects.filter(id=host_id)
|
post = Asset.objects.filter(id=host_id)
|
||||||
@ -482,27 +520,29 @@ def host_detail(request):
|
|||||||
log, log_more = log_all[:10], log_all[10:]
|
log, log_more = log_all[:10], log_all[10:]
|
||||||
user_permed_list = asset_perm_api(post)
|
user_permed_list = asset_perm_api(post)
|
||||||
|
|
||||||
return render_to_response('jasset/host_detail.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_detail.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_super_user
|
@require_super_user
|
||||||
def idc_add(request):
|
def idc_add(request):
|
||||||
|
""" 添加IDC """
|
||||||
header_title, path1, path2 = u'添加IDC', u'资产管理', u'添加IDC'
|
header_title, path1, path2 = u'添加IDC', u'资产管理', u'添加IDC'
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
j_idc = request.POST.get('j_idc')
|
j_idc = request.POST.get('j_idc')
|
||||||
j_comment = request.POST.get('j_comment')
|
j_comment = request.POST.get('j_comment')
|
||||||
if IDC.objects.filter(name=j_idc):
|
if IDC.objects.filter(name=j_idc):
|
||||||
emg = u'该IDC已存在!'
|
emg = u'该IDC已存在!'
|
||||||
return render_to_response('jasset/idc_add.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/idc_add.html', locals(), request)
|
||||||
else:
|
else:
|
||||||
smg = u'IDC:%s添加成功' % j_idc
|
smg = u'IDC:%s添加成功' % j_idc
|
||||||
IDC.objects.create(name=j_idc, comment=j_comment)
|
IDC.objects.create(name=j_idc, comment=j_comment)
|
||||||
|
|
||||||
return render_to_response('jasset/idc_add.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/idc_add.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def idc_list(request):
|
def idc_list(request):
|
||||||
|
""" 列出IDC """
|
||||||
header_title, path1, path2 = u'查看IDC', u'资产管理', u'查看IDC'
|
header_title, path1, path2 = u'查看IDC', u'资产管理', u'查看IDC'
|
||||||
dept_id = get_user_dept(request)
|
dept_id = get_user_dept(request)
|
||||||
dept = DEPT.objects.get(id=dept_id)
|
dept = DEPT.objects.get(id=dept_id)
|
||||||
@ -512,21 +552,24 @@ def idc_list(request):
|
|||||||
else:
|
else:
|
||||||
posts = IDC.objects.exclude(name='ALL').order_by('id')
|
posts = IDC.objects.exclude(name='ALL').order_by('id')
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
return render_to_response('jasset/idc_list.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/idc_list.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_super_user
|
@require_super_user
|
||||||
def idc_edit(request):
|
def idc_edit(request):
|
||||||
|
""" 修改IDC """
|
||||||
header_title, path1, path2 = u'编辑IDC', u'资产管理', u'编辑IDC'
|
header_title, path1, path2 = u'编辑IDC', u'资产管理', u'编辑IDC'
|
||||||
idc_id = request.GET.get('id')
|
idc_id = request.GET.get('id', '')
|
||||||
idc = IDC.objects.filter(id=idc_id)
|
idc = IDC.objects.filter(id=idc_id)
|
||||||
|
if int(idc_id) == 1:
|
||||||
|
return httperror(request, u'默认IDC不能编辑!')
|
||||||
if idc:
|
if idc:
|
||||||
idc = idc[0]
|
idc = idc[0]
|
||||||
default = IDC.objects.get(name='默认').asset_set.all()
|
default = IDC.objects.get(id=1).asset_set.all()
|
||||||
eposts = Asset.objects.filter(idc=idc).order_by('ip')
|
eposts = Asset.objects.filter(idc=idc).order_by('ip')
|
||||||
posts = [g for g in default if g not in eposts]
|
posts = [g for g in default if g not in eposts]
|
||||||
else:
|
else:
|
||||||
emg = '此IDC不存在'
|
return httperror(request, u'此IDC不存在')
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
idc_id = request.POST.get('id')
|
idc_id = request.POST.get('id')
|
||||||
@ -541,69 +584,56 @@ def idc_edit(request):
|
|||||||
for host_id in j_hosts:
|
for host_id in j_hosts:
|
||||||
Asset.objects.filter(id=host_id).update(idc=idc[0])
|
Asset.objects.filter(id=host_id).update(idc=idc[0])
|
||||||
|
|
||||||
i = IDC.objects.get(name='默认')
|
i = IDC.objects.get(id=1)
|
||||||
for host in idc_default:
|
for host in idc_default:
|
||||||
g = Asset.objects.filter(id=host).update(idc=i)
|
g = Asset.objects.filter(id=host).update(idc=i)
|
||||||
else:
|
else:
|
||||||
emg = '此IDC不存在'
|
return httperror(request, u'此IDC不存在')
|
||||||
return render_to_response('jasset/idc_edit.html', locals(), context_instance=RequestContext(request))
|
|
||||||
|
|
||||||
return HttpResponseRedirect('/jasset/idc_list/?id=%s' % idc_id)
|
return HttpResponseRedirect('/jasset/idc_list/?id=%s' % idc_id)
|
||||||
|
|
||||||
return render_to_response('jasset/idc_edit.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/idc_edit.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def idc_detail(request):
|
def idc_detail(request):
|
||||||
|
""" IDC详情 """
|
||||||
header_title, path1, path2 = u'IDC详情', u'资产管理', u'IDC详情'
|
header_title, path1, path2 = u'IDC详情', u'资产管理', u'IDC详情'
|
||||||
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
||||||
idc_id = request.GET.get('id')
|
idc_id = request.GET.get('id', '')
|
||||||
idc_filter = IDC.objects.filter(id=idc_id)
|
idc_filter = IDC.objects.filter(id=idc_id)
|
||||||
if idc_filter:
|
if idc_filter:
|
||||||
idc = idc_filter[0]
|
idc = idc_filter[0]
|
||||||
else:
|
else:
|
||||||
return httperror(request, '没有此IDC')
|
return httperror(request, '没有此IDC')
|
||||||
dept_id = get_user_dept(request)
|
dept = get_session_user_info(request)[5]
|
||||||
dept = DEPT.objects.get(id=dept_id)
|
|
||||||
if is_super_user(request):
|
if is_super_user(request):
|
||||||
posts = Asset.objects.filter(idc=idc).order_by('ip')
|
posts = Asset.objects.filter(idc=idc).order_by('ip')
|
||||||
elif is_group_admin(request):
|
elif is_group_admin(request):
|
||||||
posts = Asset.objects.filter(idc=idc, dept=dept).order_by('ip')
|
posts = Asset.objects.filter(idc=idc, dept=dept).order_by('ip')
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
|
|
||||||
return render_to_response('jasset/idc_detail.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/idc_detail.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_super_user
|
@require_super_user
|
||||||
def idc_del(request):
|
def idc_del(request):
|
||||||
|
""" 删除IDC """
|
||||||
offset = request.GET.get('id', '')
|
offset = request.GET.get('id', '')
|
||||||
default_idc = IDC.objects.get(id=1)
|
|
||||||
if offset == 'multi':
|
if offset == 'multi':
|
||||||
len_list = request.POST.get("len_list")
|
len_list = request.POST.get("len_list")
|
||||||
for i in range(int(len_list)):
|
for i in range(int(len_list)):
|
||||||
key = "id_list[" + str(i) + "]"
|
key = "id_list[" + str(i) + "]"
|
||||||
gid = request.POST.get(key)
|
idc_id = request.POST.get(key)
|
||||||
idc = IDC.objects.filter(id=gid)
|
db_idc_delete(request, idc_id)
|
||||||
if idc:
|
|
||||||
idc_class = idc.first()
|
|
||||||
idc_class.asset_set.update(idc=default_idc)
|
|
||||||
idc.delete()
|
|
||||||
else:
|
|
||||||
return httperror(request, '删除失败, 没有这个IDC!')
|
|
||||||
else:
|
else:
|
||||||
gid = int(offset)
|
db_idc_delete(request, int(offset))
|
||||||
idc = IDC.objects.filter(id=gid)
|
|
||||||
if idc:
|
|
||||||
idc_class = idc.first()
|
|
||||||
idc_class.asset_set.update(idc=default_idc)
|
|
||||||
idc.delete()
|
|
||||||
else:
|
|
||||||
return httperror(request, '删除失败, 没有这个IDC!')
|
|
||||||
return HttpResponseRedirect('/jasset/idc_list/')
|
return HttpResponseRedirect('/jasset/idc_list/')
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def group_add(request):
|
def group_add(request):
|
||||||
|
""" 添加主机组 """
|
||||||
header_title, path1, path2 = u'添加主机组', u'资产管理', u'添加主机组'
|
header_title, path1, path2 = u'添加主机组', u'资产管理', u'添加主机组'
|
||||||
if is_super_user(request):
|
if is_super_user(request):
|
||||||
posts = Asset.objects.all()
|
posts = Asset.objects.all()
|
||||||
@ -621,7 +651,6 @@ def group_add(request):
|
|||||||
j_comment = request.POST.get('j_comment', '')
|
j_comment = request.POST.get('j_comment', '')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
print verify(request, asset=j_hosts, edept=[j_dept]), 'hehe'
|
|
||||||
if is_group_admin(request) and not verify(request, asset=j_hosts, edept=[j_dept]):
|
if is_group_admin(request) and not verify(request, asset=j_hosts, edept=[j_dept]):
|
||||||
emg = u'添加失败, 您无权操作!'
|
emg = u'添加失败, 您无权操作!'
|
||||||
raise RaiseError
|
raise RaiseError
|
||||||
@ -641,11 +670,12 @@ def group_add(request):
|
|||||||
group.asset_set.add(g)
|
group.asset_set.add(g)
|
||||||
smg = u'主机组 %s 添加成功' % j_group
|
smg = u'主机组 %s 添加成功' % j_group
|
||||||
|
|
||||||
return render_to_response('jasset/group_add.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/group_add.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def group_list(request):
|
def group_list(request):
|
||||||
|
""" 列出主机组 """
|
||||||
header_title, path1, path2 = u'查看主机组', u'资产管理', u'查看主机组'
|
header_title, path1, path2 = u'查看主机组', u'资产管理', u'查看主机组'
|
||||||
dept_id = get_user_dept(request)
|
dept_id = get_user_dept(request)
|
||||||
dept = DEPT.objects.get(id=dept_id)
|
dept = DEPT.objects.get(id=dept_id)
|
||||||
@ -680,11 +710,12 @@ def group_list(request):
|
|||||||
else:
|
else:
|
||||||
posts = BisGroup.objects.filter(dept=dept).order_by('id')
|
posts = BisGroup.objects.filter(dept=dept).order_by('id')
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
return render_to_response('jasset/group_list.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/group_list.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def group_edit(request):
|
def group_edit(request):
|
||||||
|
""" 修改主机组 """
|
||||||
header_title, path1, path2 = u'编辑主机组', u'资产管理', u'编辑主机组'
|
header_title, path1, path2 = u'编辑主机组', u'资产管理', u'编辑主机组'
|
||||||
group_id = request.GET.get('id', '')
|
group_id = request.GET.get('id', '')
|
||||||
group = BisGroup.objects.get(id=group_id)
|
group = BisGroup.objects.get(id=group_id)
|
||||||
@ -720,11 +751,12 @@ def group_edit(request):
|
|||||||
smg = u'主机组%s修改成功' % j_group
|
smg = u'主机组%s修改成功' % j_group
|
||||||
return HttpResponseRedirect('/jasset/group_list')
|
return HttpResponseRedirect('/jasset/group_list')
|
||||||
|
|
||||||
return render_to_response('jasset/group_edit.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/group_edit.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def group_detail(request):
|
def group_detail(request):
|
||||||
|
""" 主机组详情 """
|
||||||
header_title, path1, path2 = u'主机组详情', u'资产管理', u'主机组详情'
|
header_title, path1, path2 = u'主机组详情', u'资产管理', u'主机组详情'
|
||||||
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
||||||
dept = get_session_user_info(request)[5]
|
dept = get_session_user_info(request)[5]
|
||||||
@ -735,15 +767,16 @@ def group_detail(request):
|
|||||||
|
|
||||||
elif is_group_admin(request):
|
elif is_group_admin(request):
|
||||||
if not verify(request, asset_group=[group_id]):
|
if not verify(request, asset_group=[group_id]):
|
||||||
return httperror(request, '您无权查看!')
|
return httperror(request, u'您无权查看!')
|
||||||
posts = Asset.objects.filter(bis_group=group).filter(dept=dept).order_by('ip')
|
posts = Asset.objects.filter(bis_group=group).filter(dept=dept).order_by('ip')
|
||||||
|
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
return render_to_response('jasset/group_detail.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/group_detail.html', locals(), request)
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def group_del_host(request):
|
def group_del_host(request):
|
||||||
|
""" 主机组中剔除主机, 并不删除真实主机 """
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
group_id = request.POST.get('group_id')
|
group_id = request.POST.get('group_id')
|
||||||
offset = request.GET.get('id', '')
|
offset = request.GET.get('id', '')
|
||||||
@ -768,6 +801,7 @@ def group_del_host(request):
|
|||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def group_del(request):
|
def group_del(request):
|
||||||
|
""" 删除主机组 """
|
||||||
offset = request.GET.get('id', '')
|
offset = request.GET.get('id', '')
|
||||||
if offset == 'multi':
|
if offset == 'multi':
|
||||||
len_list = request.POST.get("len_list")
|
len_list = request.POST.get("len_list")
|
||||||
@ -785,7 +819,9 @@ def group_del(request):
|
|||||||
return HttpResponseRedirect('/jasset/group_list/')
|
return HttpResponseRedirect('/jasset/group_list/')
|
||||||
|
|
||||||
|
|
||||||
|
@require_admin
|
||||||
def dept_host_ajax(request):
|
def dept_host_ajax(request):
|
||||||
|
""" 添加主机组时, 部门联动主机异步 """
|
||||||
dept_id = request.GET.get('id', '')
|
dept_id = request.GET.get('id', '')
|
||||||
if dept_id not in ['1', '2']:
|
if dept_id not in ['1', '2']:
|
||||||
dept = DEPT.objects.filter(id=dept_id)
|
dept = DEPT.objects.filter(id=dept_id)
|
||||||
@ -795,31 +831,30 @@ def dept_host_ajax(request):
|
|||||||
else:
|
else:
|
||||||
hosts = Asset.objects.all()
|
hosts = Asset.objects.all()
|
||||||
|
|
||||||
return render_to_response('jasset/dept_host_ajax.html', locals())
|
return my_render('jasset/dept_host_ajax.html', locals())
|
||||||
|
|
||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def host_search(request):
|
def host_search(request):
|
||||||
|
""" 搜索主机 """
|
||||||
keyword = request.GET.get('keyword')
|
keyword = request.GET.get('keyword')
|
||||||
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
||||||
dept_id = get_user_dept(request)
|
dept = get_session_user_info(request)[5]
|
||||||
dept = DEPT.objects.get(id=dept_id)
|
post_all = Asset.objects.filter(Q(ip__contains=keyword) |
|
||||||
|
Q(idc__name__contains=keyword) |
|
||||||
|
Q(bis_group__name__contains=keyword) |
|
||||||
|
Q(comment__contains=keyword)).distinct().order_by('ip')
|
||||||
if is_super_user(request):
|
if is_super_user(request):
|
||||||
posts = Asset.objects.filter(Q(ip__contains=keyword) | Q(idc__name__contains=keyword) |
|
posts = post_all
|
||||||
Q(bis_group__name__contains=keyword) | Q(
|
|
||||||
comment__contains=keyword)).distinct().order_by('ip')
|
|
||||||
elif is_group_admin(request):
|
elif is_group_admin(request):
|
||||||
posts = Asset.objects.filter(Q(ip__contains=keyword) | Q(idc__name__contains=keyword) |
|
posts = post_all.filter(dept=dept)
|
||||||
Q(bis_group__name__contains=keyword) | Q(
|
|
||||||
comment__contains=keyword)).filter(dept=dept).distinct().order_by('ip')
|
|
||||||
elif is_common_user(request):
|
elif is_common_user(request):
|
||||||
user_id = request.session.get('user_id')
|
username = get_session_user_info(request)[2]
|
||||||
username = User.objects.get(id=user_id).name
|
|
||||||
post_perm = user_perm_asset_api(username)
|
post_perm = user_perm_asset_api(username)
|
||||||
post_all = Asset.objects.filter(Q(ip__contains=keyword) | Q(idc__name__contains=keyword) |
|
|
||||||
Q(bis_group__name__contains=keyword) | Q(comment__contains=keyword)) \
|
|
||||||
.distinct().order_by('ip')
|
|
||||||
posts = list(set(post_all) & set(post_perm))
|
posts = list(set(post_all) & set(post_perm))
|
||||||
|
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
|
|
||||||
return render_to_response('jasset/host_search.html', locals(), context_instance=RequestContext(request))
|
return my_render('jasset/host_search.html', locals(), request)
|
@ -21,6 +21,7 @@ CONF.read('%s/jumpserver.conf' % BASE_DIR)
|
|||||||
|
|
||||||
|
|
||||||
def get_user_info(request, offset):
|
def get_user_info(request, offset):
|
||||||
|
""" 获取用户信息及环境 """
|
||||||
env_dic = {'online': 0, 'offline': 1}
|
env_dic = {'online': 0, 'offline': 1}
|
||||||
env = env_dic[offset]
|
env = env_dic[offset]
|
||||||
keyword = request.GET.get('keyword', '')
|
keyword = request.GET.get('keyword', '')
|
||||||
@ -33,32 +34,37 @@ def get_user_info(request, offset):
|
|||||||
|
|
||||||
|
|
||||||
def get_user_log(ret_list):
|
def get_user_log(ret_list):
|
||||||
|
""" 获取不同类型用户日志记录 """
|
||||||
request, keyword, env, username, dept_name = ret_list
|
request, keyword, env, username, dept_name = ret_list
|
||||||
|
post_all = Log.objects.filter(is_finished=env).order_by('-start_time')
|
||||||
|
post_keyword_all = Log.objects.filter(Q(user__contains=keyword) |
|
||||||
|
Q(host__contains=keyword)) \
|
||||||
|
.filter(is_finished=env).order_by('-start_time')
|
||||||
|
|
||||||
if is_super_user(request):
|
if is_super_user(request):
|
||||||
if keyword:
|
if keyword:
|
||||||
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
|
posts = post_keyword_all
|
||||||
.filter(is_finished=env).order_by('-start_time')
|
|
||||||
else:
|
else:
|
||||||
posts = Log.objects.filter(is_finished=env).order_by('-start_time')
|
posts = post_all
|
||||||
|
|
||||||
elif is_group_admin(request):
|
elif is_group_admin(request):
|
||||||
if keyword:
|
if keyword:
|
||||||
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
|
posts = post_keyword_all.filter(dept_name=dept_name)
|
||||||
.filter(is_finished=env).filter(dept_name=dept_name).order_by('-start_time')
|
|
||||||
else:
|
else:
|
||||||
posts = Log.objects.filter(is_finished=env).filter(dept_name=dept_name).order_by('-start_time')
|
posts = post_all.filter(dept_name=dept_name)
|
||||||
|
|
||||||
elif is_common_user(request):
|
elif is_common_user(request):
|
||||||
if keyword:
|
if keyword:
|
||||||
posts = Log.objects.filter(user=username).filter(Q(user__contains=keyword) | Q(host__contains=keyword))\
|
posts = post_keyword_all.filter(user=username)
|
||||||
.filter(is_finished=env).order_by('-start_time')
|
|
||||||
else:
|
else:
|
||||||
posts = Log.objects.filter(is_finished=env).filter(user=username).order_by('-start_time')
|
posts = post_all.filter(user=username)
|
||||||
|
|
||||||
return posts
|
return posts
|
||||||
|
|
||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def log_list(request, offset):
|
def log_list(request, offset):
|
||||||
|
""" 显示日志 """
|
||||||
header_title, path1, path2 = u'查看日志', u'查看日志', u'在线用户'
|
header_title, path1, path2 = u'查看日志', u'查看日志', u'在线用户'
|
||||||
keyword = request.GET.get('keyword', '')
|
keyword = request.GET.get('keyword', '')
|
||||||
web_socket_host = CONF.get('websocket', 'web_socket_host')
|
web_socket_host = CONF.get('websocket', 'web_socket_host')
|
||||||
@ -70,6 +76,7 @@ def log_list(request, offset):
|
|||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def log_kill(request):
|
def log_kill(request):
|
||||||
|
""" 杀掉connect进程 """
|
||||||
pid = request.GET.get('id', '')
|
pid = request.GET.get('id', '')
|
||||||
log = Log.objects.filter(pid=pid)
|
log = Log.objects.filter(pid=pid)
|
||||||
if log:
|
if log:
|
||||||
@ -85,6 +92,7 @@ def log_kill(request):
|
|||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def log_history(request):
|
def log_history(request):
|
||||||
|
""" 命令历史记录 """
|
||||||
log_id = request.GET.get('id', 0)
|
log_id = request.GET.get('id', 0)
|
||||||
log = Log.objects.filter(id=int(log_id))
|
log = Log.objects.filter(id=int(log_id))
|
||||||
if log:
|
if log:
|
||||||
@ -108,6 +116,7 @@ def log_history(request):
|
|||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def log_search(request):
|
def log_search(request):
|
||||||
|
""" 日志搜索 """
|
||||||
offset = request.GET.get('env', '')
|
offset = request.GET.get('env', '')
|
||||||
keyword = request.GET.get('keyword', '')
|
keyword = request.GET.get('keyword', '')
|
||||||
posts = get_user_log(get_user_info(request, offset))
|
posts = get_user_log(get_user_info(request, offset))
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
reload(sys)
|
reload(sys)
|
||||||
sys.setdefaultencoding('utf8')
|
sys.setdefaultencoding('utf8')
|
||||||
|
|
||||||
@ -182,6 +183,7 @@ def perm_edit_adm(request):
|
|||||||
return HttpResponseRedirect('/jperm/perm_list/')
|
return HttpResponseRedirect('/jperm/perm_list/')
|
||||||
return render_to_response('jperm/perm_edit.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jperm/perm_edit.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def perm_detail(request):
|
def perm_detail(request):
|
||||||
header_title, path1, path2 = u'编辑授权', u'授权管理', u'授权详情'
|
header_title, path1, path2 = u'编辑授权', u'授权管理', u'授权详情'
|
||||||
@ -225,7 +227,7 @@ def perm_asset_detail(request):
|
|||||||
|
|
||||||
|
|
||||||
# def sudo_db_add(name, user_runas, user_groups_select, asset_groups_select, cmd_groups_select, comment):
|
# def sudo_db_add(name, user_runas, user_groups_select, asset_groups_select, cmd_groups_select, comment):
|
||||||
# user_groups_select_list, asset_groups_select_list, cmd_groups_select_list = \
|
# user_groups_select_list, asset_groups_select_list, cmd_groups_select_list = \
|
||||||
# user_asset_cmd_groups_get(user_groups_select, asset_groups_select, cmd_groups_select)
|
# user_asset_cmd_groups_get(user_groups_select, asset_groups_select, cmd_groups_select)
|
||||||
#
|
#
|
||||||
# sudo_perm = SudoPerm(name=name, user_runas=user_runas, comment=comment)
|
# sudo_perm = SudoPerm(name=name, user_runas=user_runas, comment=comment)
|
||||||
@ -241,7 +243,6 @@ def unicode2str(unicode_list):
|
|||||||
|
|
||||||
def sudo_ldap_add(user_group, user_runas, asset_groups_select,
|
def sudo_ldap_add(user_group, user_runas, asset_groups_select,
|
||||||
cmd_groups_select):
|
cmd_groups_select):
|
||||||
|
|
||||||
if not LDAP_ENABLE:
|
if not LDAP_ENABLE:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -479,6 +480,7 @@ def sudo_refresh(request):
|
|||||||
sudo_ldap_add(user_group, user_runas, asset_groups_select, cmd_groups_select)
|
sudo_ldap_add(user_group, user_runas, asset_groups_select, cmd_groups_select)
|
||||||
return HttpResponse('ok')
|
return HttpResponse('ok')
|
||||||
|
|
||||||
|
|
||||||
# @require_admin
|
# @require_admin
|
||||||
# def sudo_detail(request):
|
# def sudo_detail(request):
|
||||||
# header_title, path1, path2 = u'Sudo授权详情', u'授权管理', u'授权详情'
|
# header_title, path1, path2 = u'Sudo授权详情', u'授权管理', u'授权详情'
|
||||||
@ -669,15 +671,19 @@ def cmd_detail(request):
|
|||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def perm_apply(request):
|
def perm_apply(request):
|
||||||
|
""" 权限申请 """
|
||||||
header_title, path1, path2 = u'主机权限申请', u'权限管理', u'申请主机'
|
header_title, path1, path2 = u'主机权限申请', u'权限管理', u'申请主机'
|
||||||
user_id, username = get_session_user_info(request)[0:2]
|
user_id, username = get_session_user_info(request)[0:2]
|
||||||
dept_id, deptname, dept = get_session_user_info(request)[3:6]
|
dept_id, deptname, dept = get_session_user_info(request)[3:6]
|
||||||
perm_host = user_perm_asset_api(username)
|
perm_host = user_perm_asset_api(username)
|
||||||
all_host = Asset.objects.filter(dept=dept)
|
all_host = Asset.objects.filter(dept=dept)
|
||||||
|
|
||||||
perm_group = user_perm_group_api(username)
|
perm_group = user_perm_group_api(username)
|
||||||
all_group = dept.bisgroup_set.all()
|
all_group = dept.bisgroup_set.all()
|
||||||
|
|
||||||
posts = [g for g in all_host if g not in perm_host]
|
posts = [g for g in all_host if g not in perm_host]
|
||||||
egroup = [d for d in all_group if d not in perm_group]
|
egroup = [d for d in all_group if d not in perm_group]
|
||||||
|
|
||||||
dept_da = User.objects.filter(dept_id=dept_id, role='DA')
|
dept_da = User.objects.filter(dept_id=dept_id, role='DA')
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
@ -693,7 +699,8 @@ def perm_apply(request):
|
|||||||
group_lis = ', '.join(group)
|
group_lis = ', '.join(group)
|
||||||
hosts_lis = ', '.join(hosts)
|
hosts_lis = ', '.join(hosts)
|
||||||
time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||||
a = Apply.objects.create(applyer=applyer, dept=dept, bisgroup=group, date_add=datetime.datetime.now(), asset=hosts, status=0, comment=comment)
|
a = Apply.objects.create(applyer=applyer, dept=dept, bisgroup=group, date_add=datetime.datetime.now(),
|
||||||
|
asset=hosts, status=0, comment=comment)
|
||||||
uuid = a.uuid
|
uuid = a.uuid
|
||||||
url = "http://%s:%s/jperm/apply_exec/?uuid=%s" % (SEND_IP, SEND_PORT, uuid)
|
url = "http://%s:%s/jperm/apply_exec/?uuid=%s" % (SEND_IP, SEND_PORT, uuid)
|
||||||
mail_msg = """
|
mail_msg = """
|
||||||
@ -710,13 +717,14 @@ def perm_apply(request):
|
|||||||
""" % (da.username, applyer, group_lis, hosts_lis, time_now, comment, url)
|
""" % (da.username, applyer, group_lis, hosts_lis, time_now, comment, url)
|
||||||
|
|
||||||
send_mail(mail_title, mail_msg, MAIL_FROM, [mail_address], fail_silently=False)
|
send_mail(mail_title, mail_msg, MAIL_FROM, [mail_address], fail_silently=False)
|
||||||
smg = "提交成功,已发邮件通知部门管理员。"
|
smg = "提交成功,已发邮件至 %s 通知部门管理员。" % mail_address
|
||||||
return render_to_response('jperm/perm_apply.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jperm/perm_apply.html', locals(), context_instance=RequestContext(request))
|
||||||
return render_to_response('jperm/perm_apply.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jperm/perm_apply.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def perm_apply_exec(request):
|
def perm_apply_exec(request):
|
||||||
|
""" 确认权限 """
|
||||||
header_title, path1, path2 = u'主机权限申请', u'权限管理', u'审批完成'
|
header_title, path1, path2 = u'主机权限申请', u'权限管理', u'审批完成'
|
||||||
uuid = request.GET.get('uuid')
|
uuid = request.GET.get('uuid')
|
||||||
user_id = request.session.get('user_id')
|
user_id = request.session.get('user_id')
|
||||||
@ -737,7 +745,7 @@ def perm_apply_exec(request):
|
|||||||
Hi,%s:
|
Hi,%s:
|
||||||
您所申请的权限已由 %s 在 %s 审批完成, 请登录验证。
|
您所申请的权限已由 %s 在 %s 审批完成, 请登录验证。
|
||||||
""" % (q_apply.applyer, q_apply.approver, time_now)
|
""" % (q_apply.applyer, q_apply.approver, time_now)
|
||||||
send_mail(mail_title, mail_msg, 'jkfunshion@fun.tv', [mail_address], fail_silently=False)
|
send_mail(mail_title, mail_msg, MAIL_FROM, [mail_address], fail_silently=False)
|
||||||
smg = '授权完成, 已邮件通知申请人, 十秒钟后返回首页'
|
smg = '授权完成, 已邮件通知申请人, 十秒钟后返回首页'
|
||||||
return render_to_response('jperm/perm_apply_exec.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jperm/perm_apply_exec.html', locals(), context_instance=RequestContext(request))
|
||||||
else:
|
else:
|
||||||
@ -746,37 +754,38 @@ def perm_apply_exec(request):
|
|||||||
|
|
||||||
|
|
||||||
def get_apply_posts(request, status, username, dept_name, keyword=None):
|
def get_apply_posts(request, status, username, dept_name, keyword=None):
|
||||||
|
""" 获取申请记录 """
|
||||||
|
post_all = Apply.objects.filter(status=status).order_by('-date_add')
|
||||||
|
post_keyword_all = Apply.objects.filter(Q(applyer__contains=keyword) |
|
||||||
|
Q(approver__contains=keyword)) \
|
||||||
|
.filter(status=status).order_by('-date_add')
|
||||||
|
|
||||||
if is_super_user(request):
|
if is_super_user(request):
|
||||||
if keyword:
|
if keyword:
|
||||||
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
|
posts = post_keyword_all
|
||||||
.filter(status=status).order_by('-date_add')
|
|
||||||
else:
|
else:
|
||||||
posts = Apply.objects.filter(status=status).order_by('-date_add')
|
posts = post_all
|
||||||
|
|
||||||
elif is_group_admin(request):
|
elif is_group_admin(request):
|
||||||
if keyword:
|
if keyword:
|
||||||
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
|
posts = post_keyword_all.filter(dept=dept_name)
|
||||||
.filter(status=status).filter(dept=dept_name).order_by('-date_add')
|
|
||||||
else:
|
else:
|
||||||
posts = Apply.objects.filter(status=status).filter(dept=dept_name).order_by('-date_add')
|
posts = post_all.filter(dept=dept_name)
|
||||||
|
|
||||||
elif is_common_user(request):
|
elif is_common_user(request):
|
||||||
if keyword:
|
if keyword:
|
||||||
posts = Apply.objects.filter(applyer=username).filter(status=status).filter(Q(applyer__contains=keyword) |
|
posts = post_keyword_all.filter(user=username)
|
||||||
Q(asset__contains=keyword)).order_by('-date_add')
|
|
||||||
else:
|
else:
|
||||||
posts = Apply.objects.filter(applyer=username).filter(status=status).order_by('-date_add')
|
posts = post_all.filter(user=username)
|
||||||
|
|
||||||
return posts
|
return posts
|
||||||
|
|
||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def perm_apply_log(request, offset):
|
def perm_apply_log(request, offset):
|
||||||
|
""" 申请记录 """
|
||||||
header_title, path1, path2 = u'权限申请记录', u'权限管理', u'申请记录'
|
header_title, path1, path2 = u'权限申请记录', u'权限管理', u'申请记录'
|
||||||
keyword = request.GET.get('keyword')
|
keyword = request.GET.get('keyword', '')
|
||||||
dept_id = get_user_dept(request)
|
username = get_session_user_info(request)[1]
|
||||||
dept_name = DEPT.objects.get(id=dept_id).name
|
dept_name = get_session_user_info(request)[4]
|
||||||
user_id = request.session.get('user_id')
|
|
||||||
username = User.objects.get(id=user_id).username
|
|
||||||
status_dic = {'online': 0, 'offline': 1}
|
status_dic = {'online': 0, 'offline': 1}
|
||||||
status = status_dic[offset]
|
status = status_dic[offset]
|
||||||
posts = get_apply_posts(request, status, username, dept_name, keyword)
|
posts = get_apply_posts(request, status, username, dept_name, keyword)
|
||||||
@ -786,6 +795,7 @@ def perm_apply_log(request, offset):
|
|||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def perm_apply_info(request):
|
def perm_apply_info(request):
|
||||||
|
""" 申请信息详情 """
|
||||||
uuid = request.GET.get('uuid')
|
uuid = request.GET.get('uuid')
|
||||||
post = Apply.objects.get(uuid=uuid)
|
post = Apply.objects.get(uuid=uuid)
|
||||||
return render_to_response('jperm/perm_apply_info.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jperm/perm_apply_info.html', locals(), context_instance=RequestContext(request))
|
||||||
@ -793,6 +803,7 @@ def perm_apply_info(request):
|
|||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def perm_apply_del(request):
|
def perm_apply_del(request):
|
||||||
|
""" 删除日志记录 """
|
||||||
uuid = request.GET.get('uuid')
|
uuid = request.GET.get('uuid')
|
||||||
u_apply = Apply.objects.filter(uuid=uuid)
|
u_apply = Apply.objects.filter(uuid=uuid)
|
||||||
if u_apply:
|
if u_apply:
|
||||||
@ -802,12 +813,11 @@ def perm_apply_del(request):
|
|||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def perm_apply_search(request):
|
def perm_apply_search(request):
|
||||||
|
""" 申请搜索 """
|
||||||
keyword = request.GET.get('keyword')
|
keyword = request.GET.get('keyword')
|
||||||
offset = request.GET.get('env')
|
offset = request.GET.get('env')
|
||||||
dept_id = get_user_dept(request)
|
username = get_session_user_info(request)[1]
|
||||||
dept_name = DEPT.objects.get(id=dept_id).name
|
dept_name = get_session_user_info(request)[3]
|
||||||
user_id = request.session.get('user_id')
|
|
||||||
username = User.objects.get(id=user_id).username
|
|
||||||
status_dic = {'online': 0, 'offline': 1}
|
status_dic = {'online': 0, 'offline': 1}
|
||||||
status = status_dic[offset]
|
status = status_dic[offset]
|
||||||
posts = get_apply_posts(request, status, username, dept_name, keyword)
|
posts = get_apply_posts(request, status, username, dept_name, keyword)
|
||||||
|
@ -66,19 +66,36 @@ def index_cu(request):
|
|||||||
return render_to_response('index_cu.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('index_cu.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_login
|
||||||
def admin_index(request):
|
def index(request):
|
||||||
user_id = request.session.get('user_id', '')
|
li_date, li_str = getDaysByNum(7)
|
||||||
user = User.objects.get(id=user_id)
|
today = datetime.datetime.now().day
|
||||||
dept = user.dept
|
from_week = datetime.datetime.now() - datetime.timedelta(days=7)
|
||||||
dept_name = user.dept.name
|
|
||||||
users = User.objects.filter(dept=dept)
|
if is_common_user(request):
|
||||||
hosts = Asset.objects.filter(dept=dept)
|
return index_cu(request)
|
||||||
online = Log.objects.filter(dept_name=dept_name, is_finished=0)
|
|
||||||
online_host = online.values('host').distinct()
|
elif is_super_user(request):
|
||||||
online_user = online.values('user').distinct()
|
users = User.objects.all()
|
||||||
active_users = users.filter(is_active=1)
|
hosts = Asset.objects.all()
|
||||||
active_hosts = hosts.filter(is_active=1)
|
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 = get_session_user_info(request)[2]
|
||||||
|
dept_name, dept = get_session_user_info(request)[4:]
|
||||||
|
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()])
|
||||||
|
|
||||||
# percent of dashboard
|
# percent of dashboard
|
||||||
if users.count() == 0:
|
if users.count() == 0:
|
||||||
@ -92,10 +109,6 @@ def admin_index(request):
|
|||||||
percent_host = format(active_hosts.count() / hosts.count(), '.0%')
|
percent_host = format(active_hosts.count() / hosts.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]
|
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]
|
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')
|
user_dic, host_dic = get_data(week_data, user_top_ten, 'user'), get_data(week_data, host_top_ten, 'host')
|
||||||
@ -119,78 +132,6 @@ def admin_index(request):
|
|||||||
username = user_info.get('user')
|
username = user_info.get('user')
|
||||||
last = Log.objects.filter(user=username).latest('start_time')
|
last = Log.objects.filter(user=username).latest('start_time')
|
||||||
user_info['last'] = last
|
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_login
|
|
||||||
def index(request):
|
|
||||||
if is_common_user(request):
|
|
||||||
return index_cu(request)
|
|
||||||
|
|
||||||
if is_group_admin(request):
|
|
||||||
return admin_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
|
|
||||||
if users.count() == 0:
|
|
||||||
percent_user, percent_online_user = '0%', '0%'
|
|
||||||
else:
|
|
||||||
percent_user = format(active_users.count() / users.count(), '.0%')
|
|
||||||
percent_online_user = format(online_user.count() / users.count(), '.0%')
|
|
||||||
if hosts.count() == 0:
|
|
||||||
percent_host, percent_online_host = '0%', '0%'
|
|
||||||
else:
|
|
||||||
percent_host = format(active_hosts.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(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]
|
|
||||||
login_more_10 = Log.objects.order_by('-start_time')[10:20]
|
|
||||||
|
|
||||||
# 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 = {'user': '活跃用户数', 'host': '活跃主机数', 'times': '登录次数'}
|
||||||
top_dic = {}
|
top_dic = {}
|
||||||
|
@ -70,10 +70,13 @@ function move(from, to, from_o, to_o) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function move_left(from, to) {
|
function move_left(from, to, from_o, to_o) {
|
||||||
$("#" + from + " option").each(function () {
|
$("#" + from + " option").each(function () {
|
||||||
if ($(this).prop("selected") == true) {
|
if ($(this).prop("selected") == true) {
|
||||||
$("#" + to).append(this);
|
$("#" + to).append(this);
|
||||||
|
if( typeof from_o !== 'undefined'){
|
||||||
|
$("#"+to_o).append($("#"+from_o +" option[value='"+this.value+"']"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$(this).attr("selected",'true');
|
$(this).attr("selected",'true');
|
||||||
});
|
});
|
||||||
|
@ -2,6 +2,21 @@
|
|||||||
{% load mytags %}
|
{% load mytags %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% include 'nav_cat_bar.html' %}
|
{% include 'nav_cat_bar.html' %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
function search_ip(text, noselect, total){
|
||||||
|
$("#" + noselect).children().each(
|
||||||
|
function(){
|
||||||
|
$(this).remove();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#" + total).children().each(function(){
|
||||||
|
if($(this).text().search(text) != -1){
|
||||||
|
$("#" + noselect).append($(this).clone())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<div class="wrapper wrapper-content animated fadeInRight">
|
<div class="wrapper wrapper-content animated fadeInRight">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-10">
|
<div class="col-lg-10">
|
||||||
@ -26,6 +41,19 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<select id="assets_total" name="assets" class="form-control m-b" size="12" multiple style="display: none">
|
||||||
|
{% for asset in posts %}
|
||||||
|
<option value="{{ asset.id }}">{{ asset.ip }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="asset_select_total" name="j_hosts" class="form-control m-b" size="12" multiple style="display: none">
|
||||||
|
{% for asset in eposts %}
|
||||||
|
<option value="{{ asset.id }}">{{ asset.ip }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
{% if emg %}
|
{% if emg %}
|
||||||
<div class="alert alert-warning text-center">{{ emg }}</div>
|
<div class="alert alert-warning text-center">{{ emg }}</div>
|
||||||
@ -63,35 +91,40 @@
|
|||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div>
|
<label for="group_name" class="col-sm-2 control-label">过滤</label>
|
||||||
<label for="hosts" class="col-lg-2 control-label">主机</label>
|
<div class="col-sm-4">
|
||||||
<div class="col-sm-3">
|
<input id="noselect" class="form-control" oninput="search_ip(this.value, 'assets', 'assets_total')">
|
||||||
<select multiple="multiple" id="id_domains_filter" name="domains_filter" style="display: none;">
|
</div>
|
||||||
</select>
|
<div class="col-sm-1">
|
||||||
<div class="input-group" style="padding-bottom: 5px">
|
</div>
|
||||||
<input type="text" size="19" class="form-control input-sm" id="search" name="keyword" placeholder="过滤">
|
<div id="select" class="col-sm-3">
|
||||||
</div>
|
<input class="form-control" oninput="search_ip(this.value, 'asset_select', 'asset_select_total')">
|
||||||
<select id="hosts" size="12" class="form-control m-b" multiple>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="" class="col-sm-2 control-label">主机<span class="red-fonts">*</span></label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div>
|
||||||
|
<select id="assets" name="assets" class="form-control m-b" size="12" multiple>
|
||||||
{% for post in posts %}
|
{% for post in posts %}
|
||||||
<option value="{{ post.id }}">{{ post.ip }}</option>
|
<option value="{{ post.id }}">{{ post.ip }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-1">
|
</div>
|
||||||
<div class="btn-group" style="margin-top: 50px;">
|
|
||||||
<button type="button" class="btn btn-xm btn-white" onclick="move('hosts', 'hosts_selected')"><i class="fa fa-chevron-right"></i></button>
|
<div class="col-sm-1">
|
||||||
<button type="button" class="btn btn-xm btn-white" onclick="move_left('hosts_selected', 'hosts')"><i class="fa fa-chevron-left"></i></button>
|
<div class="btn-group" style="margin-top: 60px;">
|
||||||
</div>
|
<button type="button" class="btn btn-white" onclick="move('assets', 'asset_select', 'assets_total', 'asset_select_total' )"><i class="fa fa-chevron-right"></i></button>
|
||||||
|
<button type="button" class="btn btn-white" onclick="move_left('asset_select', 'assets', 'asset_select_total', 'assets_total')"><i class="fa fa-chevron-left"></i> </button>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3">
|
</div>
|
||||||
<h4 style="padding-bottom: 5px">已选中主机</h4>
|
|
||||||
<div>
|
<div class="col-sm-3">
|
||||||
<select id="hosts_selected" name="j_hosts" class="form-control m-b" size="12" multiple>
|
<div>
|
||||||
{% for post in eposts %}
|
<select id="asset_select" name="j_hosts" class="form-control m-b" size="12" multiple></select>
|
||||||
<option value="{{ post.id }}">{{ post.ip }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -105,7 +138,7 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-4 col-sm-offset-5">
|
<div class="col-sm-4 col-sm-offset-5">
|
||||||
<button class="btn btn-white" type="submit"> 重置 </button>
|
<button class="btn btn-white" type="submit"> 重置 </button>
|
||||||
<button class="btn btn-primary" type="submit" onclick="on_submit('groups_selected') "> 提交 </button>
|
<button class="btn btn-primary" id="submit_button" type="submit" onclick="on_submit('groups_selected') "> 提交 </button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -116,6 +149,15 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
$("#submit_button").click(function(){
|
||||||
|
$('#assetForm option').each(function(){
|
||||||
|
$(this).prop('selected', true)
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
$('#assetForm').validator({
|
$('#assetForm').validator({
|
||||||
timely: 2,
|
timely: 2,
|
||||||
theme: "yellow_right_effect",
|
theme: "yellow_right_effect",
|
||||||
@ -140,15 +182,15 @@
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
$('#search').keyup(function() {
|
// $('#search').keyup(function() {
|
||||||
var $rows = $('#hosts option');
|
// var $rows = $('#hosts option');
|
||||||
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
|
// var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
|
||||||
|
//
|
||||||
$rows.show().filter(function() {
|
// $rows.show().filter(function() {
|
||||||
var text = $(this).text().replace(/\s+/g, ' ').toLowerCase();
|
// var text = $(this).text().replace(/\s+/g, ' ').toLowerCase();
|
||||||
return !~text.indexOf(val);
|
// return !~text.indexOf(val);
|
||||||
}).hide();
|
// }).hide();
|
||||||
});
|
// });
|
||||||
|
|
||||||
function change_dept(dept_id){
|
function change_dept(dept_id){
|
||||||
$.get('/jasset/dept_host_ajax/',
|
$.get('/jasset/dept_host_ajax/',
|
||||||
@ -157,6 +199,7 @@
|
|||||||
$('#hosts').html(data)
|
$('#hosts').html(data)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -75,7 +75,78 @@
|
|||||||
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
|
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
|
||||||
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
|
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
|
||||||
</div>
|
</div>
|
||||||
{% include 'paginator.html' %}
|
<div class="col-sm-6">
|
||||||
|
<div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
|
||||||
|
<ul class="pagination" style="margin-top: 0; float: right">
|
||||||
|
{% if keyword %}
|
||||||
|
{% if contacts.has_previous %}
|
||||||
|
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
|
||||||
|
<a href="?keyword={{ keyword }}&page={{ contacts.previous_page_number }}">Previous</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" id="editable_previous">
|
||||||
|
<a href="#">Previous</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% ifequal show_first 1 %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page=1&id={{ group.id }}" title="第1页">1...</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% for page in page_range %}
|
||||||
|
{% ifequal current_page page %}
|
||||||
|
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page={{ page }}&id={{ group.id }}" title="第{{ page }}页">{{ page }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page={{ page }}&id={{ group.id }}" title="第{{ page }}页">{{ page }}</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% endfor %}
|
||||||
|
{% ifequal show_end 1 %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page={{ p.num_pages }}&id={{ group.id }}" title="第{{ page }}页">...{{ p.num_pages }}</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% if contacts.has_next %}
|
||||||
|
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
|
||||||
|
<a href="?keyword={{ keyword }}&page={{ contacts.next_page_number }}&id={{ group.id }}">Next</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
|
||||||
|
<a href="#">Next</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
{% if contacts.has_previous %}
|
||||||
|
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
|
||||||
|
<a href="?page={{ contacts.previous_page_number }}&id={{ group.id }}">Previous</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" id="editable_previous">
|
||||||
|
<a href="#">Previous</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% ifequal show_first 1 %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page=1&id={{ group.id }}" title="第1页">1...</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% for page in page_range %}
|
||||||
|
{% ifequal current_page page %}
|
||||||
|
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?page={{ page }}&id={{ group.id }}" title="第{{ page }}页">{{ page }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page={{ page }}&id={{ group.id }}" title="第{{ page }}页">{{ page }}</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% endfor %}
|
||||||
|
{% ifequal show_end 1 %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page={{ p.num_pages }}&id={{ group.id }}" title="第{{ page }}页">...{{ p.num_pages }}</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% if contacts.has_next %}
|
||||||
|
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
|
||||||
|
<a href="?page={{ contacts.next_page_number }}&id={{ group.id }}">Next</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
|
||||||
|
<a href="#">Next</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -2,13 +2,58 @@
|
|||||||
{% load mytags %}
|
{% load mytags %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% include 'nav_cat_bar.html' %}
|
{% include 'nav_cat_bar.html' %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
function search_ip(text, noselect, total){
|
||||||
|
$("#" + noselect).children().each(
|
||||||
|
function(){
|
||||||
|
$(this).remove();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#" + total).children().each(function(){
|
||||||
|
if($(this).text().search(text) != -1){
|
||||||
|
$("#" + noselect).append($(this).clone())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<div class="wrapper wrapper-content animated fadeInRight">
|
<div class="wrapper wrapper-content animated fadeInRight">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-10">
|
<div class="col-lg-10">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
<div id="ibox-content" class="ibox-title">
|
<div id="ibox-content" class="ibox-title">
|
||||||
<h5> 填写主机组基本信息 </h5>
|
<h5> 填写主机组基本信息 </h5>
|
||||||
</div>
|
<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>
|
||||||
|
|
||||||
|
<select id="assets_total" name="assets" class="form-control m-b" size="12" multiple style="display: none">
|
||||||
|
{% for asset in posts %}
|
||||||
|
<option value="{{ asset.id }}">{{ asset.ip }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="asset_select_total" name="j_hosts" class="form-control m-b" size="12" multiple style="display: none">
|
||||||
|
{% for asset in eposts %}
|
||||||
|
<option value="{{ asset.id }}">{{ asset.ip }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
{% if emg %}
|
{% if emg %}
|
||||||
<div class="alert alert-warning text-center">{{ emg }}</div>
|
<div class="alert alert-warning text-center">{{ emg }}</div>
|
||||||
@ -48,37 +93,46 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div>
|
<label for="group_name" class="col-sm-2 control-label">过滤</label>
|
||||||
<label for="hosts" class="col-lg-2 control-label">主机</label>
|
<div class="col-sm-4">
|
||||||
<div class="col-sm-3">
|
<input id="noselect" class="form-control" oninput="search_ip(this.value, 'assets', 'assets_total')">
|
||||||
<select multiple="multiple" id="id_domains_filter" name="domains_filter" style="display: none;">
|
</div>
|
||||||
</select>
|
<div class="col-sm-1">
|
||||||
<div class="input-group" style="padding-bottom: 5px">
|
</div>
|
||||||
<input type="text" size="19" class="form-control input-sm" id="search" name="keyword" placeholder="过滤">
|
<div id="select" class="col-sm-3">
|
||||||
</div>
|
<input class="form-control" oninput="search_ip(this.value, 'asset_select', 'asset_select_total')">
|
||||||
<select id="hosts" size="12" class="form-control m-b" multiple>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="" class="col-sm-2 control-label">主机<span class="red-fonts">*</span></label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div>
|
||||||
|
<select id="assets" name="assets" class="form-control m-b" size="12" multiple>
|
||||||
{% for post in posts %}
|
{% for post in posts %}
|
||||||
<option value="{{ post.id }}">{{ post.ip }}</option>
|
<option value="{{ post.id }}">{{ post.ip }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-1">
|
</div>
|
||||||
<div class="btn-group" style="margin-top: 50px;">
|
|
||||||
<button type="button" class="btn btn-xm btn-white" onclick="move('hosts', 'hosts_selected')"><i class="fa fa-chevron-right"></i></button>
|
<div class="col-sm-1">
|
||||||
<button type="button" class="btn btn-xm btn-white" onclick="move_left('hosts_selected', 'hosts')"><i class="fa fa-chevron-left"></i></button>
|
<div class="btn-group" style="margin-top: 60px;">
|
||||||
</div>
|
<button type="button" class="btn btn-white" onclick="move('assets', 'asset_select', 'assets_total', 'asset_select_total' )"><i class="fa fa-chevron-right"></i></button>
|
||||||
|
<button type="button" class="btn btn-white" onclick="move_left('asset_select', 'assets', 'asset_select_total', 'assets_total')"><i class="fa fa-chevron-left"></i> </button>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3">
|
</div>
|
||||||
<h4 style="padding-bottom: 5px">已选中主机</h4>
|
|
||||||
<div>
|
<div class="col-sm-3">
|
||||||
<select id="hosts_selected" name="j_hosts" class="form-control m-b" size="12" multiple>
|
<div>
|
||||||
{% for post in eposts %}
|
<select id="asset_select" name="j_hosts" class="form-control m-b" size="12" multiple>
|
||||||
<option value="{{ post.id }}">{{ post.ip }}</option>
|
{% for asset in eposts %}
|
||||||
{% endfor %}
|
<option value="{{ asset.id }}">{{ asset.ip }}</option>
|
||||||
</select>
|
{% endfor %}
|
||||||
</div>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -92,7 +146,7 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-4 col-sm-offset-5">
|
<div class="col-sm-4 col-sm-offset-5">
|
||||||
<button class="btn btn-white" type="submit"> 重置 </button>
|
<button class="btn btn-white" type="submit"> 重置 </button>
|
||||||
<button class="btn btn-primary" type="submit" onclick="on_submit('groups_selected') "> 提交 </button>
|
<button class="btn btn-primary" id="submit_button" type="submit" onclick="on_submit('groups_selected') "> 提交 </button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -103,6 +157,15 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
$("#submit_button").click(function(){
|
||||||
|
$('#assetForm option').each(function(){
|
||||||
|
$(this).prop('selected', true)
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
$('#assetForm').validator({
|
$('#assetForm').validator({
|
||||||
timely: 2,
|
timely: 2,
|
||||||
theme: "yellow_right_effect",
|
theme: "yellow_right_effect",
|
||||||
@ -127,16 +190,16 @@
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
$('#search').keyup(function() {
|
// $('#search').keyup(function() {
|
||||||
var $rows = $('#hosts option');
|
// var $rows = $('#hosts option');
|
||||||
console.log($rows);
|
// console.log($rows);
|
||||||
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
|
// var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
|
||||||
|
//
|
||||||
$rows.show().filter(function() {
|
// $rows.show().filter(function() {
|
||||||
var text = $(this).text().replace(/\s+/g, ' ').toLowerCase();
|
// var text = $(this).text().replace(/\s+/g, ' ').toLowerCase();
|
||||||
return !~text.indexOf(val);
|
// return !~text.indexOf(val);
|
||||||
}).hide();
|
// }).hide();
|
||||||
});
|
// });
|
||||||
|
|
||||||
function change_dept(dept_id){
|
function change_dept(dept_id){
|
||||||
$.get('/jasset/dept_host_ajax/',
|
$.get('/jasset/dept_host_ajax/',
|
||||||
|
@ -83,7 +83,78 @@
|
|||||||
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
|
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
|
||||||
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
|
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
|
||||||
</div>
|
</div>
|
||||||
{% include 'paginator.html' %}
|
<div class="col-sm-6">
|
||||||
|
<div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
|
||||||
|
<ul class="pagination" style="margin-top: 0; float: right">
|
||||||
|
{% if keyword %}
|
||||||
|
{% if contacts.has_previous %}
|
||||||
|
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
|
||||||
|
<a href="?keyword={{ keyword }}&page={{ contacts.previous_page_number }}">Previous</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" id="editable_previous">
|
||||||
|
<a href="#">Previous</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% ifequal show_first 1 %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page=1&id={{ idc.id }}" title="第1页">1...</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% for page in page_range %}
|
||||||
|
{% ifequal current_page page %}
|
||||||
|
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page={{ page }}&id={{ idc.id }}" title="第{{ page }}页">{{ page }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page={{ page }}&id={{ idc.id }}" title="第{{ page }}页">{{ page }}</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% endfor %}
|
||||||
|
{% ifequal show_end 1 %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page={{ p.num_pages }}&id={{ idc.id }}" title="第{{ page }}页">...{{ p.num_pages }}</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% if contacts.has_next %}
|
||||||
|
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
|
||||||
|
<a href="?keyword={{ keyword }}&page={{ contacts.next_page_number }}&id={{ idc.id }}">Next</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
|
||||||
|
<a href="#">Next</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
{% if contacts.has_previous %}
|
||||||
|
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
|
||||||
|
<a href="?page={{ contacts.previous_page_number }}&id={{ idc.id }}">Previous</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" id="editable_previous">
|
||||||
|
<a href="#">Previous</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% ifequal show_first 1 %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page=1&id={{ idc.id }}" title="第1页">1...</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% for page in page_range %}
|
||||||
|
{% ifequal current_page page %}
|
||||||
|
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?page={{ page }}&id={{ idc.id }}" title="第{{ page }}页">{{ page }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page={{ page }}&id={{ idc.id }}" title="第{{ page }}页">{{ page }}</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% endfor %}
|
||||||
|
{% ifequal show_end 1 %}
|
||||||
|
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page={{ p.num_pages }}&id={{ idc.id }}" title="第{{ page }}页">...{{ p.num_pages }}</a></li>
|
||||||
|
{% endifequal %}
|
||||||
|
{% if contacts.has_next %}
|
||||||
|
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
|
||||||
|
<a href="?page={{ contacts.next_page_number }}&id={{ idc.id }}">Next</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
|
||||||
|
<a href="#">Next</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,20 @@
|
|||||||
{% extends 'base.html' %}
|
{% extends 'base.html' %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% include 'nav_cat_bar.html' %}
|
{% include 'nav_cat_bar.html' %}
|
||||||
<!--<h3 class="text-center">项目发布申请</h3>-->
|
<script type="text/javascript">
|
||||||
|
function search_ip(text, noselect, total){
|
||||||
|
$("#" + noselect).children().each(
|
||||||
|
function(){
|
||||||
|
$(this).remove();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#" + total).children().each(function(){
|
||||||
|
if($(this).text().search(text) != -1){
|
||||||
|
$("#" + noselect).append($(this).clone())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
<div class="wrapper wrapper-content animated fadeInRight">
|
<div class="wrapper wrapper-content animated fadeInRight">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-10">
|
<div class="col-lg-10">
|
||||||
@ -16,10 +29,6 @@
|
|||||||
<i class="fa fa-wrench"></i>
|
<i class="fa fa-wrench"></i>
|
||||||
</a>
|
</a>
|
||||||
<ul class="dropdown-menu dropdown-user">
|
<ul class="dropdown-menu dropdown-user">
|
||||||
<li><a href="#">未启用 1</a>
|
|
||||||
</li>
|
|
||||||
<li><a href="#">未启用 2</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<a class="close-link">
|
<a class="close-link">
|
||||||
<i class="fa fa-times"></i>
|
<i class="fa fa-times"></i>
|
||||||
@ -27,6 +36,18 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<select id="assets_total" name="assets" class="form-control m-b" size="12" multiple style="display: none">
|
||||||
|
{% for asset in posts %}
|
||||||
|
<option value="{{ asset.ip }}">{{ asset.ip }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="asset_select_total" name="j_hosts" class="form-control m-b" size="12" multiple style="display: none">
|
||||||
|
{% for asset in eposts %}
|
||||||
|
<option value="{{ asset.ip }}">{{ asset.ip }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
{% if emg %}
|
{% if emg %}
|
||||||
<div class="alert alert-warning text-center">{{ emg }}</div>
|
<div class="alert alert-warning text-center">{{ emg }}</div>
|
||||||
@ -46,10 +67,10 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group"><label class="col-sm-2 control-label"> 部门管理员 <span class="red-fonts">*</span></label>
|
<div class="form-group" id="j_da"><label class="col-sm-2 control-label"> 部门管理员 <span class="red-fonts">*</span></label>
|
||||||
<div class="radio">
|
<div class="radio">
|
||||||
{% for da in dept_da %}
|
{% for da in dept_da %}
|
||||||
<label><input type="radio" value="{{ da.id }}" id="da" name="da"> {{ da }}</label>
|
<label><input type="radio" value="{{ da.id }}" name="da"> {{ da }}</label>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -68,35 +89,40 @@
|
|||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div>
|
<label for="group_name" class="col-sm-2 control-label">过滤</label>
|
||||||
<label for="groups" class="col-lg-2 control-label">主机<span class="red-fonts">*</span></label>
|
<div class="col-sm-4">
|
||||||
<div class="col-sm-3">
|
<input id="noselect" class="form-control" oninput="search_ip(this.value, 'assets', 'assets_total')">
|
||||||
<select multiple="multiple" id="id_domains_filter" name="domains_filter" style="display: none;">
|
</div>
|
||||||
</select>
|
<div class="col-sm-1">
|
||||||
<div class="input-group" style="padding-bottom: 5px">
|
</div>
|
||||||
<input type="text" size="19" class="form-control input-sm" id="search" name="keyword" placeholder="过滤">
|
<div id="select" class="col-sm-3">
|
||||||
</div>
|
<input class="form-control" oninput="search_ip(this.value, 'asset_select', 'asset_select_total')">
|
||||||
<select id="groups" size="12" class="form-control m-b" multiple>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="" class="col-sm-2 control-label">主机<span class="red-fonts">*</span></label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div>
|
||||||
|
<select id="assets" name="assets" class="form-control m-b" size="12" multiple>
|
||||||
{% for post in posts %}
|
{% for post in posts %}
|
||||||
<option value="{{ post.ip }}">{{ post.ip }}</option>
|
<option value="{{ post.ip }}">{{ post.ip }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-1">
|
</div>
|
||||||
<div class="btn-group" style="margin-top: 50px;">
|
|
||||||
<button type="button" class="btn btn-xm btn-white" onclick="move('groups', 'groups_selected')"><i class="fa fa-chevron-right"></i></button>
|
<div class="col-sm-1">
|
||||||
<button type="button" class="btn btn-xm btn-white" onclick="move_left('groups_selected', 'groups')"><i class="fa fa-chevron-left"></i></button>
|
<div class="btn-group" style="margin-top: 60px;">
|
||||||
</div>
|
<button type="button" class="btn btn-white" onclick="move('assets', 'asset_select', 'assets_total', 'asset_select_total' )"><i class="fa fa-chevron-right"></i></button>
|
||||||
|
<button type="button" class="btn btn-white" onclick="move_left('asset_select', 'assets', 'asset_select_total', 'assets_total')"><i class="fa fa-chevron-left"></i> </button>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3">
|
</div>
|
||||||
<h4 style="padding-bottom: 5px">已选中主机</h4>
|
|
||||||
<div>
|
<div class="col-sm-3">
|
||||||
<select id="groups_selected" name="hosts" class="form-control m-b" size="12" multiple>
|
<div>
|
||||||
{% for post in eposts %}
|
<select id="asset_select" name="hosts" class="form-control m-b" size="12" multiple></select>
|
||||||
<option value="{{ post.ip }}">{{ post.ip }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -110,7 +136,7 @@
|
|||||||
<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-5">
|
<div class="col-sm-4 col-sm-offset-5">
|
||||||
<button class="btn btn-primary" type="submit"> 提交 </button>
|
<button class="btn btn-primary" id="submit_button" type="submit"> 提交 </button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -121,6 +147,32 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
$("#submit_button").click(function(){
|
||||||
|
$('#assetForm option').each(function(){
|
||||||
|
$(this).prop('selected', true)
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#assetForm').validator({
|
||||||
|
timely: 2,
|
||||||
|
theme: "yellow_right_effect",
|
||||||
|
fields: {
|
||||||
|
"j_da": {
|
||||||
|
rule: "required",
|
||||||
|
tip: "选择管理员",
|
||||||
|
ok: "",
|
||||||
|
msg: {required: "管理员必须选择!"},
|
||||||
|
data: {'data-ok':"ok"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
valid: function(form) {
|
||||||
|
form.submit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var $rows = $('#groups option');
|
var $rows = $('#groups option');
|
||||||
$('#search').keyup(function() {
|
$('#search').keyup(function() {
|
||||||
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
|
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
|
||||||
|
@ -5,12 +5,6 @@
|
|||||||
{% include 'nav_li_profile.html' %}
|
{% include 'nav_li_profile.html' %}
|
||||||
<li id="index">
|
<li id="index">
|
||||||
<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>
|
||||||
<!--<a href="index.html"><i class="fa fa-th-large"></i> <span class="nav-label">仪表盘</span> <span class="fa arrow"></span></a>
|
|
||||||
<ul class="nav nav-second-level">
|
|
||||||
<li><a href="index.html">Dashboard v.1</a></li>
|
|
||||||
<li ><a href="dashboard_2.html">Dashboard v.2</a></li>
|
|
||||||
<li ><a href="dashboard_3.html">Dashboard v.3</a></li>
|
|
||||||
</ul>-->
|
|
||||||
</li>
|
</li>
|
||||||
<li id="juser">
|
<li id="juser">
|
||||||
<a href="#"><i class="fa fa-rebel"></i> <span class="nav-label">用户管理</span><span class="fa arrow"></span></a>
|
<a href="#"><i class="fa fa-rebel"></i> <span class="nav-label">用户管理</span><span class="fa arrow"></span></a>
|
||||||
@ -51,13 +45,6 @@
|
|||||||
<li class="apply_show online"><a href="/jperm/apply_show/online/">权限审批</a></li>
|
<li class="apply_show online"><a href="/jperm/apply_show/online/">权限审批</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
{# <li id="jlog">#}
|
|
||||||
{# <a href="#"><i class="fa fa-files-o"></i> <span class="nav-label">日志审计</span><span class="fa arrow"></span></a>#}
|
|
||||||
{# <ul class="nav nav-second-level">#}
|
|
||||||
{# <li id="log_list"><a href="/jlog/log_list/online/">查看日志</a></li>#}
|
|
||||||
{# <li id="log_detail"><a href="/jlog/log_detail/">日志分析</a></li>#}
|
|
||||||
{# </ul>#}
|
|
||||||
{# </li>#}
|
|
||||||
<li id="jlog">
|
<li id="jlog">
|
||||||
<a href="/jlog/log_list/online/"><i class="fa fa-files-o"></i> <span class="nav-label">日志审计</span><span class="label label-info pull-right"></span></a>
|
<a href="/jlog/log_list/online/"><i class="fa fa-files-o"></i> <span class="nav-label">日志审计</span><span class="label label-info pull-right"></span></a>
|
||||||
</li>
|
</li>
|
||||||
@ -76,12 +63,6 @@
|
|||||||
{% include 'nav_li_profile.html' %}
|
{% include 'nav_li_profile.html' %}
|
||||||
<li id="index">
|
<li id="index">
|
||||||
<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>
|
||||||
<!--<a href="index.html"><i class="fa fa-th-large"></i> <span class="nav-label">仪表盘</span> <span class="fa arrow"></span></a>
|
|
||||||
<ul class="nav nav-second-level">
|
|
||||||
<li><a href="index.html">Dashboard v.1</a></li>
|
|
||||||
<li ><a href="dashboard_2.html">Dashboard v.2</a></li>
|
|
||||||
<li ><a href="dashboard_3.html">Dashboard v.3</a></li>
|
|
||||||
</ul>-->
|
|
||||||
</li>
|
</li>
|
||||||
<li id="juser">
|
<li id="juser">
|
||||||
<a href="#"><i class="fa fa-rebel"></i> <span class="nav-label">用户管理</span><span class="fa arrow"></span></a>
|
<a href="#"><i class="fa fa-rebel"></i> <span class="nav-label">用户管理</span><span class="fa arrow"></span></a>
|
||||||
|
Loading…
Reference in New Issue
Block a user