mirror of https://github.com/jumpserver/jumpserver
Merge branches 'master' and 'wangyong' of gitcafe.com:ibuler/jumpserver
commit
e2e131146d
|
@ -19,7 +19,6 @@ class BisGroup(models.Model):
|
||||||
name = models.CharField(max_length=80, unique=True)
|
name = models.CharField(max_length=80, unique=True)
|
||||||
dept = models.ForeignKey(DEPT)
|
dept = models.ForeignKey(DEPT)
|
||||||
comment = models.CharField(max_length=160, blank=True, null=True)
|
comment = models.CharField(max_length=160, blank=True, null=True)
|
||||||
type = models.CharField(max_length=1, choices=GROUP_TYPE, default='P')
|
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
|
@ -8,6 +8,7 @@ urlpatterns = patterns('',
|
||||||
url(r'^host_list/$', host_list),
|
url(r'^host_list/$', host_list),
|
||||||
url(r'^search/$', host_search),
|
url(r'^search/$', host_search),
|
||||||
url(r"^host_detail/$", host_detail),
|
url(r"^host_detail/$", host_detail),
|
||||||
|
url(r"^dept_host_ajax/$", dept_host_ajax),
|
||||||
url(r'^idc_add/$', idc_add),
|
url(r'^idc_add/$', idc_add),
|
||||||
url(r'^idc_list/$', idc_list),
|
url(r'^idc_list/$', idc_list),
|
||||||
url(r'^idc_edit/$', idc_edit),
|
url(r'^idc_edit/$', idc_edit),
|
||||||
|
@ -17,10 +18,10 @@ urlpatterns = patterns('',
|
||||||
url(r'^group_edit/$', group_edit),
|
url(r'^group_edit/$', group_edit),
|
||||||
url(r'^group_list/$', group_list),
|
url(r'^group_list/$', group_list),
|
||||||
url(r'^group_detail/$', group_detail),
|
url(r'^group_detail/$', group_detail),
|
||||||
url(r'^group_del_host/(\w+)/$', group_del_host),
|
url(r'^group_del_host/$', 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_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/batch/$', host_edit_batch),
|
||||||
url(r'^host_edit_common/batch/$', host_edit_common_batch),
|
url(r'^host_edit_common/batch/$', host_edit_common_batch),
|
||||||
)
|
)
|
492
jasset/views.py
492
jasset/views.py
|
@ -8,6 +8,7 @@ from django.shortcuts import render_to_response
|
||||||
|
|
||||||
from jasset.models import IDC, Asset, BisGroup, AssetAlias
|
from jasset.models import IDC, Asset, BisGroup, AssetAlias
|
||||||
from jperm.models import Perm, SudoPerm
|
from jperm.models import Perm, SudoPerm
|
||||||
|
from django.shortcuts import redirect
|
||||||
from jumpserver.api import *
|
from jumpserver.api import *
|
||||||
|
|
||||||
cryptor = PyCrypt(KEY)
|
cryptor = PyCrypt(KEY)
|
||||||
|
@ -17,10 +18,38 @@ class RaiseError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def f_host_add(ip, port, idc, jtype, group, dept, active, comment, username='', password=''):
|
def httperror(request, emg):
|
||||||
groups, depts = [], []
|
message = emg
|
||||||
idc = IDC.objects.get(name=idc)
|
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':
|
if jtype == 'M':
|
||||||
|
password = cryptor.encrypt(password)
|
||||||
a = Asset(ip=ip, port=port,
|
a = Asset(ip=ip, port=port,
|
||||||
login_type=jtype, idc=idc,
|
login_type=jtype, idc=idc,
|
||||||
is_active=int(active),
|
is_active=int(active),
|
||||||
|
@ -35,21 +64,46 @@ def f_host_add(ip, port, idc, jtype, group, dept, active, comment, username='',
|
||||||
a.save()
|
a.save()
|
||||||
|
|
||||||
all_group = BisGroup.objects.get(name='ALL')
|
all_group = BisGroup.objects.get(name='ALL')
|
||||||
for g in group:
|
groups = get_host_groups(group)
|
||||||
c = BisGroup.objects.get(name=g)
|
|
||||||
groups.append(c)
|
|
||||||
groups.append(all_group)
|
groups.append(all_group)
|
||||||
|
|
||||||
for d in dept:
|
depts = get_host_depts(dept)
|
||||||
p = DEPT.objects.get(name=d)
|
|
||||||
depts.append(p)
|
|
||||||
|
|
||||||
a.bis_group = groups
|
a.bis_group = groups
|
||||||
a.dept = depts
|
a.dept = depts
|
||||||
a.save()
|
a.save()
|
||||||
|
|
||||||
|
|
||||||
|
def db_host_update(ip, port, idc, jtype, group, dept, active, comment, host, username='', password=''):
|
||||||
|
""" 修改主机时数据库操作函数 """
|
||||||
|
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 = [], []
|
groups, depts = [], []
|
||||||
is_active = {u'是': '1', u'否': '2'}
|
is_active = {u'是': '1', u'否': '2'}
|
||||||
login_types = {'LDAP': 'L', 'MAP': 'M'}
|
login_types = {'LDAP': 'L', 'MAP': 'M'}
|
||||||
|
@ -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():
|
for d in j_dept[0].split():
|
||||||
p = DEPT.objects.get(name=d.strip())
|
p = DEPT.objects.get(name=d.strip())
|
||||||
depts.append(p)
|
depts.append(p)
|
||||||
|
|
||||||
j_type = login_types[j_type]
|
j_type = login_types[j_type]
|
||||||
j_idc = IDC.objects.get(name=j_idc)
|
j_idc = IDC.objects.get(name=j_idc)
|
||||||
a = Asset.objects.get(id=j_id)
|
a = Asset.objects.get(id=j_id)
|
||||||
if j_type == 'M':
|
if j_type == 'M':
|
||||||
|
if a.password != j_password:
|
||||||
|
j_password = cryptor.decrypt(j_password)
|
||||||
a.ip = j_ip
|
a.ip = j_ip
|
||||||
a.port = j_port
|
a.port = j_port
|
||||||
a.login_type = j_type
|
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
|
@require_admin
|
||||||
def host_add(request):
|
def host_add(request):
|
||||||
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
|
||||||
header_title, path1, path2 = u'添加主机', u'资产管理', u'添加主机'
|
header_title, path1, path2 = u'添加主机', u'资产管理', u'添加主机'
|
||||||
|
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
||||||
eidc = IDC.objects.exclude(name='ALL')
|
eidc = IDC.objects.exclude(name='ALL')
|
||||||
if is_super_user(request):
|
if is_super_user(request):
|
||||||
edept = DEPT.objects.all()
|
edept = DEPT.objects.all()
|
||||||
egroup = BisGroup.objects.exclude(name='ALL')
|
egroup = BisGroup.objects.exclude(name='ALL')
|
||||||
eusergroup = UserGroup.objects.all()
|
|
||||||
elif is_group_admin(request):
|
elif is_group_admin(request):
|
||||||
dept_id = get_user_dept(request)
|
dept = get_session_user_info(request)[5]
|
||||||
user_id = request.session.get('user_id')
|
egroup = dept.bisgroup_set.all()
|
||||||
edept = DEPT.objects.get(id=dept_id)
|
|
||||||
egroup = edept.bisgroup_set.all()
|
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
j_ip = request.POST.get('j_ip')
|
j_ip = request.POST.get('j_ip')
|
||||||
|
@ -109,8 +161,7 @@ def host_add(request):
|
||||||
j_active = request.POST.get('j_active')
|
j_active = request.POST.get('j_active')
|
||||||
j_comment = request.POST.get('j_comment')
|
j_comment = request.POST.get('j_comment')
|
||||||
j_dept = request.POST.getlist('j_dept')
|
j_dept = request.POST.getlist('j_dept')
|
||||||
|
if is_group_admin(request) and not verify(request, asset_group=j_group, edept=j_dept):
|
||||||
if is_group_admin(request) and not validate(request, asset_group=j_group, edept=j_dept):
|
|
||||||
emg = u'添加失败,您无权操作!'
|
emg = u'添加失败,您无权操作!'
|
||||||
return render_to_response('jasset/host_add.html', locals(), context_instance=RequestContext(request))
|
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':
|
if j_type == 'M':
|
||||||
j_user = request.POST.get('j_user')
|
j_user = request.POST.get('j_user')
|
||||||
j_password = cryptor.encrypt(request.POST.get('j_password'))
|
j_password = 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:
|
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
|
smg = u'主机 %s 添加成功' % j_ip
|
||||||
|
|
||||||
return render_to_response('jasset/host_add.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jasset/host_add.html', locals(), context_instance=RequestContext(request))
|
||||||
|
@ -133,31 +184,54 @@ def host_add(request):
|
||||||
def host_add_batch(request):
|
def host_add_batch(request):
|
||||||
header_title, path1, path2 = u'批量添加主机', u'资产管理', u'批量添加主机'
|
header_title, path1, path2 = u'批量添加主机', u'资产管理', u'批量添加主机'
|
||||||
login_types = {'LDAP': 'L', 'MAP': 'M'}
|
login_types = {'LDAP': 'L', 'MAP': 'M'}
|
||||||
|
active_types = {'激活': 1, '禁用': 0}
|
||||||
dept_id = get_user_dept(request)
|
dept_id = get_user_dept(request)
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
multi_hosts = request.POST.get('j_multi').split('\n')
|
multi_hosts = request.POST.get('j_multi').split('\n')
|
||||||
|
print multi_hosts
|
||||||
for host in multi_hosts:
|
for host in multi_hosts:
|
||||||
if host == '':
|
if host == '':
|
||||||
break
|
break
|
||||||
j_ip, j_port, j_type, j_idc, j_groups, j_depts, j_active, j_comment = host.split()
|
j_ip, j_port, j_type, j_idc, j_groups, j_depts, j_active, j_comment = host.split()
|
||||||
j_type = login_types[j_type]
|
j_type = login_types[j_type]
|
||||||
|
j_active = active_types[str(j_active)]
|
||||||
j_group = ast.literal_eval(j_groups)
|
j_group = ast.literal_eval(j_groups)
|
||||||
j_dept = ast.literal_eval(j_depts)
|
j_dept = ast.literal_eval(j_depts)
|
||||||
|
|
||||||
|
idc = IDC.objects.filter(name=j_idc)
|
||||||
|
if idc:
|
||||||
|
j_idc = idc[0].id
|
||||||
|
|
||||||
|
group_ids, dept_ids = [], []
|
||||||
|
for group_name in j_group:
|
||||||
|
group = BisGroup.objects.filter(name=group_name)
|
||||||
|
if group:
|
||||||
|
group_id = group[0].id
|
||||||
|
group_ids.append(group_id)
|
||||||
|
|
||||||
|
for dept_name in j_dept:
|
||||||
|
dept = DEPT.objects.filter(name=dept_name)
|
||||||
|
if dept:
|
||||||
|
dept_id = dept[0].id
|
||||||
|
dept_ids.append(dept_id)
|
||||||
|
|
||||||
|
if is_group_admin(request) and not verify(request, asset_group=group_ids, edept=dept_ids):
|
||||||
|
return httperror(request, '添加失败, 您无权添加!')
|
||||||
|
|
||||||
if Asset.objects.filter(ip=str(j_ip)):
|
if Asset.objects.filter(ip=str(j_ip)):
|
||||||
emg = u'该IP %s 已存在!' % j_ip
|
emg = u'该IP %s 已存在!' % j_ip
|
||||||
return render_to_response('jasset/host_add_multi.html', locals(),
|
return render_to_response('jasset/host_add_multi.html', locals(),
|
||||||
context_instance=RequestContext(request))
|
context_instance=RequestContext(request))
|
||||||
|
|
||||||
if j_type == 'M':
|
# if j_type == 'M':
|
||||||
j_user = request.POST.get('j_user')
|
# j_user = request.POST.get('j_user')
|
||||||
j_password = cryptor.encrypt(request.POST.get('j_password'))
|
# j_password = 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, group_ids, dept_ids, j_active, j_comment)
|
||||||
else:
|
# 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, group_ids, dept_ids, j_active, j_comment)
|
||||||
|
|
||||||
smg = u'批量添加添加成功'
|
smg = u'批量添加添加成功'
|
||||||
return HttpResponseRedirect('/jasset/host_list/')
|
return render_to_response('jasset/host_add_multi.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
return render_to_response('jasset/host_add_multi.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jasset/host_add_multi.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
@ -187,15 +261,7 @@ def host_edit_batch(request):
|
||||||
j_active = request.POST.get(j_active).strip()
|
j_active = request.POST.get(j_active).strip()
|
||||||
j_comment = request.POST.get(j_comment).strip()
|
j_comment = request.POST.get(j_comment).strip()
|
||||||
|
|
||||||
if j_type == 'M':
|
batch_host_edit(j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment)
|
||||||
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)
|
|
||||||
|
|
||||||
return render_to_response('jasset/host_list.html')
|
return render_to_response('jasset/host_list.html')
|
||||||
|
|
||||||
|
@ -225,13 +291,12 @@ def host_edit_common_batch(request):
|
||||||
@require_login
|
@require_login
|
||||||
def host_list(request):
|
def host_list(request):
|
||||||
header_title, path1, path2 = u'查看主机', u'资产管理', u'查看主机'
|
header_title, path1, path2 = u'查看主机', u'资产管理', u'查看主机'
|
||||||
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
|
||||||
keyword = request.GET.get('keyword', '')
|
keyword = request.GET.get('keyword', '')
|
||||||
dept_id = get_user_dept(request)
|
dept_id = get_user_dept(request)
|
||||||
dept = DEPT.objects.get(id=dept_id)
|
dept = DEPT.objects.get(id=dept_id)
|
||||||
did = request.GET.get('did')
|
did = request.GET.get('did', '')
|
||||||
gid = request.GET.get('gid')
|
gid = request.GET.get('gid', '')
|
||||||
sid = request.GET.get('sid')
|
sid = request.GET.get('sid', '')
|
||||||
if did:
|
if did:
|
||||||
dept = DEPT.objects.get(id=did)
|
dept = DEPT.objects.get(id=did)
|
||||||
posts = dept.asset_set.all()
|
posts = dept.asset_set.all()
|
||||||
|
@ -280,8 +345,8 @@ def host_list(request):
|
||||||
return render_to_response('jasset/host_list.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jasset/host_list.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
elif is_common_user(request):
|
elif is_common_user(request):
|
||||||
user_id = request.session.get('user_id')
|
user_id = get_session_user_info(request)[0]
|
||||||
username = User.objects.get(id=user_id).name
|
username = get_session_user_info(request)[1]
|
||||||
posts = user_perm_asset_api(username)
|
posts = user_perm_asset_api(username)
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
return render_to_response('jasset/host_list_common.html', locals(),
|
return render_to_response('jasset/host_list_common.html', locals(),
|
||||||
|
@ -310,21 +375,64 @@ def host_del(request, offset):
|
||||||
return HttpResponseRedirect('/jasset/host_list/')
|
return HttpResponseRedirect('/jasset/host_list/')
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_super_user
|
||||||
def host_edit(request):
|
def host_edit(request):
|
||||||
|
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
|
||||||
actives = {1: u'激活', 0: u'禁用'}
|
actives = {1: u'激活', 0: u'禁用'}
|
||||||
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
||||||
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
|
|
||||||
groups, e_group, e_dept, depts = [], [], [], []
|
|
||||||
eidc = IDC.objects.all()
|
eidc = IDC.objects.all()
|
||||||
egroup = BisGroup.objects.exclude(name='ALL')
|
egroup = BisGroup.objects.exclude(name='ALL')
|
||||||
edept = DEPT.objects.all()
|
edept = DEPT.objects.all()
|
||||||
offset = request.GET.get('id')
|
host_id = request.GET.get('id', '')
|
||||||
for g in Asset.objects.get(id=int(offset)).bis_group.all():
|
post = Asset.objects.filter(id=int(host_id))
|
||||||
e_group.append(g)
|
if post:
|
||||||
for d in Asset.objects.get(id=int(offset)).dept.all():
|
post = post[0]
|
||||||
e_dept.append(d)
|
else:
|
||||||
post = Asset.objects.get(id=int(offset))
|
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':
|
if request.method == 'POST':
|
||||||
j_ip = request.POST.get('j_ip')
|
j_ip = request.POST.get('j_ip')
|
||||||
j_idc = request.POST.get('j_idc')
|
j_idc = request.POST.get('j_idc')
|
||||||
|
@ -334,49 +442,20 @@ def host_edit(request):
|
||||||
j_group = request.POST.getlist('j_group')
|
j_group = request.POST.getlist('j_group')
|
||||||
j_active = request.POST.get('j_active')
|
j_active = request.POST.get('j_active')
|
||||||
j_comment = request.POST.get('j_comment')
|
j_comment = request.POST.get('j_comment')
|
||||||
j_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'修改失败,您无权操作!'
|
emg = u'修改失败,您无权操作!'
|
||||||
return render_to_response('jasset/host_edit.html', locals(), context_instance=RequestContext(request))
|
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 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')
|
j_user = request.POST.get('j_user')
|
||||||
a.ip = j_ip
|
j_password = request.POST.get('j_password')
|
||||||
a.port = j_port
|
db_host_update(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, post, j_user, j_password)
|
||||||
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
|
|
||||||
else:
|
else:
|
||||||
a.ip = j_ip
|
db_host_update(j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, post)
|
||||||
a.port = j_port
|
|
||||||
a.idc = j_idc
|
|
||||||
a.login_type = j_type
|
|
||||||
a.is_active = int(j_active)
|
|
||||||
a.comment = j_comment
|
|
||||||
|
|
||||||
a.save()
|
|
||||||
a.bis_group = groups
|
|
||||||
a.dept = depts
|
|
||||||
a.save()
|
|
||||||
smg = u'主机 %s 修改成功' % j_ip
|
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))
|
return render_to_response('jasset/host_edit.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
@ -384,13 +463,25 @@ def host_edit(request):
|
||||||
@require_login
|
@require_login
|
||||||
def host_detail(request):
|
def host_detail(request):
|
||||||
header_title, path1, path2 = u'主机详细信息', u'资产管理', u'主机详情'
|
header_title, path1, path2 = u'主机详细信息', u'资产管理', u'主机详情'
|
||||||
host_id = int(request.GET.get('id'))
|
host_id = request.GET.get('id', '')
|
||||||
post = Asset.objects.get(id=host_id)
|
post = Asset.objects.filter(id=host_id)
|
||||||
host_ip = post.ip
|
if not post:
|
||||||
login_types = {'L': 'LDAP', 'S': 'SSH_KEY', 'P': 'PASSWORD', 'M': 'MAP'}
|
return httperror(request, '没有此主机!')
|
||||||
log_all = Log.objects.filter(host=host_ip)
|
post = post.first()
|
||||||
log, log_more = log_all[:10], log_all[10:]
|
|
||||||
user_permed_list = asset_perm_api(post)
|
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(request)[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))
|
return render_to_response('jasset/host_detail.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
|
@ -427,34 +518,65 @@ def idc_list(request):
|
||||||
@require_super_user
|
@require_super_user
|
||||||
def idc_edit(request):
|
def idc_edit(request):
|
||||||
header_title, path1, path2 = u'编辑IDC', u'资产管理', u'编辑IDC'
|
header_title, path1, path2 = u'编辑IDC', u'资产管理', u'编辑IDC'
|
||||||
edit = 1
|
|
||||||
idc_id = request.GET.get('id')
|
idc_id = request.GET.get('id')
|
||||||
j_idc = IDC.objects.get(id=idc_id)
|
idc = IDC.objects.filter(id=idc_id)
|
||||||
default = IDC.objects.get(name='默认').asset_set.all()
|
if idc:
|
||||||
eposts = contact_list = Asset.objects.filter(idc=j_idc).order_by('ip')
|
idc = idc[0]
|
||||||
posts = [g for g in default if g not in eposts]
|
default = IDC.objects.get(name='默认').asset_set.all()
|
||||||
|
eposts = Asset.objects.filter(idc=idc).order_by('ip')
|
||||||
|
posts = [g for g in default if g not in eposts]
|
||||||
|
else:
|
||||||
|
emg = '此IDC不存在'
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
j_group = request.POST.get('j_idc')
|
idc_id = request.POST.get('id')
|
||||||
|
j_idc = request.POST.get('j_idc')
|
||||||
j_hosts = request.POST.getlist('j_hosts')
|
j_hosts = request.POST.getlist('j_hosts')
|
||||||
j_comment = request.POST.get('j_comment')
|
j_comment = request.POST.get('j_comment')
|
||||||
idc_default = request.POST.getlist('idc_default')
|
idc_default = request.POST.getlist('idc_default')
|
||||||
|
|
||||||
for host in j_hosts:
|
idc = IDC.objects.filter(id=idc_id)
|
||||||
g = Asset.objects.get(id=host)
|
if idc:
|
||||||
Asset.objects.filter(id=host).update(idc=j_idc)
|
idc.update(name=j_idc, comment=j_comment)
|
||||||
|
for host_id in j_hosts:
|
||||||
|
Asset.objects.filter(id=host_id).update(idc=idc[0])
|
||||||
|
|
||||||
for host in idc_default:
|
|
||||||
g = Asset.objects.get(id=host)
|
|
||||||
i = IDC.objects.get(name='默认')
|
i = IDC.objects.get(name='默认')
|
||||||
Asset.objects.filter(id=host).update(idc=i)
|
for host in idc_default:
|
||||||
|
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))
|
||||||
|
|
||||||
return HttpResponseRedirect('/jasset/idc_list/' % idc_id)
|
return HttpResponseRedirect('/jasset/idc_list/?id=%s' % idc_id)
|
||||||
|
|
||||||
return render_to_response('jasset/idc_add.html', locals(), context_instance=RequestContext(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
|
@require_super_user
|
||||||
def idc_del(request, offset):
|
def idc_del(request):
|
||||||
|
offset = request.GET.get('id', '')
|
||||||
if offset == 'multi':
|
if offset == 'multi':
|
||||||
len_list = request.POST.get("len_list")
|
len_list = request.POST.get("len_list")
|
||||||
for i in range(int(len_list)):
|
for i in range(int(len_list)):
|
||||||
|
@ -477,28 +599,34 @@ def group_add(request):
|
||||||
dept_id = get_user_dept(request)
|
dept_id = get_user_dept(request)
|
||||||
dept = DEPT.objects.get(id=dept_id)
|
dept = DEPT.objects.get(id=dept_id)
|
||||||
posts = Asset.objects.filter(dept=dept)
|
posts = Asset.objects.filter(dept=dept)
|
||||||
edept = DEPT.objects.get(id=dept_id)
|
edept = get_session_user_info(request)[5]
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
j_group = request.POST.get('j_group')
|
j_group = request.POST.get('j_group', '')
|
||||||
j_dept = request.POST.get('j_dept')
|
j_dept = request.POST.get('j_dept', '')
|
||||||
j_hosts = request.POST.getlist('j_hosts')
|
j_hosts = request.POST.getlist('j_hosts', '')
|
||||||
j_comment = request.POST.get('j_comment')
|
j_comment = request.POST.get('j_comment', '')
|
||||||
|
|
||||||
if is_group_admin(request) and not validate(request, asset=j_hosts, edept=[j_dept]):
|
try:
|
||||||
emg = u'添加失败,您无权操作!'
|
print verify(request, asset=j_hosts, edept=[j_dept]), 'hehe'
|
||||||
return render_to_response('jasset/group_add.html', locals(), context_instance=RequestContext(request))
|
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:
|
else:
|
||||||
BisGroup.objects.create(name=j_group, dept=j_dept, comment=j_comment)
|
j_dept = DEPT.objects.filter(id=j_dept).first()
|
||||||
group = BisGroup.objects.get(name=j_group)
|
group = BisGroup.objects.create(name=j_group, dept=j_dept, comment=j_comment)
|
||||||
for host in j_hosts:
|
for host in j_hosts:
|
||||||
g = Asset.objects.get(id=host)
|
g = Asset.objects.get(id=host)
|
||||||
group.asset_set.add(g)
|
group.asset_set.add(g)
|
||||||
smg = u'主机组%s添加成功' % j_group
|
smg = u'主机组 %s 添加成功' % j_group
|
||||||
|
|
||||||
return render_to_response('jasset/group_add.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jasset/group_add.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
@ -545,110 +673,118 @@ def group_list(request):
|
||||||
@require_admin
|
@require_admin
|
||||||
def group_edit(request):
|
def group_edit(request):
|
||||||
header_title, path1, path2 = u'编辑主机组', u'资产管理', u'编辑主机组'
|
header_title, path1, path2 = u'编辑主机组', u'资产管理', u'编辑主机组'
|
||||||
group_id = request.GET.get('id')
|
group_id = request.GET.get('id', '')
|
||||||
group = BisGroup.objects.get(id=group_id)
|
group = BisGroup.objects.get(id=group_id)
|
||||||
all = Asset.objects.all()
|
host_all = Asset.objects.all()
|
||||||
dept_id = get_user_dept(request)
|
dept_id = get_user_dept(request)
|
||||||
eposts = Asset.objects.filter(bis_group=group).order_by('ip')
|
eposts = Asset.objects.filter(bis_group=group)
|
||||||
|
|
||||||
if is_super_user(request):
|
if is_super_user(request):
|
||||||
edept = DEPT.objects.all()
|
edept = DEPT.objects.all()
|
||||||
posts = [g for g in all if g not in eposts]
|
posts = [g for g in host_all if g not in eposts]
|
||||||
|
|
||||||
elif is_group_admin(request):
|
elif is_group_admin(request):
|
||||||
|
if not verify(request, asset_group=[group_id]):
|
||||||
|
return httperror(request, '编辑失败, 您无权操作!')
|
||||||
dept = DEPT.objects.get(id=dept_id)
|
dept = DEPT.objects.get(id=dept_id)
|
||||||
all_dept = Asset.objects.filter(dept=dept)
|
all_dept = Asset.objects.filter(dept=dept)
|
||||||
posts = [g for g in all_dept if g not in eposts]
|
posts = [g for g in all_dept if g not in eposts]
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
j_group = request.POST.get('j_group')
|
j_group = request.POST.get('j_group', '')
|
||||||
j_hosts = request.POST.getlist('j_hosts')
|
j_hosts = request.POST.getlist('j_hosts', '')
|
||||||
j_comment = request.POST.get('j_comment')
|
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()
|
group.asset_set.clear()
|
||||||
for host in j_hosts:
|
for host in j_hosts:
|
||||||
g = Asset.objects.get(id=host)
|
g = Asset.objects.get(id=host)
|
||||||
group.asset_set.add(g)
|
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
|
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
|
@require_admin
|
||||||
def group_detail(request):
|
def group_detail(request):
|
||||||
header_title, path1, path2 = u'主机组详情', u'资产管理', u'主机组详情'
|
header_title, path1, path2 = u'主机组详情', u'资产管理', u'主机组详情'
|
||||||
login_types = {'L': 'LDAP', 'S': 'SSH_KEY', 'P': 'PASSWORD', 'M': 'MAP'}
|
login_types = {'L': 'LDAP', 'M': 'MAP'}
|
||||||
dept_id = get_user_dept(request)
|
dept = get_session_user_info(request)[5]
|
||||||
dept = DEPT.objects.get(id=dept_id)
|
group_id = request.GET.get('id', '')
|
||||||
group_id = request.GET.get('id')
|
group = BisGroup.objects.get(id=group_id)
|
||||||
group_name = BisGroup.objects.get(id=group_id).name
|
|
||||||
b = BisGroup.objects.get(id=group_id)
|
|
||||||
if is_super_user(request):
|
if is_super_user(request):
|
||||||
posts = Asset.objects.filter(bis_group=b).order_by('ip')
|
posts = Asset.objects.filter(bis_group=group).order_by('ip')
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
|
||||||
|
|
||||||
elif is_group_admin(request):
|
elif is_group_admin(request):
|
||||||
posts = Asset.objects.filter(bis_group=b).filter(dept=dept).order_by('ip')
|
if not verify(request, asset_group=[group_id]):
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
return httperror(request, '您无权查看!')
|
||||||
|
posts = Asset.objects.filter(bis_group=group).filter(dept=dept).order_by('ip')
|
||||||
|
|
||||||
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
return render_to_response('jasset/group_detail.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jasset/group_detail.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def idc_detail(request):
|
def group_del_host(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':
|
if request.method == 'POST':
|
||||||
group_name = request.POST.get('group_name')
|
group_id = request.POST.get('group_id')
|
||||||
|
offset = request.GET.get('id', '')
|
||||||
|
group = BisGroup.objects.get(id=group_id)
|
||||||
if offset == 'group':
|
if offset == 'group':
|
||||||
group = BisGroup.objects.get(name=group_name)
|
len_list = request.POST.get("len_list")
|
||||||
elif offset == 'idc':
|
for i in range(int(len_list)):
|
||||||
group = IDC.objects.get(name=group_name)
|
key = "id_list[" + str(i) + "]"
|
||||||
len_list = request.POST.get("len_list")
|
jid = request.POST.get(key)
|
||||||
for i in range(int(len_list)):
|
g = Asset.objects.get(id=jid)
|
||||||
key = "id_list[" + str(i) + "]"
|
|
||||||
jid = request.POST.get(key)
|
|
||||||
g = Asset.objects.get(id=jid)
|
|
||||||
if offset == 'group':
|
|
||||||
group.asset_set.remove(g)
|
group.asset_set.remove(g)
|
||||||
elif offset == 'idc':
|
|
||||||
Asset.objects.filter(id=jid).delete()
|
|
||||||
BisGroup.objects.filter(name=g.ip).delete()
|
|
||||||
|
|
||||||
return HttpResponseRedirect('/jasset/%s_detail/?id=%s' % (offset, group.id))
|
else:
|
||||||
|
offset = request.GET.get('id', '')
|
||||||
|
group_id = request.GET.get('gid', '')
|
||||||
|
group = BisGroup.objects.get(id=group_id)
|
||||||
|
g = Asset.objects.get(id=offset)
|
||||||
|
group.asset_set.remove(g)
|
||||||
|
|
||||||
|
return HttpResponseRedirect('/jasset/group_detail/?id=%s' % group.id)
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def group_del(request, offset):
|
def group_del(request):
|
||||||
|
offset = request.GET.get('id', '')
|
||||||
if offset == 'multi':
|
if offset == 'multi':
|
||||||
len_list = request.POST.get("len_list")
|
len_list = request.POST.get("len_list")
|
||||||
for i in range(int(len_list)):
|
for i in range(int(len_list)):
|
||||||
key = "id_list[" + str(i) + "]"
|
key = "id_list[" + str(i) + "]"
|
||||||
gid = request.POST.get(key)
|
gid = request.POST.get(key)
|
||||||
|
if not verify(request, asset_group=[gid]):
|
||||||
|
return httperror(request, '删除失败, 您无权删除!')
|
||||||
BisGroup.objects.filter(id=gid).delete()
|
BisGroup.objects.filter(id=gid).delete()
|
||||||
else:
|
else:
|
||||||
gid = int(offset)
|
gid = int(offset)
|
||||||
|
if not verify(request, asset_group=[gid]):
|
||||||
|
return httperror(request, '删除失败, 您无权删除!')
|
||||||
BisGroup.objects.filter(id=gid).delete()
|
BisGroup.objects.filter(id=gid).delete()
|
||||||
return HttpResponseRedirect('/jasset/group_list/')
|
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
|
@require_login
|
||||||
def host_search(request):
|
def host_search(request):
|
||||||
keyword = request.GET.get('keyword')
|
keyword = request.GET.get('keyword')
|
||||||
|
|
|
@ -5,7 +5,7 @@ from jlog.views import *
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
url(r'^$', log_list),
|
url(r'^$', log_list),
|
||||||
url(r'^log_list/(\w+)/$', log_list),
|
url(r'^log_list/(\w+)/$', log_list),
|
||||||
url(r'^log_kill/(\d+)', log_kill),
|
url(r'^log_kill/', log_kill),
|
||||||
url(r'^history/$', log_history),
|
url(r'^history/$', log_history),
|
||||||
url(r'^search/$', log_search),
|
url(r'^search/$', log_search),
|
||||||
)
|
)
|
|
@ -13,13 +13,27 @@ from connect import BASE_DIR
|
||||||
from jlog.models import Log
|
from jlog.models import Log
|
||||||
from jumpserver.views import pages
|
from jumpserver.views import pages
|
||||||
from juser.models import User, DEPT
|
from juser.models import User, DEPT
|
||||||
from jumpserver.api import get_user_dept, is_super_user, is_group_admin, is_common_user, require_admin, require_login
|
from jumpserver.api import *
|
||||||
|
from jasset.views import httperror
|
||||||
|
|
||||||
CONF = ConfigParser.ConfigParser()
|
CONF = ConfigParser()
|
||||||
CONF.read('%s/jumpserver.conf' % BASE_DIR)
|
CONF.read('%s/jumpserver.conf' % BASE_DIR)
|
||||||
|
|
||||||
|
|
||||||
def get_user_log(request, keyword, env, username, dept_name):
|
def get_user_info(request, offset):
|
||||||
|
env_dic = {'online': 0, 'offline': 1}
|
||||||
|
env = env_dic[offset]
|
||||||
|
keyword = request.GET.get('keyword', '')
|
||||||
|
user_info = get_session_user_info(request)
|
||||||
|
user_id, username = user_info[0:2]
|
||||||
|
dept_id, dept_name = user_info[3:5]
|
||||||
|
ret = [request, keyword, env, username, dept_name]
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def get_user_log(ret_list):
|
||||||
|
request, keyword, env, username, dept_name = ret_list
|
||||||
if is_super_user(request):
|
if is_super_user(request):
|
||||||
if keyword:
|
if keyword:
|
||||||
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
|
posts = Log.objects.filter(Q(user__contains=keyword) | Q(host__contains=keyword)) \
|
||||||
|
@ -46,53 +60,56 @@ def get_user_log(request, keyword, env, username, dept_name):
|
||||||
@require_login
|
@require_login
|
||||||
def log_list(request, offset):
|
def log_list(request, offset):
|
||||||
header_title, path1, path2 = u'查看日志', u'查看日志', u'在线用户'
|
header_title, path1, path2 = u'查看日志', u'查看日志', u'在线用户'
|
||||||
|
keyword = request.GET.get('keyword', '')
|
||||||
web_socket_host = CONF.get('websocket', 'web_socket_host')
|
web_socket_host = CONF.get('websocket', 'web_socket_host')
|
||||||
env_dic = {'online': 0, 'offline': 1}
|
posts = get_user_log(get_user_info(request, offset))
|
||||||
env = env_dic[offset]
|
|
||||||
keyword = request.GET.get('keyword')
|
|
||||||
dept_id = get_user_dept(request)
|
|
||||||
dept_name = DEPT.objects.get(id=dept_id).name
|
|
||||||
user_id = request.session.get('user_id')
|
|
||||||
username = User.objects.get(id=user_id).username
|
|
||||||
posts = get_user_log(request, keyword, env, username, dept_name)
|
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
|
|
||||||
return render_to_response('jlog/log_%s.html' % offset, locals(), context_instance=RequestContext(request))
|
return render_to_response('jlog/log_%s.html' % offset, locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@require_admin
|
@require_admin
|
||||||
def log_kill(request, offset):
|
def log_kill(request):
|
||||||
pid = offset
|
pid = request.GET.get('id', '')
|
||||||
if pid:
|
log = Log.objects.filter(pid=pid)
|
||||||
|
if log:
|
||||||
|
log = log.first()
|
||||||
|
dept_name = log.dept_name
|
||||||
|
deptname = get_session_user_info(request)[4]
|
||||||
|
if is_group_admin(request) and dept_name != deptname:
|
||||||
|
return httperror(request, 'Kill失败, 您无权操作!')
|
||||||
os.kill(int(pid), 9)
|
os.kill(int(pid), 9)
|
||||||
Log.objects.filter(pid=pid).update(is_finished=1, end_time=datetime.now())
|
Log.objects.filter(pid=pid).update(is_finished=1, end_time=datetime.datetime.now())
|
||||||
return HttpResponseRedirect('jlog/log_offline.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jlog/log_offline.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def log_history(request):
|
def log_history(request):
|
||||||
if request.method == 'GET':
|
log_id = request.GET.get('id', 0)
|
||||||
id = request.GET.get('id', 0)
|
log = Log.objects.filter(id=int(log_id))
|
||||||
log = Log.objects.get(id=int(id))
|
if log:
|
||||||
if log:
|
log = log.first()
|
||||||
log_his = "%s.his" % log.log_path
|
dept_name = log.dept_name
|
||||||
if os.path.isfile(log_his):
|
deptname = get_session_user_info(request)[4]
|
||||||
f = open(log_his)
|
if is_group_admin(request) and dept_name != deptname:
|
||||||
content = f.read()
|
return httperror(request, '查看失败, 您无权查看!')
|
||||||
return HttpResponse(content)
|
|
||||||
|
elif is_common_user(request):
|
||||||
|
return httperror(request, '查看失败, 您无权查看!')
|
||||||
|
|
||||||
|
log_his = "%s.his" % log.log_path
|
||||||
|
if os.path.isfile(log_his):
|
||||||
|
f = open(log_his)
|
||||||
|
content = f.read()
|
||||||
|
return HttpResponse(content)
|
||||||
|
else:
|
||||||
|
return httperror(request, '无日志记录, 请查看日志处理脚本是否开启!')
|
||||||
|
|
||||||
|
|
||||||
@require_login
|
@require_login
|
||||||
def log_search(request):
|
def log_search(request):
|
||||||
keyword = request.GET.get('keyword')
|
offset = request.GET.get('env', '')
|
||||||
offset = request.GET.get('env')
|
keyword = request.GET.get('keyword', '')
|
||||||
dept_id = get_user_dept(request)
|
posts = get_user_log(get_user_info(request, offset))
|
||||||
dept_name = DEPT.objects.get(id=dept_id).name
|
|
||||||
user_id = request.session.get('user_id')
|
|
||||||
username = User.objects.get(id=user_id).username
|
|
||||||
|
|
||||||
env_dic = {'online': 0, 'offline': 1}
|
|
||||||
env = env_dic[offset]
|
|
||||||
posts = get_user_log(request, keyword, env, username, dept_name)
|
|
||||||
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
|
||||||
return render_to_response('jlog/log_search.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('jlog/log_search.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
|
@ -670,13 +670,14 @@ def cmd_detail(request):
|
||||||
@require_login
|
@require_login
|
||||||
def perm_apply(request):
|
def perm_apply(request):
|
||||||
header_title, path1, path2 = u'主机权限申请', u'权限管理', u'申请主机'
|
header_title, path1, path2 = u'主机权限申请', u'权限管理', u'申请主机'
|
||||||
user_id = request.session.get('user_id')
|
user_id, username = get_session_user_info(request)[0:2]
|
||||||
username = User.objects.get(id=user_id).username
|
dept_id, deptname, dept = get_session_user_info(request)[3:6]
|
||||||
dept_id = get_user_dept(request)
|
perm_host = user_perm_asset_api(username)
|
||||||
deptname = DEPT.objects.get(id=dept_id).name
|
all_host = Asset.objects.filter(dept=dept)
|
||||||
dept = DEPT.objects.get(id=dept_id)
|
perm_group = user_perm_group_api(username)
|
||||||
posts = Asset.objects.filter(dept=dept)
|
all_group = dept.bisgroup_set.all()
|
||||||
egroup = dept.bisgroup_set.all()
|
posts = [g for g in all_host if g not in perm_host]
|
||||||
|
egroup = [d for d in all_group if d not in perm_group]
|
||||||
dept_da = User.objects.filter(dept_id=dept_id, role='DA')
|
dept_da = User.objects.filter(dept_id=dept_id, role='DA')
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
|
@ -757,7 +758,7 @@ def get_apply_posts(request, status, username, dept_name, keyword=None):
|
||||||
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
|
posts = Apply.objects.filter(Q(applyer__contains=keyword) | Q(approver__contains=keyword)) \
|
||||||
.filter(status=status).filter(dept=dept_name).order_by('-date_add')
|
.filter(status=status).filter(dept=dept_name).order_by('-date_add')
|
||||||
else:
|
else:
|
||||||
posts = Log.objects.filter(status=status).filter(dept=dept_name).order_by('-date_add')
|
posts = Apply.objects.filter(status=status).filter(dept=dept_name).order_by('-date_add')
|
||||||
|
|
||||||
elif is_common_user(request):
|
elif is_common_user(request):
|
||||||
if keyword:
|
if keyword:
|
||||||
|
|
|
@ -17,14 +17,14 @@ database = jumpserver
|
||||||
|
|
||||||
[ldap]
|
[ldap]
|
||||||
ldap_enable = 1
|
ldap_enable = 1
|
||||||
host_url = ldap://127.0.0.1:389
|
host_url = ldap://192.168.8.220:389
|
||||||
base_dn = dc=jumpserver, dc=org
|
base_dn = dc=fun, dc=tv
|
||||||
root_dn = cn=admin,dc=jumpserver,dc=org
|
root_dn = cn=admin,dc=fun,dc=tv
|
||||||
root_pw = secret234
|
root_pw = secret234
|
||||||
|
|
||||||
|
|
||||||
[websocket]
|
[websocket]
|
||||||
web_socket_host = 192.168.20.209:3000
|
web_socket_host = 192.168.173.129:3000
|
||||||
|
|
||||||
|
|
||||||
[mail]
|
[mail]
|
||||||
|
|
|
@ -224,7 +224,6 @@ def is_super_user(request):
|
||||||
|
|
||||||
|
|
||||||
def is_group_admin(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:
|
if request.session.get('role_id') == 1:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
|
@ -248,6 +247,16 @@ def get_session_user_dept(request):
|
||||||
return user, dept
|
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.username, user, dept.id, dept.name, dept]
|
||||||
|
|
||||||
|
|
||||||
def get_user_dept(request):
|
def get_user_dept(request):
|
||||||
user_id = request.session.get('user_id')
|
user_id = request.session.get('user_id')
|
||||||
if user_id:
|
if user_id:
|
||||||
|
@ -414,6 +423,53 @@ def validate(request, user_group=None, user=None, asset_group=None, asset=None,
|
||||||
return True
|
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):
|
def get_dept_asset(request):
|
||||||
dept_id = get_user_dept(request)
|
dept_id = get_user_dept(request)
|
||||||
dept_asset = DEPT.objects.get(id=dept_id).asset_set.all()
|
dept_asset = DEPT.objects.get(id=dept_id).asset_set.all()
|
||||||
|
|
|
@ -83,6 +83,12 @@ def get_item(dictionary, key):
|
||||||
return dictionary.get(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')
|
@register.filter(name='bool2str')
|
||||||
def bool2str(value):
|
def bool2str(value):
|
||||||
if value:
|
if value:
|
||||||
|
|
|
@ -12,10 +12,10 @@ urlpatterns = patterns('',
|
||||||
(r'^logout/$', 'jumpserver.views.logout'),
|
(r'^logout/$', 'jumpserver.views.logout'),
|
||||||
(r'^file/upload/$', 'jumpserver.views.upload'),
|
(r'^file/upload/$', 'jumpserver.views.upload'),
|
||||||
(r'^file/download/$', 'jumpserver.views.download'),
|
(r'^file/download/$', 'jumpserver.views.download'),
|
||||||
|
(r'^error/$', 'jumpserver.views.httperror'),
|
||||||
(r'^juser/', include('juser.urls')),
|
(r'^juser/', include('juser.urls')),
|
||||||
(r'^jasset/', include('jasset.urls')),
|
(r'^jasset/', include('jasset.urls')),
|
||||||
(r'^jlog/', include('jlog.urls')),
|
(r'^jlog/', include('jlog.urls')),
|
||||||
(r'^jperm/', include('jperm.urls')),
|
(r'^jperm/', include('jperm.urls')),
|
||||||
|
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
|
@ -81,10 +81,16 @@ def admin_index(request):
|
||||||
active_hosts = hosts.filter(is_active=1)
|
active_hosts = hosts.filter(is_active=1)
|
||||||
|
|
||||||
# percent of dashboard
|
# percent of dashboard
|
||||||
percent_user = format(active_users.count() / users.count(), '.0%')
|
if users.count() == 0:
|
||||||
percent_host = format(active_hosts.count() / hosts.count(), '.0%')
|
percent_user, percent_online_user = '0%', '0%'
|
||||||
percent_online_user = format(online_user.count() / users.count(), '.0%')
|
else:
|
||||||
percent_online_host = format(online_host.count() / hosts.count(), '.0%')
|
percent_user = format(active_users.count() / users.count(), '.0%')
|
||||||
|
percent_online_user = format(online_user.count() / users.count(), '.0%')
|
||||||
|
if hosts.count() == 0:
|
||||||
|
percent_host, percent_online_host = '0%', '0%'
|
||||||
|
else:
|
||||||
|
percent_host = format(active_hosts.count() / hosts.count(), '.0%')
|
||||||
|
percent_online_host = format(online_host.count() / hosts.count(), '.0%')
|
||||||
|
|
||||||
li_date, li_str = getDaysByNum(7)
|
li_date, li_str = getDaysByNum(7)
|
||||||
today = datetime.datetime.now().day
|
today = datetime.datetime.now().day
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
<div class="middle-box text-center animated fadeInDown">
|
<div class="middle-box text-center animated fadeInDown">
|
||||||
<h1>404</h1>
|
<h1>404</h1>
|
||||||
<h3 class="font-bold">Page Not Found</h3>
|
<h3 class="font-bold">Page Not Found</h3>
|
||||||
|
|
||||||
<div class="error-desc">
|
<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.
|
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">
|
<form class="form-inline m-t" role="form">
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
<!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 text-danger">{{ message }}</h3>
|
||||||
|
<h3 id="jumpTo" class="font-bold text-info"></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>
|
||||||
|
<script>
|
||||||
|
function countDown(secs,surl){
|
||||||
|
var jumpTo = document.getElementById('jumpTo');
|
||||||
|
jumpTo.innerHTML= secs + '秒' + '后返回上一页';
|
||||||
|
if(--secs>0){
|
||||||
|
setTimeout("countDown("+secs+",'"+surl+"')",1000);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
location.href=surl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
countDown(5,document.referrer);
|
||||||
|
</script>
|
||||||
|
</html>
|
||||||
|
|
|
@ -62,7 +62,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-3 border-bottom white-bg dashboard-header" style="margin-left:15px;">
|
<div class="col-lg-3 border-bottom white-bg dashboard-header" style="margin-left:15px;height: 346px">
|
||||||
<h2>活跃用户TOP5</h2>
|
<h2>活跃用户TOP5</h2>
|
||||||
<small>过去一周共有<span class="text-info">{{ week_users }}</span>位用户登录<span class="text-success">{{ week_hosts }}</span>次服务器.</small>
|
<small>过去一周共有<span class="text-info">{{ week_users }}</span>位用户登录<span class="text-success">{{ week_hosts }}</span>次服务器.</small>
|
||||||
<ul class="list-group clear-list m-t">
|
<ul class="list-group clear-list m-t">
|
||||||
|
@ -104,21 +104,25 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
<div class="feed-activity-list">
|
<div class="feed-activity-list">
|
||||||
{% for perm in perm_apply_10 %}
|
{% if perm_apply_10 %}
|
||||||
<div class="feed-element">
|
{% for perm in perm_apply_10 %}
|
||||||
<div>
|
<div class="feed-element">
|
||||||
{% ifequal perm.status 0 %}
|
<div>
|
||||||
<small class="pull-right text-navy">{{ perm.date_add|naturaltime }}</small>
|
{% ifequal perm.status 0 %}
|
||||||
{% else %}
|
<small class="pull-right text-navy">{{ perm.date_add|naturaltime }}</small>
|
||||||
<small class="pull-right">{{ perm.date_add|naturaltime }}</small>
|
{% else %}
|
||||||
{% endifequal %}
|
<small class="pull-right">{{ perm.date_add|naturaltime }}</small>
|
||||||
<strong>{{ perm.applyer }}</strong>
|
{% endifequal %}
|
||||||
<div>申请 {{ perm.bisgroup|ast_to_list }} 主机组权限</div>
|
<strong>{{ perm.applyer }}</strong>
|
||||||
<div>申请 {{ perm.asset|ast_to_list }} 主机权限</div>
|
<div>申请 {{ perm.bisgroup|ast_to_list }} 主机组权限</div>
|
||||||
<small class="text-muted">{{ perm.date_add }}</small>
|
<div>申请 {{ perm.asset|ast_to_list }} 主机权限</div>
|
||||||
|
<small class="text-muted">{{ perm.date_add }}</small>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endfor %}
|
||||||
{% endfor %}
|
{% else %}
|
||||||
|
<p class="text-center">(暂无)</p>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -138,30 +142,8 @@
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
<div>
|
<div>
|
||||||
<div class="feed-activity-list">
|
<div class="feed-activity-list">
|
||||||
{% for login in login_10 %}
|
{% if login_10 %}
|
||||||
<div class="feed-element">
|
{% for login in login_10 %}
|
||||||
<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 %}
|
|
||||||
<div class="feed-element">
|
<div class="feed-element">
|
||||||
<a href="profile.html" class="pull-left">
|
<a href="profile.html" class="pull-left">
|
||||||
<img alt="image" class="img-circle" src="/static/img/root.png">
|
<img alt="image" class="img-circle" src="/static/img/root.png">
|
||||||
|
@ -178,11 +160,35 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% 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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -209,23 +215,27 @@
|
||||||
<small><i class="fa fa-map-marker"></i> 一周Top10用户登录次数及最近一次登录记录. </small>
|
<small><i class="fa fa-map-marker"></i> 一周Top10用户登录次数及最近一次登录记录. </small>
|
||||||
</div>
|
</div>
|
||||||
<div class="ibox-content inspinia-timeline">
|
<div class="ibox-content inspinia-timeline">
|
||||||
{% for data in user_top_ten %}
|
{% if user_top_ten %}
|
||||||
<div class="timeline-item">
|
{% for data in user_top_ten %}
|
||||||
<div class="row">
|
<div class="timeline-item">
|
||||||
<div class="col-xs-5 date">
|
<div class="row">
|
||||||
<i class="fa fa-info-circle"></i>
|
<div class="col-xs-5 date">
|
||||||
<strong>{{ data.user }}</strong>
|
<i class="fa fa-info-circle"></i>
|
||||||
<br/>
|
<strong>{{ data.user }}</strong>
|
||||||
<small class="text-navy">{{ data.times }}次</small>
|
<br/>
|
||||||
</div>
|
<small class="text-navy">{{ data.times }}次</small>
|
||||||
<div class="col-xs-7 content no-top-border">
|
</div>
|
||||||
<p class="m-b-xs">最近一次登录</p>
|
<div class="col-xs-7 content no-top-border">
|
||||||
<p>{{ data.last.host }}</p>
|
<p class="m-b-xs">最近一次登录</p>
|
||||||
<p>于{{ data.last.start_time |date:"Y-m-d H:i:s" }}</p>
|
<p>{{ data.last.host }}</p>
|
||||||
|
<p>于{{ data.last.start_time |date:"Y-m-d H:i:s" }}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endfor %}
|
||||||
{% endfor %}
|
{% else %}
|
||||||
|
<p class="text-center">(暂无)</p>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
{% for host in hosts %}
|
||||||
|
<option value="{{ host.id }}">{{ host.ip }}</option>
|
||||||
|
{% endfor %}
|
|
@ -8,6 +8,23 @@
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
<div id="ibox-content" class="ibox-title">
|
<div id="ibox-content" class="ibox-title">
|
||||||
<h5> 填写主机组基本信息 </h5>
|
<h5> 填写主机组基本信息 </h5>
|
||||||
|
<div class="ibox-tools">
|
||||||
|
<a class="collapse-link">
|
||||||
|
<i class="fa fa-chevron-up"></i>
|
||||||
|
</a>
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
<i class="fa fa-wrench"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu dropdown-user">
|
||||||
|
<li><a href="#">未启用 1</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="#">未启用 2</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<a class="close-link">
|
||||||
|
<i class="fa fa-times"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
{% if emg %}
|
{% if emg %}
|
||||||
|
@ -26,9 +43,9 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label>
|
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label>
|
||||||
<div class="col-sm-8">
|
<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 %}
|
{% for d in edept %}
|
||||||
<option type="checkbox" value="{{ d.name }}">{{ d.name }}</option>
|
<option type="checkbox" value="{{ d.id }}">{{ d.name }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
@ -39,21 +56,22 @@
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts" style="">*</span></label>
|
<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>
|
</div>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div>
|
<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">
|
<div class="col-sm-3">
|
||||||
<select multiple="multiple" id="id_domains_filter" name="domains_filter" style="display: none;">
|
<select multiple="multiple" id="id_domains_filter" name="domains_filter" style="display: none;">
|
||||||
</select>
|
</select>
|
||||||
<div class="input-group" style="padding-bottom: 5px">
|
<div class="input-group" style="padding-bottom: 5px">
|
||||||
<input type="text" size="19" class="form-control input-sm" id="search" name="keyword" placeholder="过滤">
|
<input type="text" size="19" class="form-control input-sm" id="search" name="keyword" placeholder="过滤">
|
||||||
</div>
|
</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 %}
|
{% for post in posts %}
|
||||||
<option value="{{ post.id }}">{{ post.ip }}</option>
|
<option value="{{ post.id }}">{{ post.ip }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -61,14 +79,14 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-1">
|
<div class="col-sm-1">
|
||||||
<div class="btn-group" style="margin-top: 50px;">
|
<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('hosts', 'hosts_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_left('hosts_selected', 'hosts')"><i class="fa fa-chevron-left"></i></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-3">
|
||||||
<h4 style="padding-bottom: 5px">已选中主机</h4>
|
<h4 style="padding-bottom: 5px">已选中主机</h4>
|
||||||
<div>
|
<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 %}
|
{% for post in eposts %}
|
||||||
<option value="{{ post.id }}">{{ post.ip }}</option>
|
<option value="{{ post.id }}">{{ post.ip }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -112,8 +130,8 @@
|
||||||
},
|
},
|
||||||
valid: function(form) {
|
valid: function(form) {
|
||||||
form.submit();
|
form.submit();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function on_submit(id){
|
function on_submit(id){
|
||||||
$('#'+id+' option').each(
|
$('#'+id+' option').each(
|
||||||
|
@ -122,10 +140,8 @@
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$('#search').keyup(function() {
|
$('#search').keyup(function() {
|
||||||
var $rows = $('#groups option');
|
var $rows = $('#hosts option');
|
||||||
console.log($rows);
|
|
||||||
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
|
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
|
||||||
|
|
||||||
$rows.show().filter(function() {
|
$rows.show().filter(function() {
|
||||||
|
@ -133,6 +149,14 @@
|
||||||
return !~text.indexOf(val);
|
return !~text.indexOf(val);
|
||||||
}).hide();
|
}).hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function change_dept(dept_id){
|
||||||
|
$.get('/jasset/dept_host_ajax/',
|
||||||
|
{'id': dept_id},
|
||||||
|
function(data){
|
||||||
|
$('#hosts').html(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -8,7 +8,7 @@
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="ibox float-e-margins" id="all">
|
<div class="ibox float-e-margins" id="all">
|
||||||
<div class="ibox-title">
|
<div class="ibox-title">
|
||||||
<h5> 主机组<span class="text-info">{{ group_name }}</span>详细信息列表 </h5>
|
<h5> 主机组<span class="text-info">{{ group.name }}</span>详细信息列表</h5>
|
||||||
<div class="ibox-tools">
|
<div class="ibox-tools">
|
||||||
<a class="collapse-link">
|
<a class="collapse-link">
|
||||||
<i class="fa fa-chevron-up"></i>
|
<i class="fa fa-chevron-up"></i>
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
<div class="">
|
<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>
|
</div>
|
||||||
|
|
||||||
<form id="contents_form" name="contents_form">
|
<form id="contents_form" name="contents_form">
|
||||||
|
@ -42,7 +42,7 @@
|
||||||
<th class="text-center"> 端口号 </th>
|
<th class="text-center"> 端口号 </th>
|
||||||
<th class="text-center" name="j_type"> 登录方式 </th>
|
<th class="text-center" name="j_type"> 登录方式 </th>
|
||||||
<th class="text-center" name="j_idc"> 所属IDC </th>
|
<th class="text-center" name="j_idc"> 所属IDC </th>
|
||||||
<th class="text-center" id="j_group_name" value="{{ group_name }}"> 所属业务组 </th>
|
<th class="text-center" id="group_id" value="{{ group.id }}"> 所属业务组 </th>
|
||||||
<th class="text-center"> 是否激活 </th>
|
<th class="text-center"> 是否激活 </th>
|
||||||
<th class="text-center" name="j_time"> 添加时间 </th>
|
<th class="text-center" name="j_time"> 添加时间 </th>
|
||||||
<th class="text-center" name="j_comment"> 备注 </th>
|
<th class="text-center" name="j_comment"> 备注 </th>
|
||||||
|
@ -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_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_ip"> {{ post.ip }} </td>
|
||||||
<td class="text-center" name="j_port"> {{ post.port }} </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_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_group">{{ post.bis_group.all | group_str2 }}</td>
|
||||||
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td>
|
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td>
|
||||||
|
@ -64,7 +64,7 @@
|
||||||
<td class="text-center" data-editable='false'>
|
<td class="text-center" data-editable='false'>
|
||||||
<a value="/jasset/{{ post.ip }}/" class="iframe btn btn-xs btn-primary">详情</a>
|
<a value="/jasset/{{ post.ip }}/" class="iframe btn btn-xs btn-primary">详情</a>
|
||||||
<a href="/jasset/host_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
|
<a href="/jasset/host_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
|
||||||
<a href="/jasset/host_del/{{ post.id }}/" class="btn btn-xs btn-danger">删除</a>
|
<a href="/jasset/group_del_host/?id={{ post.id }}&gid={{ group.id }}" class="btn btn-xs btn-danger">删除</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -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="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
|
||||||
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
|
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6">
|
{% include 'paginator.html' %}
|
||||||
<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>
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -126,21 +89,6 @@
|
||||||
$('#editable').editableTableWidget();
|
$('#editable').editableTableWidget();
|
||||||
});
|
});
|
||||||
|
|
||||||
$(".iframe").on('click', function(){
|
|
||||||
var url= $(this).attr("value");
|
|
||||||
$.layer({
|
|
||||||
type: 2,
|
|
||||||
title: 'JumpServer主机详情',
|
|
||||||
maxmin: true,
|
|
||||||
shift: 'top',
|
|
||||||
border: [2, 0.3, '#1AB394'],
|
|
||||||
shade: [0.5, '#000000'],
|
|
||||||
shadeClose: true,
|
|
||||||
area : ['800px' , '600px'],
|
|
||||||
iframe: {src: url}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function alter(form) {
|
function alter(form) {
|
||||||
selectData = GetTableDataBox();
|
selectData = GetTableDataBox();
|
||||||
if (selectData[1] != 0) {
|
if (selectData[1] != 0) {
|
||||||
|
@ -159,8 +107,7 @@
|
||||||
function del(form) {
|
function del(form) {
|
||||||
var checkboxes = document.getElementById(form);
|
var checkboxes = document.getElementById(form);
|
||||||
var id_list = {};
|
var id_list = {};
|
||||||
var group_name = $('#j_group_name').attr("value");
|
var group_id = $('#group_id').attr("value");
|
||||||
console.log(group_name);
|
|
||||||
var j = 0;
|
var j = 0;
|
||||||
for (var i = 0; i < checkboxes.elements.length; i++) {
|
for (var i = 0; i < checkboxes.elements.length; i++) {
|
||||||
if (checkboxes.elements[i].type == "checkbox" && checkboxes.elements[i].checked == true && checkboxes.elements[i].value != "checkall") {
|
if (checkboxes.elements[i].type == "checkbox" && checkboxes.elements[i].checked == true && checkboxes.elements[i].value != "checkall") {
|
||||||
|
@ -171,8 +118,8 @@
|
||||||
if (confirm("确定从主机组中删除")) {
|
if (confirm("确定从主机组中删除")) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: "/jasset/group_del_host/group/",
|
url: "/jasset/group_del_host/?id=group",
|
||||||
data: {"id_list": id_list, "len_list": j, "group_name": group_name},
|
data: {"id_list": id_list, "len_list": j, "group_id": group_id},
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
window.open(window.location.href, "_self");
|
window.open(window.location.href, "_self");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 = $('#hosts 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 %}
|
|
@ -7,9 +7,29 @@
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-10">
|
<div class="col-lg-10">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
|
<div class="ibox-title">
|
||||||
|
<h5> 主机组详细信息列表</h5>
|
||||||
|
<div class="ibox-tools">
|
||||||
|
<a class="collapse-link">
|
||||||
|
<i class="fa fa-chevron-up"></i>
|
||||||
|
</a>
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
<i class="fa fa-wrench"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu dropdown-user">
|
||||||
|
<li><a href="#">未启用 1</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="#">未启用 2</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<a class="close-link">
|
||||||
|
<i class="fa fa-times"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
<div class="">
|
<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">
|
<form id="search_form" method="get" action="" class="pull-right mail-search">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" class="form-control input-sm" id="search_input" name="keyword" placeholder="Search">
|
<input type="text" class="form-control input-sm" id="search_input" name="keyword" placeholder="Search">
|
||||||
|
@ -50,7 +70,7 @@
|
||||||
<td class="text-center">
|
<td class="text-center">
|
||||||
<a href="/jasset/group_detail/?id={{ post.id }}" class="btn btn-xs btn-info">详情</a>
|
<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_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>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -59,7 +79,7 @@
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-6">
|
<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="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
|
||||||
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
|
<!--<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />-->
|
||||||
</div>
|
</div>
|
||||||
{% include 'paginator.html' %}
|
{% include 'paginator.html' %}
|
||||||
</div>
|
</div>
|
||||||
|
@ -84,7 +104,7 @@
|
||||||
if (confirm("确定删除")) {
|
if (confirm("确定删除")) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: "/jasset/group_del/multi/",
|
url: "/jasset/group_del/?id=multi",
|
||||||
data: {"id_list": id_list, "len_list": j},
|
data: {"id_list": id_list, "len_list": j},
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
window.open("/jasset/group_list/", "_self");
|
window.open("/jasset/group_list/", "_self");
|
||||||
|
|
|
@ -79,7 +79,7 @@
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<select id="j_idc" name="j_idc" class="form-control m-b">
|
<select id="j_idc" name="j_idc" class="form-control m-b">
|
||||||
{% for i in eidc %}
|
{% for i in eidc %}
|
||||||
<option> {{ i }} </option>
|
<option value="{{i.id}}"> {{ i }} </option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
@ -92,7 +92,7 @@
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10">
|
<select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10">
|
||||||
{% for d in edept %}
|
{% 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 %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
@ -101,18 +101,19 @@
|
||||||
|
|
||||||
{% ifequal session_role_id 1 %}
|
{% ifequal session_role_id 1 %}
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group"><label class="col-sm-2 control-label"> 所属部门 </label>
|
<div class="form-group"><label class="col-sm-2 control-label"> 所属部门 <span class="red-fonts">*</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="{{ dept.id }}" style="display: none">
|
||||||
|
<div class="col-sm-8"><input type="text" value="{{ dept.name }}" class="form-control" readonly="readonly"></div>
|
||||||
</div>
|
</div>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<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">
|
<div class="col-sm-8">
|
||||||
<select id="j_group" name="j_group" class="form-control m-b" multiple size="10">
|
<select id="j_group" name="j_group" class="form-control m-b" multiple size="10">
|
||||||
{% for g in egroup %}
|
{% 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 %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
@ -183,12 +184,6 @@ $('#assetForm').validator({
|
||||||
ok: "",
|
ok: "",
|
||||||
msg: {required: "必须填写!"}
|
msg: {required: "必须填写!"}
|
||||||
},
|
},
|
||||||
"j_group": {
|
|
||||||
rule: "required",
|
|
||||||
tip: "选择主机组",
|
|
||||||
ok: "",
|
|
||||||
msg: {checked: "至少选择一个组"}
|
|
||||||
},
|
|
||||||
"j_idc": {
|
"j_idc": {
|
||||||
rule: "required",
|
rule: "required",
|
||||||
tip: "选择IDC",
|
tip: "选择IDC",
|
||||||
|
|
|
@ -42,9 +42,10 @@
|
||||||
{% if smg %}
|
{% if smg %}
|
||||||
<div class="alert alert-success text-center">{{ smg }}</div>
|
<div class="alert alert-success text-center">{{ smg }}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<h4>按照文本框内主机信息格式填写, 多台主机回车换行</h4>
|
<p>请严格按照文本框内主机信息格式填写, 多台主机回车换行, 具体格式如下: </p>
|
||||||
|
<p class="text-info">IP地址 端口号 登录方式 IDC名 所属主机组 所属部门 激活/禁用 备注 </p>
|
||||||
<form id="assetMulti" method="post" class="form-horizontal">
|
<form id="assetMulti" method="post" class="form-horizontal">
|
||||||
<div><textarea id="j_multi" name="j_multi" type="text" placeholder="192.168.1.1 22 LDAP 北京联通 [网站,数据库] 运维部 1 网站服务器" class="form-control" style="width:700px;height:500px">192.168.1.1 22 LDAP 北京联通 ['网站','数据库'] ['运维部'] 1 网站服务器</textarea></div>
|
<div><textarea id="j_multi" name="j_multi" type="text" placeholder="192.168.1.1 22 LDAP 北京联通 [网站,数据库] 运维部 激活 网站服务器" class="form-control" style="width:700px;height:500px">192.168.1.1 22 LDAP 北京联通 ['网站','数据库'] ['运维部','测试部'] 激活 网站服务器</textarea></div>
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-4 col-sm-offset-4">
|
<div class="col-sm-4 col-sm-offset-4">
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="text-navy">登录方式</td>
|
<td class="text-navy">登录方式</td>
|
||||||
<td>{{ login_types|get_item:post.login_type }}</td>
|
<td>{{ post.login_type|get_login_type }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="text-navy">IDC</td>
|
<td class="text-navy">IDC</td>
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="text-navy">激活</td>
|
<td class="text-navy">激活</td>
|
||||||
<td>{{ user.is_active|bool2str }}</td>
|
<td>{{ post.is_active|bool2str }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="text-navy">添加日期</td>
|
<td class="text-navy">添加日期</td>
|
||||||
|
@ -116,13 +116,17 @@
|
||||||
<div>
|
<div>
|
||||||
<div class="text-left">
|
<div class="text-left">
|
||||||
<table class="table">
|
<table class="table">
|
||||||
{% for user in user_permed_list %}
|
{% if user_permed_list %}
|
||||||
<tr>
|
{% for user in user_permed_list %}
|
||||||
<td class="text-navy">{{ user.name }}</td>
|
<tr>
|
||||||
<td>{{ user.dept.name }}</td>
|
<td class="text-navy">{{ user.name }}</td>
|
||||||
<td><a href="/juser/user_detail/?id={{ user.id }}">详情</a></td>
|
<td>{{ user.dept.name }}</td>
|
||||||
</tr>
|
<td><a href="/juser/user_detail/?id={{ user.id }}">详情</a></td>
|
||||||
{% endfor %}
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<p class="text-center">(暂无)</p>
|
||||||
|
{% endif %}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -153,45 +157,50 @@
|
||||||
<small><i class="fa fa-map-marker"></i> 此主机最近一周用户登录信息.</small>
|
<small><i class="fa fa-map-marker"></i> 此主机最近一周用户登录信息.</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="ibox-content inspinia-timeline">
|
<div class="ibox-content inspinia-timeline">
|
||||||
{% for l in log %}
|
{% if log %}
|
||||||
<div class="timeline-item">
|
{% for l in log %}
|
||||||
<div class="row">
|
<div class="timeline-item">
|
||||||
<div class="col-xs-5 date">
|
<div class="row">
|
||||||
<i class="fa fa-info-circle"></i>
|
<div class="col-xs-5 date">
|
||||||
<small class="text-navy">{{ l.user }}</small>
|
<i class="fa fa-info-circle"></i>
|
||||||
<br/>
|
<small class="text-navy">{{ l.user }}</small>
|
||||||
<strong>{{l.dept_name}}</strong>
|
<br/>
|
||||||
</div>
|
<strong>{{l.dept_name}}</strong>
|
||||||
<div class="col-xs-7 content no-top-border">
|
</div>
|
||||||
<p class="m-b-xs"><strong>详细信息</strong></p>
|
<div class="col-xs-7 content no-top-border">
|
||||||
<p>来源IP: {{ l.remote_ip }}</p>
|
<p class="m-b-xs"><strong>详细信息</strong></p>
|
||||||
<p>开始: {{ l.start_time |date:"Y-m-d H:i:s" }}</p>
|
<p>来源IP: {{ l.remote_ip }}</p>
|
||||||
<p>结束: {{ l.end_time |date:"Y-m-d H:i:s" }}</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>
|
</div>
|
||||||
</div>
|
{% endfor %}
|
||||||
{% endfor %}
|
<button id="show" class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> 所有 </button>
|
||||||
<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">
|
||||||
<div id='more' style="display: none">
|
<br/>
|
||||||
<br/>
|
{% for l in log_more %}
|
||||||
{% for l in log_more %}
|
<div class="timeline-item">
|
||||||
<div class="timeline-item">
|
<div class="row">
|
||||||
<div class="row">
|
<div class="col-xs-5 date">
|
||||||
<div class="col-xs-5 date">
|
<i class="fa fa-info-circle"></i>
|
||||||
<i class="fa fa-info-circle"></i>
|
<small class="text-navy">{{ l.user }}</small>
|
||||||
<small class="text-navy">{{ l.user }}</small>
|
<br/>
|
||||||
<br/>
|
<strong>{{l.dept_name}}</strong>
|
||||||
<strong>{{l.dept_name}}</strong>
|
</div>
|
||||||
</div>
|
<div class="col-xs-7 content no-top-border">
|
||||||
<div class="col-xs-7 content no-top-border">
|
<p class="m-b-xs"><strong>详细信息</strong></p>
|
||||||
<p class="m-b-xs"><strong>详细信息</strong></p>
|
<p>来源IP: {{ l.remote_ip }}</p>
|
||||||
<p>来源IP: {{ l.remote_ip }}</p>
|
<p>开始: {{ l.start_time |date:"Y-m-d H:i:s" }}</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>
|
||||||
<p>结束: {{ l.end_time |date:"Y-m-d H:i:s" }}</p>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endfor %}
|
||||||
{% endfor %}
|
{% else %}
|
||||||
|
<p class="text-center">(暂无)</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -49,29 +49,21 @@
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
{% for t, type in login_types.items %}
|
{% for t, type in login_types.items %}
|
||||||
{% ifequal t post.login_type %}
|
{% 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 %}
|
{% 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 %}
|
{% endifequal %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% ifequal post.login_type M %}
|
{% ifequal post.login_type 'M' %}
|
||||||
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户名 </label>
|
<div name="type" id="type">
|
||||||
<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;">
|
|
||||||
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户名 </label>
|
<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>
|
||||||
|
|
||||||
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户密码 </label>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
|
@ -84,41 +76,51 @@
|
||||||
<select id="j_idc" name="j_idc" class="form-control m-b">
|
<select id="j_idc" name="j_idc" class="form-control m-b">
|
||||||
{% for i in eidc %}
|
{% for i in eidc %}
|
||||||
{% ifequal i.id post.idc_id %}
|
{% ifequal i.id post.idc_id %}
|
||||||
<option selected> {{ i }} </option>
|
<option value="{{i.id}}" selected> {{ i }} </option>
|
||||||
{% else %}
|
{% else %}
|
||||||
<option> {{ i }} </option>
|
<option value="{{i.id}}"> {{ i }} </option>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
{% ifequal session_role_id 2 %}
|
||||||
<div class="form-group">
|
<div class="hr-line-dashed"></div>
|
||||||
<label for="j_dept" class="col-lg-2 control-label"> 所属部门<span class="red-fonts">*</span> </label>
|
<div class="form-group">
|
||||||
<div class="col-sm-8">
|
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label>
|
||||||
<select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10">
|
<div class="col-sm-8">
|
||||||
{% for g in edept %}
|
<select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10">
|
||||||
{% if g in e_dept %}
|
{% for d in edept %}
|
||||||
<option type="checkbox" value="{{ g.name }}" selected>{{ g.name }} --- {{ g.comment }}</option>
|
{% if d in e_dept %}
|
||||||
{% else %}
|
<option type="checkbox" selected value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
|
||||||
<option type="checkbox" value="{{ g.name }}" >{{ g.name }} --- {{ g.comment }}</option>
|
{% else %}
|
||||||
{% endif %}
|
<option type="checkbox" value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
|
||||||
{% endfor %}
|
{% endif %}
|
||||||
</select>
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
</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="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<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">
|
<div class="col-sm-8">
|
||||||
<select id="j_group" name="j_group" class="form-control m-b" multiple size="10">
|
<select id="j_group" name="j_group" class="form-control m-b" multiple size="10">
|
||||||
{% for g in egroup %}
|
{% for g in egroup %}
|
||||||
{% if g in e_group %}
|
{% 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 %}
|
{% 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 %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
|
@ -147,7 +149,7 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-4 col-sm-offset-5">
|
<div class="col-sm-4 col-sm-offset-5">
|
||||||
<button class="btn btn-white" type="submit"> 重置 </button>
|
<button class="btn btn-white" type="submit"> 重置 </button>
|
||||||
<button class="btn btn-primary" type="submit"> 提交 </button>
|
<button class="btn btn-primary" type="submit" style="display: i"> 提交 </button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -162,10 +164,10 @@
|
||||||
function show(o){
|
function show(o){
|
||||||
showFlag[o.name]=o.value;
|
showFlag[o.name]=o.value;
|
||||||
if(showFlag.j_type=="M"){
|
if(showFlag.j_type=="M"){
|
||||||
document.getElementById("a1").style.display="";
|
document.getElementById("type").style.display="";
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
document.getElementById("a1").style.display="none";
|
document.getElementById("type").style.display="none";
|
||||||
}};
|
}};
|
||||||
$('#assetForm').validator({
|
$('#assetForm').validator({
|
||||||
timely: 2,
|
timely: 2,
|
||||||
|
@ -190,11 +192,17 @@ $('#assetForm').validator({
|
||||||
ok: "",
|
ok: "",
|
||||||
msg: {required: "必须填写!"}
|
msg: {required: "必须填写!"}
|
||||||
},
|
},
|
||||||
"j_group": {
|
"j_idc": {
|
||||||
rule: "checked",
|
rule: "required",
|
||||||
tip: "选择业务组",
|
tip: "选择IDC",
|
||||||
ok: "",
|
ok: "",
|
||||||
msg: {checked: "至少选择一个组"}
|
msg: {checked: "必须填写!"}
|
||||||
|
},
|
||||||
|
"j_dept": {
|
||||||
|
rule: "required",
|
||||||
|
tip: "选择部门",
|
||||||
|
ok: "",
|
||||||
|
msg: {checked: "至少选择一个部门"}
|
||||||
},
|
},
|
||||||
"j_user": {
|
"j_user": {
|
||||||
rule: "required(type_m)",
|
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_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_ip"> {{ post.ip }} </td>
|
||||||
<td class="text-center" name="j_port"> {{ post.port }} </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_idc"> {{ post.idc.name }} </td>
|
||||||
<td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</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>
|
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td>
|
||||||
|
|
|
@ -66,14 +66,14 @@
|
||||||
<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_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_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_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_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_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>
|
<td class="text-center" data-editable='false' name="j_group">{{ post.bis_group.all | group_str2_all }}</td>
|
||||||
<td class="text-center" name="j_alias"> {{ post|get_user_alias:user_id }} </td>
|
<td class="text-center" name="j_alias"> {{ post|get_user_alias:user_id }} </td>
|
||||||
<td class="text-center" data-editable='false' name="j_comment"> {{ post.comment }} </td>
|
<td class="text-center" data-editable='false' name="j_comment"> {{ post.comment }} </td>
|
||||||
<td class="text-center" data-editable='false'>
|
<td class="text-center" data-editable='false'>
|
||||||
<a value="/jasset/{{ post.ip }}/" class="iframe btn btn-xs btn-primary">详情</a>
|
<a href="/jasset/host_detail/?id={{ post.id }}" class="iframe btn btn-xs btn-primary">详情</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -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_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_ip"> {{ post.ip }} </td>
|
||||||
<td class="text-center" name="j_port"> {{ post.port }} </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_idc"> {{ post.idc.name }} </td>
|
||||||
<td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</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>
|
<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_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_ip"> {{ post.ip }} </td>
|
||||||
<td class="text-center" name="j_port"> {{ post.port }} </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_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_group">{{ post.bis_group.all | group_str2 }}</td>
|
||||||
{% ifnotequal session_role_id 0 %}
|
{% ifnotequal session_role_id 0 %}
|
||||||
|
|
|
@ -35,43 +35,14 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<form id="assetForm" method="post" class="form-horizontal">
|
<form id="assetForm" method="post" class="form-horizontal">
|
||||||
<div class="form-group"><label class="col-sm-2 control-label"> IDC名 <span class="red-fonts">*</span></label>
|
<div class="form-group"><label class="col-sm-2 control-label"> IDC名 <span class="red-fonts">*</span></label>
|
||||||
<div class="col-sm-8"><input type="text" value="{{ j_idc.name }}" placeholder="北京联通" name="j_idc" class="form-control"></div>
|
<div class="col-sm-8"><input type="text" value="{{ idc.name }}" placeholder="北京联通" name="j_idc" class="form-control"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group"><label class="col-sm-2 control-label"> 备注 </label>
|
<div class="form-group"><label class="col-sm-2 control-label"> 备注 </label>
|
||||||
<div class="col-sm-8"><input type="text" value="{{ j_idc.comment }}" placeholder="核心联通机房" name="j_comment" class="form-control"></div>
|
<div class="col-sm-8"><input type="text" value="{{ idc.comment }}" placeholder="核心联通机房" name="j_comment" class="form-control"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if edit %}
|
|
||||||
<div class="hr-line-dashed"></div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="groups" class="col-lg-2 control-label">主机</label>
|
|
||||||
<div class="col-sm-3">
|
|
||||||
<select id="groups" name="idc_default" 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-white" onclick="move('groups', 'groups_selected')"><i class="fa fa-chevron-right"></i></button>
|
|
||||||
<button type="button" class="btn btn-white" onclick="move_left('groups_selected', 'groups')"><i class="fa fa-chevron-left"></i> </button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-3">
|
|
||||||
<div>
|
|
||||||
<select id="groups_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>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-4 col-sm-offset-5">
|
<div class="col-sm-4 col-sm-offset-5">
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="ibox float-e-margins" id="all">
|
<div class="ibox float-e-margins" id="all">
|
||||||
<div class="ibox-title">
|
<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">
|
<div class="ibox-tools">
|
||||||
<a class="collapse-link">
|
<a class="collapse-link">
|
||||||
<i class="fa fa-chevron-up"></i>
|
<i class="fa fa-chevron-up"></i>
|
||||||
|
@ -29,8 +29,14 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ibox-content">
|
<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="">
|
<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>
|
</div>
|
||||||
|
|
||||||
<form id="contents_form" name="contents_form">
|
<form id="contents_form" name="contents_form">
|
||||||
|
@ -55,15 +61,18 @@
|
||||||
<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_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_ip"> {{ post.ip }} </td>
|
||||||
<td class="text-center" name="j_port"> {{ post.port }} </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_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_dept">{{ post.dept.all | group_str2 }}</td>
|
||||||
|
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td>
|
||||||
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td>
|
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td>
|
||||||
<td class="text-center"> {{ post.date_added|date:"Y-m-d H:i:s" }} </td>
|
|
||||||
<td class="text-center" name="j_comment"> {{ post.comment }} </td>
|
<td class="text-center" name="j_comment"> {{ post.comment }} </td>
|
||||||
<td class="text-center" data-editable='false'>
|
<td class="text-center" data-editable='false'>
|
||||||
<a value="/jasset/{{ post.ip }}/" class="iframe btn btn-xs btn-primary">详情</a>
|
<a href="/jasset/host_detail/?id={{ post.id }}" class="btn btn-xs btn-primary">详情</a>
|
||||||
<a href="/jasset/host_del/{{ post.id }}" class="btn btn-xs btn-danger">删除</a>
|
{% ifnotequal session_role_id 0 %}
|
||||||
|
<a href="/jasset/host_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
|
||||||
|
<a href="/jasset/host_del/{{ post.id }}" class="btn btn-xs btn-danger">删除</a>
|
||||||
|
{% endifnotequal %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -74,38 +83,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="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
|
||||||
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
|
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6">
|
{% include 'paginator.html' %}
|
||||||
<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={{ idc_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 %}
|
|
||||||
{% for page in page_range %}
|
|
||||||
{% ifequal current_page page %}
|
|
||||||
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?id={{ idc_id }}&page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
|
|
||||||
{% else %}
|
|
||||||
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?id={{ idc_id }}&page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
|
|
||||||
{% endifequal %}
|
|
||||||
{% endfor %}
|
|
||||||
{% if contacts.has_next %}
|
|
||||||
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
|
|
||||||
<a href="?id={{ idc_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>
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -119,21 +97,6 @@
|
||||||
$('#editable').editableTableWidget();
|
$('#editable').editableTableWidget();
|
||||||
});
|
});
|
||||||
|
|
||||||
$(".iframe").on('click', function(){
|
|
||||||
var url= $(this).attr("value");
|
|
||||||
$.layer({
|
|
||||||
type: 2,
|
|
||||||
title: 'JumpServer主机详情',
|
|
||||||
maxmin: true,
|
|
||||||
shift: 'top',
|
|
||||||
border: [2, 0.3, '#1AB394'],
|
|
||||||
shade: [0.5, '#000000'],
|
|
||||||
shadeClose: true,
|
|
||||||
area : ['800px' , '600px'],
|
|
||||||
iframe: {src: url}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function alter(form) {
|
function alter(form) {
|
||||||
selectData = GetTableDataBox();
|
selectData = GetTableDataBox();
|
||||||
if (selectData[1] != 0) {
|
if (selectData[1] != 0) {
|
||||||
|
@ -164,7 +127,7 @@
|
||||||
if (confirm("确定从该IDC中删除")) {
|
if (confirm("确定从该IDC中删除")) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: "/jasset/group_del_host/idc/",
|
url: "/jasset/host_del/multi/",
|
||||||
data: {"id_list": id_list, "len_list": j, "group_name": group_name},
|
data: {"id_list": id_list, "len_list": j, "group_name": group_name},
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
window.open(window.location.href, "_self");
|
window.open(window.location.href, "_self");
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
{% 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> 填写IDC基本信息 </h5>
|
||||||
|
<div class="ibox-tools">
|
||||||
|
<a class="collapse-link">
|
||||||
|
<i class="fa fa-chevron-up"></i>
|
||||||
|
</a>
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
<i class="fa fa-wrench"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu dropdown-user">
|
||||||
|
<li><a href="#">未启用 1</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="#">未启用 2</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<a class="close-link">
|
||||||
|
<i class="fa fa-times"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ibox-content">
|
||||||
|
{% 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"> IDC名 <span class="red-fonts">*</span></label>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
<input name="id" type="text" value="{{ idc.id }}" style="display: none;">
|
||||||
|
<input type="text" value="{{ idc.name }}" placeholder="北京联通" name="j_idc" class="form-control">
|
||||||
|
</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="{{ idc.comment }}" placeholder="核心联通机房" name="j_comment" class="form-control"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="hr-line-dashed"></div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="groups" class="col-lg-2 control-label">主机</label>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<select id="groups" name="idc_default" 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-white" onclick="move('groups', 'groups_selected')"><i class="fa fa-chevron-right"></i></button>
|
||||||
|
<button type="button" class="btn btn-white" onclick="move_left('groups_selected', 'groups')"><i class="fa fa-chevron-left"></i> </button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<div>
|
||||||
|
<select id="groups_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 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="sumbit"> 提交 </button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$('#assetForm').validator({
|
||||||
|
timely: 2,
|
||||||
|
theme: "yellow_right_effect",
|
||||||
|
fields: {
|
||||||
|
"j_idc": {
|
||||||
|
rule: "required",
|
||||||
|
tip: "输入IDC名",
|
||||||
|
ok: "",
|
||||||
|
msg: {required: "IDC名必须填写!"},
|
||||||
|
data: {'data-ok':"主机名可以使用", 'data-msg-required': '主机名已正确'}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
valid: function(form) {
|
||||||
|
form.submit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{% endblock %}
|
|
@ -7,6 +7,26 @@
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-10">
|
<div class="col-lg-10">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
|
<div class="ibox-title">
|
||||||
|
<h5> IDC详细信息列表</h5>
|
||||||
|
<div class="ibox-tools">
|
||||||
|
<a class="collapse-link">
|
||||||
|
<i class="fa fa-chevron-up"></i>
|
||||||
|
</a>
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
<i class="fa fa-wrench"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu dropdown-user">
|
||||||
|
<li><a href="#">未启用 1</a>
|
||||||
|
</li>
|
||||||
|
<li><a href="#">未启用 2</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<a class="close-link">
|
||||||
|
<i class="fa fa-times"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
<div class="">
|
<div class="">
|
||||||
{% ifequal session_role_id 2 %}
|
{% ifequal session_role_id 2 %}
|
||||||
|
@ -55,7 +75,7 @@
|
||||||
<a href="/jasset/idc_detail/?id={{ post.id }}" class="iframe btn btn-xs btn-primary">详情</a>
|
<a href="/jasset/idc_detail/?id={{ post.id }}" class="iframe btn btn-xs btn-primary">详情</a>
|
||||||
{% ifequal session_role_id 2 %}
|
{% ifequal session_role_id 2 %}
|
||||||
<a href="/jasset/idc_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
|
<a href="/jasset/idc_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
|
||||||
<a href="/jasset/idc_del/{{ post.id }}" class="btn btn-xs btn-danger">删除</a>
|
<a href="/jasset/idc_del/?id={{ post.id }}" class="btn btn-xs btn-danger">删除</a>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -66,7 +86,7 @@
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
{% ifequal session_role_id 2 %}
|
{% ifequal session_role_id 2 %}
|
||||||
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
|
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
|
||||||
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
|
<!--<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />-->
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
</div>
|
</div>
|
||||||
{% include 'paginator.html' %}
|
{% include 'paginator.html' %}
|
||||||
|
@ -92,7 +112,7 @@
|
||||||
if (confirm("确定删除")) {
|
if (confirm("确定删除")) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: "/jasset/idc_del/multi/",
|
url: "/jasset/idc_del/?id=multi",
|
||||||
data: {"id_list": id_list, "len_list": j},
|
data: {"id_list": id_list, "len_list": j},
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
window.open("/jasset/idc_list/", "_self");
|
window.open("/jasset/idc_list/", "_self");
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
<tr class="gradeX">
|
<tr class="gradeX">
|
||||||
<td> <a id="ip" class="iframe" href="/jasset/{{ post.ip }}/">{{ post.ip }}</a></td>
|
<td> <a id="ip" class="iframe" href="/jasset/{{ post.ip }}/">{{ post.ip }}</a></td>
|
||||||
<td> {{ post.port }} </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"> {{ post.idc.name }} </td>
|
||||||
<td class="text-center">{% for group in post.bis_group.all %} {{ group }} {% endfor %}</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>
|
<td class="text-center"> {{ post.date_added|date:"Y-m-d H:i:s" }} </td>
|
||||||
|
|
|
@ -155,7 +155,7 @@
|
||||||
if (option == 'new') {
|
if (option == 'new') {
|
||||||
tag.append('<p style="margin: 2px">' + escapeString(obj.content) + '</p>');
|
tag.append('<p style="margin: 2px">' + escapeString(obj.content) + '</p>');
|
||||||
} else if (option == 'exist') {
|
} else if (option == 'exist') {
|
||||||
tag.append('<p style="margin: 0">' + exsit_message + '</p>');
|
tag.append('<pre>' + exsit_message + '</pre>');
|
||||||
}
|
}
|
||||||
tag.animate({ scrollTop: tag[0].scrollHeight}, 1);
|
tag.animate({ scrollTop: tag[0].scrollHeight}, 1);
|
||||||
});
|
});
|
||||||
|
@ -204,12 +204,12 @@
|
||||||
})
|
})
|
||||||
|
|
||||||
function cut(num){
|
function cut(num){
|
||||||
var g_url = "/jlog/log_kill/"+num;
|
var g_url = "/jlog/log_kill/?id="+num;
|
||||||
console.log(g_url);
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "GET",
|
type: "GET",
|
||||||
url: g_url,
|
url: g_url,
|
||||||
success: window.open("/jlog/log_list/online/","_self")
|
success: window.open("/jlog/log_list/online/", "_self")
|
||||||
|
// error: window.open(g_url, "_self")
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,9 +16,9 @@
|
||||||
{% for post in contacts.object_list %}
|
{% for post in contacts.object_list %}
|
||||||
<tr class="gradeX">
|
<tr class="gradeX">
|
||||||
<td class="text-center" id="username"> {{ post.user }} </td>
|
<td class="text-center" id="username"> {{ post.user }} </td>
|
||||||
<td class="text-center" id="ip"> {{ post.dept_name }} </td>
|
<td class="text-center" id="dept_name"> {{ post.dept_name }} </td>
|
||||||
<td class="text-center" id="ip"> {{ post.host }} </td>
|
<td class="text-center" id="host"> {{ post.host }} </td>
|
||||||
<td class="text-center" id="ip"> {{ post.remote_ip }} </td>
|
<td class="text-center" id="remote_ip"> {{ post.remote_ip }} </td>
|
||||||
<td class="text-center"><a href="/jlog/history/?id={{ post.id }}" class="log_command"> 命令统计 </td>
|
<td class="text-center"><a href="/jlog/history/?id={{ post.id }}" class="log_command"> 命令统计 </td>
|
||||||
<td class="text-center" id="start_time"> {{ post.start_time|date:"Y-m-d H:i:s"}} </td>
|
<td class="text-center" id="start_time"> {{ post.start_time|date:"Y-m-d H:i:s"}} </td>
|
||||||
<td class="text-center" id="end_time"> {{ post.end_time|date:"Y-m-d H:i:s" }} </td>
|
<td class="text-center" id="end_time"> {{ post.end_time|date:"Y-m-d H:i:s" }} </td>
|
||||||
|
|
|
@ -36,17 +36,17 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<form id="assetForm" method="post" class="form-horizontal">
|
<form id="assetForm" method="post" class="form-horizontal">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="form-group"><label class="col-sm-2 control-label"> 申请人 </label>
|
<div class="form-group"><label class="col-sm-2 control-label"> 申请人 <span class="red-fonts">*</span></label>
|
||||||
<div class="col-sm-8"><input type="text" name="applyer" value="{{ username }}" class="form-control" readonly="readonly"></div>
|
<div class="col-sm-8"><input type="text" name="applyer" value="{{ username }}" class="form-control" readonly="readonly"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group"><label class="col-sm-2 control-label"> 所在部门 </label>
|
<div class="form-group"><label class="col-sm-2 control-label"> 所在部门 <span class="red-fonts">*</span></label>
|
||||||
<div class="col-sm-8"><input type="text" name="dept" value="{{ deptname }}" class="form-control" readonly="readonly"></div>
|
<div class="col-sm-8"><input type="text" name="dept" value="{{ deptname }}" class="form-control" readonly="readonly"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group"><label class="col-sm-2 control-label"> 部门管理员 </label>
|
<div class="form-group"><label class="col-sm-2 control-label"> 部门管理员 <span class="red-fonts">*</span></label>
|
||||||
<div class="radio">
|
<div class="radio">
|
||||||
{% for da in dept_da %}
|
{% for da in dept_da %}
|
||||||
<label><input type="radio" value="{{ da.id }}" id="da" name="da"> {{ da }}</label>
|
<label><input type="radio" value="{{ da.id }}" id="da" name="da"> {{ da }}</label>
|
||||||
|
@ -56,7 +56,7 @@
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="group" class="col-lg-2 control-label">主机组<span class="red-fonts">*</span></label>
|
<label for="group" class="col-lg-2 control-label">主机组</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<select id="group" name="group" class="form-control m-b" multiple size="10">
|
<select id="group" name="group" class="form-control m-b" multiple size="10">
|
||||||
{% for g in egroup %}
|
{% for g in egroup %}
|
||||||
|
|
|
@ -27,11 +27,11 @@
|
||||||
<a><i class="fa fa-cube"></i> <span class="nav-label">资产管理</span><span class="fa arrow"></span></a>
|
<a><i class="fa fa-cube"></i> <span class="nav-label">资产管理</span><span class="fa arrow"></span></a>
|
||||||
<ul class="nav nav-second-level">
|
<ul class="nav nav-second-level">
|
||||||
<li class="host_add host_add_multi"><a href="/jasset/host_add/">添加资产</a></li>
|
<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_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="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_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>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li id="jperm">
|
<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="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="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_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>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li id="jperm">
|
<li id="jperm">
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
listening on *:3000
|
Loading…
Reference in New Issue