pull/6/head
halcyon 2015-04-13 21:25:43 +08:00
parent e385f3e09d
commit 4abf25ef13
26 changed files with 716 additions and 365 deletions

View File

@ -19,7 +19,6 @@ class BisGroup(models.Model):
name = models.CharField(max_length=80, unique=True)
dept = models.ForeignKey(DEPT)
comment = models.CharField(max_length=160, blank=True, null=True)
type = models.CharField(max_length=1, choices=GROUP_TYPE, default='P')
def __unicode__(self):
return self.name

View File

@ -8,6 +8,7 @@ urlpatterns = patterns('',
url(r'^host_list/$', host_list),
url(r'^search/$', host_search),
url(r"^host_detail/$", host_detail),
url(r"^dept_host_ajax/$", dept_host_ajax),
url(r'^idc_add/$', idc_add),
url(r'^idc_list/$', idc_list),
url(r'^idc_edit/$', idc_edit),
@ -18,9 +19,9 @@ urlpatterns = patterns('',
url(r'^group_list/$', group_list),
url(r'^group_detail/$', group_detail),
url(r'^group_del_host/(\w+)/$', group_del_host),
url(r'^group_del/(\w+)/$', group_del),
url(r'^group_del/$', group_del),
url(r'^host_del/(\w+)/$', host_del),
url(r'^host_edit/$', host_edit),
url(r'^host_edit/$', view_splitter, {'su': host_edit, 'adm': host_edit_adm}),
url(r'^host_edit/batch/$', host_edit_batch),
url(r'^host_edit_common/batch/$', host_edit_common_batch),
)

View File

@ -8,6 +8,7 @@ from django.shortcuts import render_to_response
from jasset.models import IDC, Asset, BisGroup, AssetAlias
from jperm.models import Perm, SudoPerm
from django.shortcuts import redirect
from jumpserver.api import *
cryptor = PyCrypt(KEY)
@ -17,10 +18,38 @@ class RaiseError(Exception):
pass
def f_host_add(ip, port, idc, jtype, group, dept, active, comment, username='', password=''):
groups, depts = [], []
idc = IDC.objects.get(name=idc)
def httperror(request, emg):
message = emg
return render_to_response('error.html', locals(), context_instance=RequestContext(request))
def get_host_groups(groups):
ret = []
for group_id in groups:
group = BisGroup.objects.filter(id=group_id)
if group:
group = group[0]
ret.append(group)
return ret
def get_host_depts(depts):
ret = []
for dept_id in depts:
dept = DEPT.objects.filter(id=dept_id)
if dept:
dept = dept[0]
ret.append(dept)
return ret
def db_host_insert(ip, port, idc, jtype, group, dept, active, comment, username='', password=''):
""" 添加主机时数据库操作函数 """
idc = IDC.objects.filter(id=idc)
if idc:
idc = idc[0]
if jtype == 'M':
password = cryptor.encrypt(password)
a = Asset(ip=ip, port=port,
login_type=jtype, idc=idc,
is_active=int(active),
@ -35,21 +64,46 @@ def f_host_add(ip, port, idc, jtype, group, dept, active, comment, username='',
a.save()
all_group = BisGroup.objects.get(name='ALL')
for g in group:
c = BisGroup.objects.get(name=g)
groups.append(c)
groups = get_host_groups(group)
groups.append(all_group)
for d in dept:
p = DEPT.objects.get(name=d)
depts.append(p)
depts = get_host_depts(dept)
a.bis_group = groups
a.dept = depts
a.save()
def db_host_update(ip, port, idc, jtype, group, dept, active, comment, host, username='', password=''):
""" 修改主机时数据库操作函数 """
idc = IDC.objects.filter(id=idc)
if idc:
idc = idc[0]
groups = get_host_groups(group)
depts = get_host_depts(dept)
host.ip = ip
host.port = port
host.login_type = jtype
host.idc = idc
host.is_active = int(active)
host.comment = comment
if jtype == 'M':
print password, host.password
if password != host.password:
password = cryptor.encrypt(password)
print password
host.password = password
host.username = username
host.password = password
host.save()
host.bis_group = groups
host.dept = depts
host.save()
def f_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(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment, j_user='', j_password=''):
""" 批量修改主机函数 """
groups, depts = [], []
is_active = {u'': '1', u'': '2'}
login_types = {'LDAP': 'L', 'MAP': 'M'}
@ -59,11 +113,12 @@ def f_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_
for d in j_dept[0].split():
p = DEPT.objects.get(name=d.strip())
depts.append(p)
j_type = login_types[j_type]
j_idc = IDC.objects.get(name=j_idc)
a = Asset.objects.get(id=j_id)
if j_type == 'M':
if a.password != j_password:
j_password = cryptor.decrypt(j_password)
a.ip = j_ip
a.port = j_port
a.login_type = j_type
@ -87,18 +142,15 @@ def f_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_
@require_admin
def host_add(request):
login_types = {'L': 'LDAP', 'M': 'MAP'}
header_title, path1, path2 = u'添加主机', u'资产管理', u'添加主机'
login_types = {'L': 'LDAP', 'M': 'MAP'}
eidc = IDC.objects.exclude(name='ALL')
if is_super_user(request):
edept = DEPT.objects.all()
egroup = BisGroup.objects.exclude(name='ALL')
eusergroup = UserGroup.objects.all()
elif is_group_admin(request):
dept_id = get_user_dept(request)
user_id = request.session.get('user_id')
edept = DEPT.objects.get(id=dept_id)
egroup = edept.bisgroup_set.all()
dept = get_session_user_info(request)[5]
egroup = dept.bisgroup_set.all()
if request.method == 'POST':
j_ip = request.POST.get('j_ip')
@ -109,8 +161,7 @@ def host_add(request):
j_active = request.POST.get('j_active')
j_comment = request.POST.get('j_comment')
j_dept = request.POST.getlist('j_dept')
if is_group_admin(request) and not validate(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 render_to_response('jasset/host_add.html', locals(), context_instance=RequestContext(request))
@ -120,10 +171,10 @@ def host_add(request):
if j_type == 'M':
j_user = request.POST.get('j_user')
j_password = cryptor.encrypt(request.POST.get('j_password'))
f_host_add(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, j_user, 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)
else:
f_host_add(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment)
db_host_insert(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment)
smg = u'主机 %s 添加成功' % j_ip
return render_to_response('jasset/host_add.html', locals(), context_instance=RequestContext(request))
@ -152,9 +203,9 @@ def host_add_batch(request):
if j_type == 'M':
j_user = request.POST.get('j_user')
j_password = cryptor.encrypt(request.POST.get('j_password'))
f_host_add(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, j_user, 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)
else:
f_host_add(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment)
db_host_insert(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment)
smg = u'批量添加添加成功'
return HttpResponseRedirect('/jasset/host_list/')
@ -187,15 +238,7 @@ def host_edit_batch(request):
j_active = request.POST.get(j_active).strip()
j_comment = request.POST.get(j_comment).strip()
if j_type == 'M':
j_user = "editable[" + str(i) + "][j_user]"
j_password = "editable[" + str(i) + "][j_password]"
j_user = request.POST.get(j_user).strip()
password = request.POST.get(j_password).strip()
j_password = cryptor.encrypt(password)
f_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment, j_user, j_password)
else:
f_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment)
batch_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment)
return render_to_response('jasset/host_list.html')
@ -225,13 +268,12 @@ def host_edit_common_batch(request):
@require_login
def host_list(request):
header_title, path1, path2 = u'查看主机', u'资产管理', u'查看主机'
login_types = {'L': 'LDAP', 'M': 'MAP'}
keyword = request.GET.get('keyword', '')
dept_id = get_user_dept(request)
dept = DEPT.objects.get(id=dept_id)
did = request.GET.get('did')
gid = request.GET.get('gid')
sid = request.GET.get('sid')
did = request.GET.get('did', '')
gid = request.GET.get('gid', '')
sid = request.GET.get('sid', '')
if did:
dept = DEPT.objects.get(id=did)
posts = dept.asset_set.all()
@ -280,8 +322,8 @@ def host_list(request):
return render_to_response('jasset/host_list.html', locals(), context_instance=RequestContext(request))
elif is_common_user(request):
user_id = request.session.get('user_id')
username = User.objects.get(id=user_id).name
user_id = get_session_user_info(request)[0]
username = get_session_user_info(request)[1]
posts = user_perm_asset_api(username)
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(),
@ -310,21 +352,64 @@ def host_del(request, offset):
return HttpResponseRedirect('/jasset/host_list/')
@require_admin
@require_super_user
def host_edit(request):
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
actives = {1: u'激活', 0: u'禁用'}
login_types = {'L': 'LDAP', 'M': 'MAP'}
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
groups, e_group, e_dept, depts = [], [], [], []
eidc = IDC.objects.all()
egroup = BisGroup.objects.exclude(name='ALL')
edept = DEPT.objects.all()
offset = request.GET.get('id')
for g in Asset.objects.get(id=int(offset)).bis_group.all():
e_group.append(g)
for d in Asset.objects.get(id=int(offset)).dept.all():
e_dept.append(d)
post = Asset.objects.get(id=int(offset))
host_id = request.GET.get('id', '')
post = Asset.objects.filter(id=int(host_id))
if post:
post = post[0]
else:
return httperror(request, '没有此主机!')
e_group = post.bis_group.all()
e_dept = post.dept.all()
if request.method == 'POST':
j_ip = request.POST.get('j_ip', '')
j_idc = request.POST.get('j_idc', '')
j_port = request.POST.get('j_port', '')
j_type = request.POST.get('j_type', '')
j_dept = request.POST.getlist('j_dept', '')
j_group = request.POST.getlist('j_group', '')
j_active = request.POST.get('j_active', '')
j_comment = request.POST.get('j_comment', '')
if j_type == 'M':
j_user = request.POST.get('j_user')
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)
else:
db_host_update(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, post)
smg = u'主机 %s 修改成功' % j_ip
return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id)
return render_to_response('jasset/host_edit.html', locals(), context_instance=RequestContext(request))
@require_admin
def host_edit_adm(request):
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
actives = {1: u'激活', 0: u'禁用'}
login_types = {'L': 'LDAP', 'M': 'MAP'}
eidc = IDC.objects.all()
dept = get_session_user_info(request)[5]
egroup = BisGroup.objects.exclude(name='ALL').filter(dept=dept)
host_id = request.GET.get('id', '')
post = Asset.objects.filter(id=int(host_id))
if post:
post = post[0]
else:
return httperror(request, '没有此主机!')
e_group = post.bis_group.all()
if request.method == 'POST':
j_ip = request.POST.get('j_ip')
j_idc = request.POST.get('j_idc')
@ -334,49 +419,20 @@ def host_edit(request):
j_group = request.POST.getlist('j_group')
j_active = request.POST.get('j_active')
j_comment = request.POST.get('j_comment')
j_idc = IDC.objects.get(name=j_idc)
if is_group_admin(request) and not validate(request, asset_group=j_group, edept=j_dept):
if not verify(request, asset_group=j_group, edept=j_dept):
emg = u'修改失败,您无权操作!'
return render_to_response('jasset/host_edit.html', locals(), context_instance=RequestContext(request))
for group in j_group:
c = BisGroup.objects.get(name=group)
groups.append(c)
for dept in j_dept:
d = DEPT.objects.get(name=dept)
depts.append(d)
a = Asset.objects.get(id=int(offset))
if j_type == 'M':
if post.password == request.POST.get('j_password'):
j_password = post.password
else:
j_password = cryptor.encrypt(request.POST.get('j_password'))
j_user = request.POST.get('j_user')
a.ip = j_ip
a.port = j_port
a.login_type = j_type
a.idc = j_idc
a.is_active = int(j_active)
a.comment = j_comment
a.username = j_user
a.password = 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)
else:
a.ip = j_ip
a.port = j_port
a.idc = j_idc
a.login_type = j_type
a.is_active = int(j_active)
a.comment = j_comment
db_host_update(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, post)
a.save()
a.bis_group = groups
a.dept = depts
a.save()
smg = u'主机 %s 修改成功' % j_ip
return HttpResponseRedirect('/jasset/host_detail/?id=%s' % offset)
return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id)
return render_to_response('jasset/host_edit.html', locals(), context_instance=RequestContext(request))
@ -384,13 +440,25 @@ def host_edit(request):
@require_login
def host_detail(request):
header_title, path1, path2 = u'主机详细信息', u'资产管理', u'主机详情'
host_id = int(request.GET.get('id'))
post = Asset.objects.get(id=host_id)
host_ip = post.ip
login_types = {'L': 'LDAP', 'S': 'SSH_KEY', 'P': 'PASSWORD', 'M': 'MAP'}
log_all = Log.objects.filter(host=host_ip)
log, log_more = log_all[:10], log_all[10:]
user_permed_list = asset_perm_api(post)
host_id = request.GET.get('id', '')
post = Asset.objects.filter(id=host_id)
if not post:
return httperror(request, '没有此主机!')
post = post.first()
if is_group_admin(request) and not verify(request, asset=[host_id]):
return httperror(request, '您无权查看!')
elif is_common_user(request):
username = get_session_user_info[1]
user_permed_hosts = user_perm_asset_api(username)
if post not in user_permed_hosts:
return httperror(request, '您无权查看!')
else:
log_all = Log.objects.filter(host=post.ip)
log, log_more = log_all[:10], log_all[10:]
user_permed_list = asset_perm_api(post)
return render_to_response('jasset/host_detail.html', locals(), context_instance=RequestContext(request))
@ -447,14 +515,12 @@ def idc_edit(request):
idc = IDC.objects.filter(id=idc_id)
if idc:
idc.update(name=j_idc, comment=j_comment)
for host in j_hosts:
g = Asset.objects.get(id=host)
Asset.objects.filter(id=host).update(idc=idc)
for host_id in j_hosts:
Asset.objects.filter(id=host_id).update(idc=idc[0])
i = IDC.objects.get(name='默认')
for host in idc_default:
g = Asset.objects.get(id=host)
i = IDC.objects.get(name='默认')
Asset.objects.filter(id=host).update(idc=i)
g = Asset.objects.filter(id=host).update(idc=i)
else:
emg = '此IDC不存在'
return render_to_response('jasset/idc_edit.html', locals(), context_instance=RequestContext(request))
@ -464,6 +530,27 @@ def idc_edit(request):
return render_to_response('jasset/idc_edit.html', locals(), context_instance=RequestContext(request))
@require_admin
def idc_detail(request):
header_title, path1, path2 = u'IDC详情', u'资产管理', u'IDC详情'
login_types = {'L': 'LDAP', 'M': 'MAP'}
idc_id = request.GET.get('id')
idc_filter = IDC.objects.filter(id=idc_id)
if idc_filter:
idc = idc_filter[0]
else:
return httperror(request, '没有此IDC')
dept_id = get_user_dept(request)
dept = DEPT.objects.get(id=dept_id)
if is_super_user(request):
posts = Asset.objects.filter(idc=idc).order_by('ip')
elif is_group_admin(request):
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)
return render_to_response('jasset/idc_detail.html', locals(), context_instance=RequestContext(request))
@require_super_user
def idc_del(request):
offset = request.GET.get('id', '')
@ -490,27 +577,33 @@ def group_add(request):
dept = DEPT.objects.get(id=dept_id)
posts = Asset.objects.filter(dept=dept)
edept = DEPT.objects.get(id=dept_id)
if request.method == 'POST':
j_group = request.POST.get('j_group')
j_dept = request.POST.get('j_dept')
j_hosts = request.POST.getlist('j_hosts')
j_comment = request.POST.get('j_comment')
j_group = request.POST.get('j_group', '')
j_dept = request.POST.get('j_dept', '')
j_hosts = request.POST.getlist('j_hosts', '')
j_comment = request.POST.get('j_comment', '')
if is_group_admin(request) and not validate(request, asset=j_hosts, edept=[j_dept]):
emg = u'添加失败,您无权操作!'
return render_to_response('jasset/group_add.html', locals(), context_instance=RequestContext(request))
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]):
emg = u'添加失败, 您无权操作!'
raise RaiseError
elif BisGroup.objects.filter(name=j_group):
emg = u'添加失败, 该主机组已存在!'
raise RaiseError
except RaiseError:
pass
j_dept = DEPT.objects.get(name=j_dept)
if BisGroup.objects.filter(name=j_group):
emg = u'该主机组已存在!'
return render_to_response('jasset/group_add.html', locals(), context_instance=RequestContext(request))
else:
BisGroup.objects.create(name=j_group, dept=j_dept, comment=j_comment)
group = BisGroup.objects.get(name=j_group)
j_dept = DEPT.objects.filter(id=j_dept).first()
group = BisGroup.objects.create(name=j_group, dept=j_dept, comment=j_comment)
for host in j_hosts:
g = Asset.objects.get(id=host)
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))
@ -557,7 +650,7 @@ def group_list(request):
@require_admin
def group_edit(request):
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)
all = Asset.objects.all()
dept_id = get_user_dept(request)
@ -573,19 +666,23 @@ def group_edit(request):
posts = [g for g in all_dept if g not in eposts]
if request.method == 'POST':
j_group = request.POST.get('j_group')
j_hosts = request.POST.getlist('j_hosts')
j_comment = request.POST.get('j_comment')
j_group = request.POST.get('j_group', '')
j_hosts = request.POST.getlist('j_hosts', '')
j_dept = request.POST.get('j_dept', '')
j_comment = request.POST.get('j_comment', '')
j_dept = DEPT.objects.filter(id=int(j_dept))
j_dept = j_dept[0]
group.asset_set.clear()
for host in j_hosts:
g = Asset.objects.get(id=host)
group.asset_set.add(g)
BisGroup.objects.filter(id=group_id).update(name=j_group, comment=j_comment)
BisGroup.objects.filter(id=group_id).update(name=j_group, dept=j_dept, comment=j_comment)
smg = u'主机组%s修改成功' % j_group
return HttpResponseRedirect('/jasset/group_detail/?id=%s' % group_id)
return HttpResponseRedirect('/jasset/group_list')
return render_to_response('jasset/group_add.html', locals(), context_instance=RequestContext(request))
return render_to_response('jasset/group_edit.html', locals(), context_instance=RequestContext(request))
@require_admin
@ -607,24 +704,6 @@ def group_detail(request):
return render_to_response('jasset/group_detail.html', locals(), context_instance=RequestContext(request))
@require_admin
def idc_detail(request):
header_title, path1, path2 = u'IDC详情', u'资产管理', u'IDC详情'
login_types = {'L': 'LDAP', 'M': 'MAP'}
idc_id = request.GET.get('id')
idc_name = IDC.objects.get(id=idc_id).name
b = IDC.objects.get(id=idc_id)
dept_id = get_user_dept(request)
dept = DEPT.objects.get(id=dept_id)
if is_super_user(request):
posts = Asset.objects.filter(idc=b).order_by('ip')
elif is_group_admin(request):
posts = Asset.objects.filter(idc=b).filter(dept=dept).order_by('ip')
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))
@require_admin
def group_del_host(request, offset):
if request.method == 'POST':
@ -648,7 +727,8 @@ def group_del_host(request, offset):
@require_admin
def group_del(request, offset):
def group_del(request):
offset = request.GET.get('id', '')
if offset == 'multi':
len_list = request.POST.get("len_list")
for i in range(int(len_list)):
@ -661,6 +741,19 @@ def group_del(request, offset):
return HttpResponseRedirect('/jasset/group_list/')
def dept_host_ajax(request):
dept_id = request.GET.get('id', '')
if dept_id not in ['1', '2']:
dept = DEPT.objects.filter(id=dept_id)
if dept:
dept = dept[0]
hosts = dept.asset_set.all()
else:
hosts = Asset.objects.all()
return render_to_response('jasset/dept_host_ajax.html', locals())
@require_login
def host_search(request):
keyword = request.GET.get('keyword')

View File

@ -15,14 +15,14 @@ database = jumpserver
[ldap]
ldap_enable = 1
host_url = ldap://127.0.0.1:389
host_url = ldap://192.168.8.230:389
base_dn = dc=jumpserver, dc=org
root_dn = cn=admin,dc=jumpserver,dc=org
root_pw = secret234
[websocket]
web_socket_host = 192.168.20.209:3000
web_socket_host = 192.168.173.129:3000
[web]

View File

@ -223,7 +223,6 @@ def is_super_user(request):
def is_group_admin(request):
print request.session.get('role_id'), type(request.session.get('role_id'))
if request.session.get('role_id') == 1:
return True
else:
@ -247,6 +246,16 @@ def get_session_user_dept(request):
return user, dept
@require_login
def get_session_user_info(request):
user_id = request.session.get('user_id', 0)
user = User.objects.filter(id=user_id)
if user:
user = user.first()
dept = user.dept
return [user.id, user.name, user, dept.id, dept.name, dept]
def get_user_dept(request):
user_id = request.session.get('user_id')
if user_id:
@ -413,6 +422,53 @@ def validate(request, user_group=None, user=None, asset_group=None, asset=None,
return True
def verify(request, user_group=None, user=None, asset_group=None, asset=None, edept=None):
dept = get_session_user_dept(request)[1]
if edept:
print dept.id, edept[0]
if dept.id != int(edept[0]):
return False
if user_group:
dept_user_groups = dept.usergroup_set.all()
user_groups = []
for user_group_id in user_group:
user_groups.extend(UserGroup.objects.filter(id=user_group_id))
if not set(user_groups).issubset(set(dept_user_groups)):
return False
if user:
dept_users = dept.user_set.all()
users = []
for user_id in user:
users.extend(User.objects.filter(id=user_id))
if not set(users).issubset(set(dept_users)):
return False
if asset_group:
dept_asset_groups = dept.bisgroup_set.all()
asset_groups = []
for group_id in asset_group:
asset_groups.extend(BisGroup.objects.filter(id=int(group_id)))
if not set(asset_groups).issubset(set(dept_asset_groups)):
return False
if asset:
dept_assets = dept.asset_set.all()
assets_id, dept_assets_id = [], []
for a in dept_assets:
dept_assets_id.append(int(a.id))
for i in asset:
assets_id.append(int(i))
print assets_id, dept_assets_id
if not set(assets_id).issubset(dept_assets_id):
return False
return True
def get_dept_asset(request):
dept_id = get_user_dept(request)
dept_asset = DEPT.objects.get(id=dept_id).asset_set.all()

View File

@ -83,6 +83,12 @@ def get_item(dictionary, key):
return dictionary.get(key)
@register.filter(name='get_login_type')
def get_login_type(login):
login_types = {'L': 'LDAP', 'M': 'MAP'}
return login_types[login]
@register.filter(name='bool2str')
def bool2str(value):
if value:

View File

@ -12,10 +12,10 @@ urlpatterns = patterns('',
(r'^logout/$', 'jumpserver.views.logout'),
(r'^file/upload/$', 'jumpserver.views.upload'),
(r'^file/download/$', 'jumpserver.views.download'),
(r'^error/$', 'jumpserver.views.httperror'),
(r'^juser/', include('juser.urls')),
(r'^jasset/', include('jasset.urls')),
(r'^jlog/', include('jlog.urls')),
(r'^jperm/', include('jperm.urls')),
)

View File

@ -81,10 +81,16 @@ def admin_index(request):
active_hosts = hosts.filter(is_active=1)
# percent of dashboard
percent_user = format(active_users.count() / users.count(), '.0%')
percent_host = format(active_hosts.count() / hosts.count(), '.0%')
percent_online_user = format(online_user.count() / users.count(), '.0%')
percent_online_host = format(online_host.count() / hosts.count(), '.0%')
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

View File

@ -22,7 +22,6 @@
<div class="middle-box text-center animated fadeInDown">
<h1>404</h1>
<h3 class="font-bold">Page Not Found</h3>
<div class="error-desc">
Sorry, but the page you are looking for has note been found. Try checking the URL for error, then hit the refresh button on your browser or try found something else in our app.
<form class="form-inline m-t" role="form">

39
templates/error.html Normal file
View File

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Jumpserver | 500 Error</title>
<link href="/static/css/bootstrap.min.css" rel="stylesheet">
<link href="/static/font-awesome/css/font-awesome.css" rel="stylesheet">
<link href="/static/css/animate.css" rel="stylesheet">
<link href="/static/css/style.css" rel="stylesheet">
</head>
<body class="gray-bg">
<div class="middle-box text-center animated fadeInDown">
<h1>Error</h1>
<h3 class="font-bold">{{ message }}</h3>
<div class="error-desc">
The server encountered something unexpected that didn't allow it to complete the request. We apologize.<br/>
You can go back to main page: <br/><a href="/" class="btn btn-primary m-t">Dashboard</a>
</div>
</div>
<!-- Mainly scripts -->
<script src="/static/js/jquery-2.1.1.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>

View File

@ -104,21 +104,25 @@
</div>
<div class="ibox-content">
<div class="feed-activity-list">
{% for perm in perm_apply_10 %}
<div class="feed-element">
<div>
{% ifequal perm.status 0 %}
<small class="pull-right text-navy">{{ perm.date_add|naturaltime }}</small>
{% else %}
<small class="pull-right">{{ perm.date_add|naturaltime }}</small>
{% endifequal %}
<strong>{{ perm.applyer }}</strong>
<div>申请 {{ perm.bisgroup|ast_to_list }} 主机组权限</div>
<div>申请 {{ perm.asset|ast_to_list }} 主机权限</div>
<small class="text-muted">{{ perm.date_add }}</small>
{% if perm_apply_10 %}
{% for perm in perm_apply_10 %}
<div class="feed-element">
<div>
{% ifequal perm.status 0 %}
<small class="pull-right text-navy">{{ perm.date_add|naturaltime }}</small>
{% else %}
<small class="pull-right">{{ perm.date_add|naturaltime }}</small>
{% endifequal %}
<strong>{{ perm.applyer }}</strong>
<div>申请 {{ perm.bisgroup|ast_to_list }} 主机组权限</div>
<div>申请 {{ perm.asset|ast_to_list }} 主机权限</div>
<small class="text-muted">{{ perm.date_add }}</small>
</div>
</div>
</div>
{% endfor %}
{% endfor %}
{% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</div>
</div>
</div>
@ -138,30 +142,8 @@
<div class="ibox-content">
<div>
<div class="feed-activity-list">
{% for login in login_10 %}
<div class="feed-element">
<a href="profile.html" class="pull-left">
<img alt="image" class="img-circle" src="/static/img/root.png">
</a>
<div class="media-body ">
{% ifequal login.is_finished 0 %}
<small class="pull-right text-navy">{{ login.start_time|naturaltime }}</small>
{% else %}
<small class="pull-right">{{ login.start_time|naturaltime }}</small>
{% endifequal %}
<strong>{{ login.user }}</strong> 登录了{{ login.host }} <br>
<small class="text-muted">{{ login.start_time }}</small>
</div>
</div>
{% endfor %}
</div>
<button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> 更多 </button>
<div id='more' style="display: none">
<br/>
<div class="feed-activity-list">
{% for login in login_more_10 %}
{% if login_10 %}
{% for login in login_10 %}
<div class="feed-element">
<a href="profile.html" class="pull-left">
<img alt="image" class="img-circle" src="/static/img/root.png">
@ -178,11 +160,35 @@
</div>
</div>
{% endfor %}
</div>
<button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> 更多 </button>
<div id='more' style="display: none">
<br/>
<div class="feed-activity-list">
{% for login in login_more_10 %}
<div class="feed-element">
<a href="profile.html" class="pull-left">
<img alt="image" class="img-circle" src="/static/img/root.png">
</a>
<div class="media-body ">
{% ifequal login.is_finished 0 %}
<small class="pull-right text-navy">{{ login.start_time|naturaltime }}</small>
{% else %}
<small class="pull-right">{{ login.start_time|naturaltime }}</small>
{% endifequal %}
<strong>{{ login.user }}</strong> 登录了{{ login.host }} <br>
<small class="text-muted">{{ login.start_time }}</small>
</div>
</div>
{% endfor %}
</div>
</div>
{% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
@ -209,23 +215,27 @@
<small><i class="fa fa-map-marker"></i> 一周Top10用户登录次数及最近一次登录记录. </small>
</div>
<div class="ibox-content inspinia-timeline">
{% for data in user_top_ten %}
<div class="timeline-item">
<div class="row">
<div class="col-xs-5 date">
<i class="fa fa-info-circle"></i>
<strong>{{ data.user }}</strong>
<br/>
<small class="text-navy">{{ data.times }}次</small>
</div>
<div class="col-xs-7 content no-top-border">
<p class="m-b-xs">最近一次登录</p>
<p>{{ data.last.host }}</p>
<p>于{{ data.last.start_time |date:"Y-m-d H:i:s" }}</p>
{% if user_top_ten %}
{% for data in user_top_ten %}
<div class="timeline-item">
<div class="row">
<div class="col-xs-5 date">
<i class="fa fa-info-circle"></i>
<strong>{{ data.user }}</strong>
<br/>
<small class="text-navy">{{ data.times }}次</small>
</div>
<div class="col-xs-7 content no-top-border">
<p class="m-b-xs">最近一次登录</p>
<p>{{ data.last.host }}</p>
<p>于{{ data.last.start_time |date:"Y-m-d H:i:s" }}</p>
</div>
</div>
</div>
</div>
{% endfor %}
{% endfor %}
{% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</div>
</div>
</div>

View File

@ -0,0 +1,3 @@
{% for host in hosts %}
<option value="{{ host.id }}">{{ host.ip }}</option>
{% endfor %}

View File

@ -26,9 +26,9 @@
<div class="form-group">
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label>
<div class="col-sm-8">
<select id="j_dept" name="j_dept" class="form-control m-b">
<select id="j_dept" name="j_dept" class="form-control m-b" onchange="change_dept(this.value)">
{% for d in edept %}
<option type="checkbox" value="{{ d.name }}">{{ d.name }}</option>
<option type="checkbox" value="{{ d.id }}">{{ d.name }}</option>
{% endfor %}
</select>
</div>
@ -39,21 +39,22 @@
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts" style="">*</span></label>
<div class="col-sm-8"><input type="text" name="j_dept" value="{{ edept.name }}" class="form-control" readonly="readonly"></div>
<input type="text" name="j_dept" value="{{ edept.id }}" style="display: none">
<div class="col-sm-8"><input type="text" value="{{ edept.name }}" class="form-control" readonly="readonly"></div>
</div>
{% endifequal %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<div>
<label for="groups" class="col-lg-2 control-label">主机<span class="red-fonts">*</span></label>
<label for="hosts" class="col-lg-2 control-label">主机</label>
<div class="col-sm-3">
<select multiple="multiple" id="id_domains_filter" name="domains_filter" style="display: none;">
</select>
<div class="input-group" style="padding-bottom: 5px">
<input type="text" size="19" class="form-control input-sm" id="search" name="keyword" placeholder="过滤">
</div>
<select id="groups" size="12" class="form-control m-b" multiple>
<select id="hosts" size="12" class="form-control m-b" multiple>
{% for post in posts %}
<option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %}
@ -61,14 +62,14 @@
</div>
<div class="col-sm-1">
<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>
<button type="button" class="btn btn-xm btn-white" onclick="move_left('groups_selected', 'groups')"><i class="fa fa-chevron-left"></i></button>
<button type="button" class="btn btn-xm btn-white" onclick="move('hosts', 'hosts_selected')"><i class="fa fa-chevron-right"></i></button>
<button type="button" class="btn btn-xm btn-white" onclick="move_left('hosts_selected', 'hosts')"><i class="fa fa-chevron-left"></i></button>
</div>
</div>
<div class="col-sm-3">
<h4 style="padding-bottom: 5px">已选中主机</h4>
<div>
<select id="groups_selected" name="j_hosts" class="form-control m-b" size="12" multiple>
<select id="hosts_selected" name="j_hosts" class="form-control m-b" size="12" multiple>
{% for post in eposts %}
<option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %}
@ -112,8 +113,8 @@
},
valid: function(form) {
form.submit();
}
});
}
});
function on_submit(id){
$('#'+id+' option').each(
@ -122,7 +123,6 @@
})
}
$('#search').keyup(function() {
var $rows = $('#groups option');
console.log($rows);
@ -133,6 +133,14 @@
return !~text.indexOf(val);
}).hide();
});
function change_dept(dept_id){
$.get('/jasset/dept_host_ajax/',
{'id': dept_id},
function(data){
$('#hosts').html(data)
})
}
</script>
{% endblock %}

View File

@ -30,7 +30,7 @@
<div class="ibox-content">
<div class="">
<a target="_blank" href="/jasset/host_add" class="btn btn-sm btn-primary "> 添加 </a>
<a target="_blank" href="/jasset/host_add" class="btn btn-sm btn-primary "> 添加主机 </a>
</div>
<form id="contents_form" name="contents_form">
@ -55,7 +55,7 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ login_types|get_item:post.login_type }} </td>
<td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2 }}</td>
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td>
@ -75,44 +75,7 @@
<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')" />
</div>
<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 contacts.has_previous %}
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
<a href="?id={{ group_id }}&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="?id={{ group_id }}&page=1" 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="?id={{ group_id }}&page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
{% else %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?id={{ group_id }}&page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
{% endifequal %}
{% endfor %}
{% ifequal show_end 1 %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?id={{ group_id }}&page={{ p.num_pages }}" 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="?id={{ group_id }}&page={{ contacts.next_page_number }}">Next</a>
</li>
{% else %}
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
<a href="#">Next</a>
</li>
{% endif %}
</ul>
</div>
</div>
{% include 'paginator.html' %}
</div>
</form>
</div>

View File

@ -0,0 +1,150 @@
{% extends 'base.html' %}
{% load mytags %}
{% block content %}
{% include 'nav_cat_bar.html' %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-lg-10">
<div class="ibox float-e-margins">
<div id="ibox-content" class="ibox-title">
<h5> 填写主机组基本信息 </h5>
</div>
<div class="ibox-content">
{% if emg %}
<div class="alert alert-warning text-center">{{ emg }}</div>
{% endif %}
{% if smg %}
<div class="alert alert-success text-center">{{ smg }}</div>
{% endif %}
<form id="assetForm" method="post" class="form-horizontal">
<div class="form-group"><label class="col-sm-2 control-label"> 主机组名<span class="red-fonts">*</span></label>
<div class="col-sm-8" name="group_id" value="{{ post.id }}"><input type="text" value="{{ group.name }}" placeholder="网站" name="j_group" class="form-control"></div>
</div>
{% ifequal session_role_id 2 %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label>
<div class="col-sm-8">
<select id="j_dept" name="j_dept" class="form-control m-b" onchange="change_dept(this.value)">
{% for d in edept %}
{% ifequal group.dept d %}
<option type="checkbox" value="{{ d.id }}" selected>{{ d.name }}</option>
{% else %}
<option type="checkbox" value="{{ d.id }}">{{ d.name }}</option>
{% endifequal %}
{% endfor %}
</select>
</div>
</div>
{% endifequal %}
{% ifequal session_role_id 1 %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts" style="">*</span></label>
<input type="text" name="j_dept" value="{{ group.dept.id }}" style="display: none">
<div class="col-sm-8"><input type="text" value="{{ group.dept.name }}" class="form-control" readonly="readonly"></div>
</div>
{% endifequal %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<div>
<label for="hosts" class="col-lg-2 control-label">主机</label>
<div class="col-sm-3">
<select multiple="multiple" id="id_domains_filter" name="domains_filter" style="display: none;">
</select>
<div class="input-group" style="padding-bottom: 5px">
<input type="text" size="19" class="form-control input-sm" id="search" name="keyword" placeholder="过滤">
</div>
<select id="hosts" size="12" class="form-control m-b" multiple>
{% for post in posts %}
<option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %}
</select>
</div>
<div class="col-sm-1">
<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>
<button type="button" class="btn btn-xm btn-white" onclick="move_left('hosts_selected', 'hosts')"><i class="fa fa-chevron-left"></i></button>
</div>
</div>
<div class="col-sm-3">
<h4 style="padding-bottom: 5px">已选中主机</h4>
<div>
<select id="hosts_selected" name="j_hosts" class="form-control m-b" size="12" multiple>
{% for post in eposts %}
<option value="{{ post.id }}">{{ post.ip }}</option>
{% endfor %}
</select>
</div>
</div>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 备注 </label>
<div class="col-sm-8"><input type="text" value="{{ group.comment }}" placeholder=包括web组所有主机 name="j_comment" class="form-control"></div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-5">
<button class="btn btn-white" type="submit"> 重置 </button>
<button class="btn btn-primary" type="submit" onclick="on_submit('groups_selected') "> 提交 </button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script>
$('#assetForm').validator({
timely: 2,
theme: "yellow_right_effect",
fields: {
"j_group": {
rule: "required",
tip: "输入业务组名",
ok: "",
msg: {required: "业务组名必须填写!"},
data: {'data-ok':"业务组名可以使用"}
}
},
valid: function(form) {
form.submit();
}
});
function on_submit(id){
$('#'+id+' option').each(
function(){
$(this).prop('selected', true)
})
}
$('#search').keyup(function() {
var $rows = $('#groups option');
console.log($rows);
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
$rows.show().filter(function() {
var text = $(this).text().replace(/\s+/g, ' ').toLowerCase();
return !~text.indexOf(val);
}).hide();
});
function change_dept(dept_id){
$.get('/jasset/dept_host_ajax/',
{'id': dept_id},
function(data){
$('#hosts').html(data)
})
}
</script>
{% endblock %}

View File

@ -9,7 +9,7 @@
<div class="ibox float-e-margins">
<div class="ibox-content">
<div class="">
<a target="_blank" href="/jasset/jgroup_add" class="btn btn-sm btn-primary "> 添加主机组 </a>
<a target="_blank" href="/jasset/group_add" class="btn btn-sm btn-primary "> 添加主机组 </a>
<form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group">
<input type="text" class="form-control input-sm" id="search_input" name="keyword" placeholder="Search">
@ -50,7 +50,7 @@
<td class="text-center">
<a href="/jasset/group_detail/?id={{ post.id }}" class="btn btn-xs btn-info">详情</a>
<a href="/jasset/group_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
<a href="/jasset/group_del/{{ post.id }}/" class="btn btn-xs btn-danger">删除</a>
<a href="/jasset/group_del/?id={{ post.id }}" class="btn btn-xs btn-danger">删除</a>
</td>
</tr>
{% endfor %}
@ -59,7 +59,7 @@
<div class="row">
<div class="col-sm-6">
<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>
{% include 'paginator.html' %}
</div>
@ -84,7 +84,7 @@
if (confirm("确定删除")) {
$.ajax({
type: "POST",
url: "/jasset/group_del/multi/",
url: "/jasset/group_del/?id=multi",
data: {"id_list": id_list, "len_list": j},
success: function (data) {
window.open("/jasset/group_list/", "_self");

View File

@ -79,7 +79,7 @@
<div class="col-sm-8">
<select id="j_idc" name="j_idc" class="form-control m-b">
{% for i in eidc %}
<option> {{ i }} </option>
<option value="{{i.id}}"> {{ i }} </option>
{% endfor %}
</select>
</div>
@ -92,7 +92,7 @@
<div class="col-sm-8">
<select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10">
{% for d in edept %}
<option type="checkbox" value="{{ d.name }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
<option type="checkbox" value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
{% endfor %}
</select>
</div>
@ -101,18 +101,19 @@
{% ifequal session_role_id 1 %}
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 所属部门 </label>
<div class="col-sm-8"><input type="text" name="j_dept" value="{{ edept.name }}" class="form-control" readonly="readonly"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 所属部门 <span class="red-fonts">*</span></label>
<input type="text" name="j_dept" value="{{ dept.id }}" style="display: none">
<div class="col-sm-8"><input type="text" value="{{ dept.name }}" class="form-control" readonly="readonly"></div>
</div>
{% endifequal %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_group" class="col-lg-2 control-label">所属主机组<span class="red-fonts">*</span></label>
<label for="j_group" class="col-lg-2 control-label">所属主机组</label>
<div class="col-sm-8">
<select id="j_group" name="j_group" class="form-control m-b" multiple size="10">
{% for g in egroup %}
<option type="checkbox" value="{{ g.name }}">{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option>
<option type="checkbox" value="{{ g.id }}">{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option>
{% endfor %}
</select>
</div>
@ -183,12 +184,6 @@ $('#assetForm').validator({
ok: "",
msg: {required: "必须填写!"}
},
"j_group": {
rule: "required",
tip: "选择主机组",
ok: "",
msg: {checked: "至少选择一个组"}
},
"j_idc": {
rule: "required",
tip: "选择IDC",

View File

@ -42,7 +42,7 @@
</tr>
<tr>
<td class="text-navy">登录方式</td>
<td>{{ login_types|get_item:post.login_type }}</td>
<td>{{ post.login_type|get_login_type }}</td>
</tr>
<tr>
<td class="text-navy">IDC</td>
@ -74,7 +74,7 @@
</tr>
<tr>
<td class="text-navy">激活</td>
<td>{{ user.is_active|bool2str }}</td>
<td>{{ post.is_active|bool2str }}</td>
</tr>
<tr>
<td class="text-navy">添加日期</td>
@ -116,13 +116,17 @@
<div>
<div class="text-left">
<table class="table">
{% for user in user_permed_list %}
<tr>
<td class="text-navy">{{ user.name }}</td>
<td>{{ user.dept.name }}</td>
<td><a href="/juser/user_detail/?id={{ user.id }}">详情</a></td>
</tr>
{% endfor %}
{% if user_permed_list %}
{% for user in user_permed_list %}
<tr>
<td class="text-navy">{{ user.name }}</td>
<td>{{ user.dept.name }}</td>
<td><a href="/juser/user_detail/?id={{ user.id }}">详情</a></td>
</tr>
{% endfor %}
{% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</table>
</div>
</div>
@ -153,45 +157,50 @@
<small><i class="fa fa-map-marker"></i> 此主机最近一周用户登录信息.</small>
</div>
<div class="ibox-content inspinia-timeline">
{% for l in log %}
<div class="timeline-item">
<div class="row">
<div class="col-xs-5 date">
<i class="fa fa-info-circle"></i>
<small class="text-navy">{{ l.user }}</small>
<br/>
<strong>{{l.dept_name}}</strong>
</div>
<div class="col-xs-7 content no-top-border">
<p class="m-b-xs"><strong>详细信息</strong></p>
<p>来源IP: {{ l.remote_ip }}</p>
<p>开始: {{ l.start_time |date:"Y-m-d H:i:s" }}</p>
<p>结束: {{ l.end_time |date:"Y-m-d H:i:s" }}</p>
{% if log %}
{% for l in log %}
<div class="timeline-item">
<div class="row">
<div class="col-xs-5 date">
<i class="fa fa-info-circle"></i>
<small class="text-navy">{{ l.user }}</small>
<br/>
<strong>{{l.dept_name}}</strong>
</div>
<div class="col-xs-7 content no-top-border">
<p class="m-b-xs"><strong>详细信息</strong></p>
<p>来源IP: {{ l.remote_ip }}</p>
<p>开始: {{ l.start_time |date:"Y-m-d H:i:s" }}</p>
<p>结束: {{ l.end_time |date:"Y-m-d H:i:s" }}</p>
</div>
</div>
</div>
</div>
{% endfor %}
<button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> 所有 </button>
<div id='more' style="display: none">
<br/>
{% for l in log_more %}
<div class="timeline-item">
<div class="row">
<div class="col-xs-5 date">
<i class="fa fa-info-circle"></i>
<small class="text-navy">{{ l.user }}</small>
<br/>
<strong>{{l.dept_name}}</strong>
</div>
<div class="col-xs-7 content no-top-border">
<p class="m-b-xs"><strong>详细信息</strong></p>
<p>来源IP: {{ l.remote_ip }}</p>
<p>开始: {{ l.start_time |date:"Y-m-d H:i:s" }}</p>
<p>结束: {{ l.end_time |date:"Y-m-d H:i:s" }}</p>
{% endfor %}
<button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> 所有 </button>
<div id='more' style="display: none">
<br/>
{% for l in log_more %}
<div class="timeline-item">
<div class="row">
<div class="col-xs-5 date">
<i class="fa fa-info-circle"></i>
<small class="text-navy">{{ l.user }}</small>
<br/>
<strong>{{l.dept_name}}</strong>
</div>
<div class="col-xs-7 content no-top-border">
<p class="m-b-xs"><strong>详细信息</strong></p>
<p>来源IP: {{ l.remote_ip }}</p>
<p>开始: {{ l.start_time |date:"Y-m-d H:i:s" }}</p>
<p>结束: {{ l.end_time |date:"Y-m-d H:i:s" }}</p>
</div>
</div>
</div>
</div>
{% endfor %}
{% endfor %}
{% else %}
<p class="text-center">(暂无)</p>
{% endif %}
</div>
</div>
</div>

View File

@ -49,29 +49,21 @@
<div class="col-sm-8">
{% for t, type in login_types.items %}
{% ifequal t post.login_type %}
<div class="radio i-checks"><label> <input type="radio" id="{{ t }}" checked="" value="{{ t }}" name="j_type" onclick="show(this)"> <i> {{ type }} </i></label></div>
<div class="radio i-checks"><label> <input type="radio" checked="" value="{{ t }}" name="j_type" onclick="show(this)"> <i> {{ type }} </i></label></div>
{% else %}
<div class="radio i-checks"><label> <input type="radio" id="{{ t }}" value="{{ t }}" name="j_type" onclick="show(this)"> <i> {{ type }} </i></label></div>
<div class="radio i-checks"><label> <input type="radio" value="{{ t }}" name="j_type" onclick="show(this)"> <i> {{ type }} </i></label></div>
{% endifequal %}
{% endfor %}
</div>
{% ifequal post.login_type M %}
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户名 </label>
<div class="col-sm-6"><input type="text" name="j_user" value="{{ post.username }}" class="form-control"></div>
</div>
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户密码 </label>
<div class="col-sm-6"><input type="password" name="j_password" value="{{ post.password }}" class="form-control"></div>
</div>
{% else %}
<div name="a1" id=a1 style="display:none;">
{% ifequal post.login_type 'M' %}
<div name="type" id="type">
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户名 </label>
<div class="col-sm-6"><input type="text" name="j_user" placeholder="lilei" class="form-control"></div>
<div class="col-sm-6"><input type="text" name="j_user" value="{{ post.username }}" class="form-control"></div>
</div>
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户密码 </label>
<div class="col-sm-6"><input type="password" name="j_password" placeholder="Password" class="form-control"></div>
<div class="col-sm-6"><input type="password" name="j_password" value="{{ post.password }}" class="form-control"></div>
</div>
</div>
{% endifequal %}
@ -84,41 +76,51 @@
<select id="j_idc" name="j_idc" class="form-control m-b">
{% for i in eidc %}
{% ifequal i.id post.idc_id %}
<option selected> {{ i }} </option>
<option value="{{i.id}}" selected> {{ i }} </option>
{% else %}
<option> {{ i }} </option>
<option value="{{i.id}}"> {{ i }} </option>
{% endifequal %}
{% endfor %}
</select>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_dept" class="col-lg-2 control-label"> 所属部门<span class="red-fonts">*</span> </label>
<div class="col-sm-8">
<select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10">
{% for g in edept %}
{% if g in e_dept %}
<option type="checkbox" value="{{ g.name }}" selected>{{ g.name }} --- {{ g.comment }}</option>
{% else %}
<option type="checkbox" value="{{ g.name }}" >{{ g.name }} --- {{ g.comment }}</option>
{% endif %}
{% endfor %}
</select>
{% ifequal session_role_id 2 %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label>
<div class="col-sm-8">
<select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10">
{% for d in edept %}
{% if d in e_dept %}
<option type="checkbox" selected value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
{% else %}
<option type="checkbox" value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
{% endif %}
{% endfor %}
</select>
</div>
</div>
</div>
{% endifequal %}
{% ifequal session_role_id 1 %}
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 所属部门<span class="red-fonts">*</span> </label>
<input type="text" name="j_dept" value="{{ dept.id }}" style="display: none">
<div class="col-sm-8"><input type="text" value="{{ dept.name }}" class="form-control" readonly="readonly"></div>
</div>
{% endifequal %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_group" class="col-lg-2 control-label"> 所属主机组<span class="red-fonts">*</span> </label>
<label for="j_group" class="col-lg-2 control-label"> 所属主机组</label>
<div class="col-sm-8">
<select id="j_group" name="j_group" class="form-control m-b" multiple size="10">
{% for g in egroup %}
{% if g in e_group %}
<option type="checkbox" value="{{ g.name }}" selected>{{ g.name }} --- {{ g.comment }}</option>
<option type="checkbox" value="{{ g.id }}" selected>{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option>
{% else %}
<option type="checkbox" value="{{ g.name }}" >{{ g.name }} --- {{ g.comment }}</option>
<option type="checkbox" value="{{ g.id }}" >{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option>
{% endif %}
{% endfor %}
</select>
@ -147,7 +149,7 @@
<div class="form-group">
<div class="col-sm-4 col-sm-offset-5">
<button class="btn btn-white" type="submit"> 重置 </button>
<button class="btn btn-primary" type="submit"> 提交 </button>
<button class="btn btn-primary" type="submit" style="display: i"> 提交 </button>
</div>
</div>
</form>
@ -162,10 +164,10 @@
function show(o){
showFlag[o.name]=o.value;
if(showFlag.j_type=="M"){
document.getElementById("a1").style.display="";
document.getElementById("type").style.display="";
}
else{
document.getElementById("a1").style.display="none";
document.getElementById("type").style.display="none";
}};
$('#assetForm').validator({
timely: 2,
@ -190,11 +192,17 @@ $('#assetForm').validator({
ok: "",
msg: {required: "必须填写!"}
},
"j_group": {
rule: "checked",
tip: "选择业务组",
"j_idc": {
rule: "required",
tip: "选择IDC",
ok: "",
msg: {checked: "至少选择一个组"}
msg: {checked: "必须填写!"}
},
"j_dept": {
rule: "required",
tip: "选择部门",
ok: "",
msg: {checked: "至少选择一个部门"}
},
"j_user": {
rule: "required(type_m)",

View File

@ -66,7 +66,7 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ login_types|get_item:post.login_type }} </td>
<td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td>

View File

@ -66,7 +66,7 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" data-editable='false' name="j_ip"> {{ post.ip }} </td>
<td class="text-center" data-editable='false' name="j_port"> {{ post.port }} </td>
<td class="text-center" data-editable='false' name="j_type"> {{ login_types|get_item:post.login_type }} </td>
<td class="text-center" data-editable='false' name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" data-editable='false' name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" data-editable='false' name="j_dept">{{ post.dept.all | group_str2 }}</td>
<td class="text-center" data-editable='false' name="j_group">{{ post.bis_group.all | group_str2_all }}</td>

View File

@ -66,7 +66,7 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ login_types|get_item:post.login_type }} </td>
<td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td>

View File

@ -24,7 +24,7 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ login_types|get_item:post.login_type }} </td>
<td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2 }}</td>
{% ifnotequal session_role_id 0 %}

View File

@ -8,7 +8,7 @@
<div class="col-lg-12">
<div class="ibox float-e-margins" id="all">
<div class="ibox-title">
<h5> IDC<span class="text-info"> {{ idc_name }} </span>详细信息列表 </h5>
<h5> IDC<span class="text-info"> {{ idc.name }} </span>详细信息列表 </h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
@ -29,8 +29,14 @@
</div>
<div class="ibox-content">
{% if emg %}
<div class="alert alert-warning text-center">{{ emg }}</div>
{% endif %}
{% if smg %}
<div class="alert alert-success text-center">{{ smg }}</div>
{% endif %}
<div class="">
<a target="_blank" href="/jasset/host_add" class="btn btn-sm btn-primary "> 添加 </a>
<a target="_blank" href="/jasset/host_add" class="btn btn-sm btn-primary "> 添加主机 </a>
</div>
<form id="contents_form" name="contents_form">
@ -55,7 +61,7 @@
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ login_types|get_item:post.login_type }} </td>
<td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2 }}</td>
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td>

View File

@ -32,7 +32,7 @@
<tr class="gradeX">
<td> <a id="ip" class="iframe" href="/jasset/{{ post.ip }}/">{{ post.ip }}</a></td>
<td> {{ post.port }} </td>
<td> {{ login_types|get_item:post.login_type }} </td>
<td> {{ post.login_type|get_login_type }} </td>
<td class="text-center"> {{ post.idc.name }} </td>
<td class="text-center">{% for group in post.bis_group.all %} {{ group }} {% endfor %}</td>
<td class="text-center"> {{ post.date_added|date:"Y-m-d H:i:s" }} </td>

View File

@ -27,11 +27,11 @@
<a><i class="fa fa-cube"></i> <span class="nav-label">资产管理</span><span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
<li class="host_add host_add_multi"><a href="/jasset/host_add/">添加资产</a></li>
<li class="host_list host_detail"><a href="/jasset/host_list/">查看资产<span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li>
<li class="host_list host_detail host_edit"><a href="/jasset/host_list/">查看资产<span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li>
<li class="idc_add"><a href="/jasset/idc_add/">添加IDC</a></li>
<li class="idc_list idc_detail idc_edit"><a href="/jasset/idc_list/">查看IDC</a></li>
<li class="group_add"><a href="/jasset/group_add/">添加主机组</a></li>
<li class="group_list group_detail"><a href="/jasset/group_list/">查看主机组</a></li>
<li class="group_list group_detail group_edit"><a href="/jasset/group_list/">查看主机组</a></li>
</ul>
</li>
<li id="jperm">
@ -100,7 +100,7 @@
<li class="host_list host_detail host_edit"><a href="/jasset/host_list/">查看资产<span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li>
<li class="idc_list idc_detail idc_edit"><a href="/jasset/idc_list/">查看IDC</a></li>
<li class="group_add"><a href="/jasset/group_add/">添加主机组</a></li>
<li class="group_list group_detail"><a href="/jasset/group_list/">查看主机组</a></li>
<li class="group_list group_detail group_edit"><a href="/jasset/group_list/">查看主机组</a></li>
</ul>
</li>
<li id="jperm">