mirror of https://github.com/jumpserver/jumpserver
hehe
parent
e385f3e09d
commit
4abf25ef13
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
)
|
363
jasset/views.py
363
jasset/views.py
|
@ -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')
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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')),
|
||||
|
||||
|
||||
)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
{% for host in hosts %}
|
||||
<option value="{{ host.id }}">{{ host.ip }}</option>
|
||||
{% endfor %}
|
|
@ -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 %}
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
|
@ -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");
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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)",
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
|
Loading…
Reference in New Issue