Commit d6171f7f authored by ibuler's avatar ibuler

merge

parents 9acba2dd 75e1ea7f
...@@ -8,7 +8,6 @@ from django.shortcuts import render_to_response ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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= ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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)
\ No newline at end of file \ No newline at end of file
...@@ -21,6 +21,7 @@ CONF.read('%s/jumpserver.conf' % BASE_DIR) ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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))
......
# 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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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,90 +66,36 @@ def index_cu(request): ...@@ -66,90 +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', '')
user = User.objects.get(id=user_id)
dept = user.dept
dept_name = user.dept.name
users = User.objects.filter(dept=dept)
hosts = Asset.objects.filter(dept=dept)
online = Log.objects.filter(dept_name=dept_name, is_finished=0)
online_host = online.values('host').distinct()
online_user = online.values('user').distinct()
active_users = users.filter(is_active=1)
active_hosts = hosts.filter(is_active=1)
# 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) li_date, li_str = getDaysByNum(7)
today = datetime.datetime.now().day today = datetime.datetime.now().day
from_week = datetime.datetime.now() - datetime.timedelta(days=7) from_week = datetime.datetime.now() - datetime.timedelta(days=7)
week_data = Log.objects.filter(dept_name=dept_name, start_time__range=[from_week, datetime.datetime.now()])
user_top_ten = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:10]
host_top_ten = week_data.values('host').annotate(times=Count('host')).order_by('-times')[:10]
user_dic, host_dic = get_data(week_data, user_top_ten, 'user'), get_data(week_data, host_top_ten, 'host')
# a week data
week_users = week_data.values('user').distinct().count()
week_hosts = week_data.count()
user_top_five = week_data.values('user').annotate(times=Count('user')).order_by('-times')[:5]
color = ['label-success', 'label-info', 'label-primary', 'label-default', 'label-warnning']
# perm apply latest 10
perm_apply_10 = Apply.objects.order_by('-date_add')[:10]
# latest 10 login
login_10 = Log.objects.order_by('-start_time')[:10]
login_more_10 = Log.objects.order_by('-start_time')[10:21]
# a week top 10
for user_info in user_top_ten:
username = user_info.get('user')
last = Log.objects.filter(user=username).latest('start_time')
user_info['last'] = last
print user_top_ten
top = {'user': '活跃用户数', 'host': '活跃主机数', 'times': '登录次数'}
top_dic = {}
for key, value in top.items():
li = []
for t in li_date:
year, month, day = t.year, t.month, t.day
if key != 'times':
times = week_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).values(key).distinct().count()
else:
times = week_data.filter(start_time__year=year, start_time__month=month, start_time__day=day).count()
li.append(times)
top_dic[value] = li
return render_to_response('index.html', locals(), context_instance=RequestContext(request))
@require_login
def index(request):
if is_common_user(request): if is_common_user(request):
return index_cu(request) return index_cu(request)
if is_group_admin(request): elif is_super_user(request):
return admin_index(request) users = User.objects.all()
users = User.objects.all() hosts = Asset.objects.all()
hosts = Asset.objects.all() online = Log.objects.filter(is_finished=0)
online = Log.objects.filter(is_finished=0) online_host = online.values('host').distinct()
online_host = online.values('host').distinct() online_user = online.values('user').distinct()
online_user = online.values('user').distinct() active_users = User.objects.filter(is_active=1)
active_users = User.objects.filter(is_active=1) active_hosts = Asset.objects.filter(is_active=1)
active_hosts = Asset.objects.filter(is_active=1) 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:
...@@ -163,10 +109,6 @@ def index(request): ...@@ -163,10 +109,6 @@ def 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(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')
...@@ -180,17 +122,16 @@ def index(request): ...@@ -180,17 +122,16 @@ def index(request):
# perm apply latest 10 # perm apply latest 10
perm_apply_10 = Apply.objects.order_by('-date_add')[: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 # latest 10 login
login_10 = Log.objects.order_by('-start_time')[:10] login_10 = Log.objects.order_by('-start_time')[:10]
login_more_10 = Log.objects.order_by('-start_time')[10:21]
# a week top 10 # a week top 10
for user_info in user_top_ten: for user_info in user_top_ten:
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 = {'user': '活跃用户数', 'host': '活跃主机数', 'times': '登录次数'}
top_dic = {} top_dic = {}
......
...@@ -70,10 +70,13 @@ function move(from, to, from_o, to_o) { ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -157,6 +199,7 @@
$('#hosts').html(data) $('#hosts').html(data)
}) })
} }
</script> </script>
{% endblock %} {% endblock %}
\ No newline at end of file
...@@ -75,7 +75,78 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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>
......
{% 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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment