Commit 8bf9103f authored by ibuler's avatar ibuler

修改资产管理

parent 4eb78e15
...@@ -127,14 +127,14 @@ def test_add_log(): ...@@ -127,14 +127,14 @@ def test_add_log():
if __name__ == '__main__': if __name__ == '__main__':
install() # install()
test_add_dept() # test_add_dept()
test_add_group() # test_add_group()
test_add_user() # test_add_user()
test_add_idc() # test_add_idc()
test_add_asset_group() # test_add_asset_group()
test_add_asset() test_add_asset()
test_add_log() # test_add_log()
......
...@@ -3,15 +3,7 @@ from django.db import models ...@@ -3,15 +3,7 @@ from django.db import models
from juser.models import User, UserGroup from juser.models import User, UserGroup
class IDC(models.Model): class AssetGroup(models.Model):
name = models.CharField(max_length=40, unique=True)
comment = models.CharField(max_length=80, blank=True, null=True)
def __unicode__(self):
return self.name
class BisGroup(models.Model):
GROUP_TYPE = ( GROUP_TYPE = (
('P', 'PRIVATE'), ('P', 'PRIVATE'),
('A', 'ASSET'), ('A', 'ASSET'),
...@@ -67,17 +59,12 @@ class BisGroup(models.Model): ...@@ -67,17 +59,12 @@ class BisGroup(models.Model):
class Asset(models.Model): class Asset(models.Model):
LOGIN_TYPE_CHOICES = (
('L', 'LDAP'),
('M', 'MAP'),
)
ip = models.IPAddressField(unique=True) ip = models.IPAddressField(unique=True)
port = models.IntegerField(max_length=6) port = models.IntegerField(max_length=6)
idc = models.ForeignKey(IDC) group = models.ManyToManyField(AssetGroup)
bis_group = models.ManyToManyField(BisGroup)
login_type = models.CharField(max_length=1, choices=LOGIN_TYPE_CHOICES, default='L')
username = models.CharField(max_length=20, blank=True, null=True) username = models.CharField(max_length=20, blank=True, null=True)
password = models.CharField(max_length=80, blank=True, null=True) password = models.CharField(max_length=80, blank=True, null=True)
use_default_auth = models.BooleanField(default=True)
date_added = models.DateTimeField(auto_now=True, default=datetime.datetime.now(), null=True) date_added = models.DateTimeField(auto_now=True, default=datetime.datetime.now(), null=True)
is_active = models.BooleanField(default=True) is_active = models.BooleanField(default=True)
comment = models.CharField(max_length=100, blank=True, null=True) comment = models.CharField(max_length=100, blank=True, null=True)
...@@ -108,4 +95,4 @@ class AssetAlias(models.Model): ...@@ -108,4 +95,4 @@ class AssetAlias(models.Model):
alias = models.CharField(max_length=100, blank=True, null=True) alias = models.CharField(max_length=100, blank=True, null=True)
def __unicode__(self): def __unicode__(self):
return self.comment return self.alias
\ No newline at end of file
...@@ -3,26 +3,23 @@ from django.conf.urls import patterns, include, url ...@@ -3,26 +3,23 @@ from django.conf.urls import patterns, include, url
from jasset.views import * from jasset.views import *
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^host_add/$', host_add), url(r'^asset_add/$', asset_add),
url(r"^host_add_multi/$", host_add_batch), # url(r"^host_add_multi/$", host_add_batch),
url(r'^host_list/$', host_list),
url(r'^search/$', host_search),
url(r"^host_detail/$", host_detail),
url(r"^dept_host_ajax/$", dept_host_ajax),
url(r"^show_all_ajax/$", show_all_ajax),
url(r'^idc_add/$', idc_add),
url(r'^idc_list/$', idc_list),
url(r'^idc_edit/$', idc_edit),
url(r'^idc_detail/$', idc_detail),
url(r'^idc_del/$', idc_del),
url(r'^group_add/$', group_add), url(r'^group_add/$', group_add),
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'^asset_list/$', asset_list),
url(r'^group_del_host/$', group_del_host), url(r'^asset_del/$', asset_del),
url(r'^group_del/$', group_del), url(r"^asset_detail/$", asset_detail),
url(r'^host_del/(\w+)/$', host_del), url(r'^asset_edit/$', asset_edit),
url(r'^host_edit/$', view_splitter, {'su': host_edit, 'adm': host_edit_adm}), # url(r'^search/$', host_search),
url(r'^host_edit/batch/$', host_edit_batch), # url(r"^host_detail/$", host_detail),
url(r'^host_edit_common/batch/$', host_edit_common_batch), # url(r"^dept_host_ajax/$", dept_host_ajax),
# url(r"^show_all_ajax/$", show_all_ajax),
# url(r'^group_edit/$', group_edit),
# url(r'^group_list/$', group_list),
# url(r'^group_detail/$', group_detail),
# url(r'^group_del_host/$', group_del_host),
# url(r'^group_del/$', group_del),
# url(r'^host_edit/batch/$', host_edit_batch),
# url(r'^host_edit_common/batch/$', host_edit_common_batch),
) )
\ No newline at end of file
...@@ -7,917 +7,512 @@ from django.template import RequestContext ...@@ -7,917 +7,512 @@ from django.template import RequestContext
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from jperm.models import Perm from jperm.models import Perm
from jasset.asset_api import *
from jumpserver.api import * from jumpserver.api import *
@require_role('admin')
def group_add(request):
"""
def get_host_groups(groups): Add asset group
""" 获取主机所属的组类 """ 添加资产组
ret = [] """
for group_id in groups: header_title, path1, path2 = u'添加资产组', u'资产管理', u'添加资产组'
group = BisGroup.objects.filter(id=group_id) asset_all = Asset.objects.all()
if group:
group = group[0]
ret.append(group)
group_all = get_object_or_404(BisGroup, name='ALL')
ret.append(group_all)
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(host_info, username='', password=''):
""" 添加主机时数据库操作函数 """
ip, port, idc, jtype, group, dept, active, comment = host_info
idc = IDC.objects.filter(id=idc)
if idc:
idc = idc[0]
if jtype == 'M':
password = cryptor.encrypt(password)
a = Asset(ip=ip, port=port,
login_type=jtype, idc=idc,
is_active=int(active),
comment=comment,
username=username,
password=password)
else:
a = Asset(ip=ip, port=port,
login_type=jtype, idc=idc,
is_active=int(active),
comment=comment)
a.save()
all_group = BisGroup.objects.get(name='ALL')
groups = get_host_groups(group)
groups.append(all_group)
depts = get_host_depts(dept)
a.bis_group = groups
a.dept = depts
a.save()
def db_host_update(host_info, username='', password=''):
""" 修改主机时数据库操作函数 """
ip, port, idc, jtype, group, dept, active, comment, host = host_info
idc = IDC.objects.filter(id=idc)
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':
if password != host.password:
password = cryptor.encrypt(password)
host.password = password
host.username = username
host.password = password
host.save()
host.bis_group = groups
host.dept = depts
host.save()
def batch_host_edit(host_info, j_user='', j_password=''):
""" 批量修改主机函数 """
j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment = host_info
groups, depts = [], []
is_active = {u'是': '1', u'否': '2'}
login_types = {'LDAP': 'L', 'MAP': 'M'}
a = Asset.objects.get(id=j_id)
if '...' in j_group[0].split():
groups = a.bis_group.all()
else:
for group in j_group[0].split():
c = BisGroup.objects.get(name=group.strip())
groups.append(c)
if '...' in j_dept[0].split():
depts = a.dept.all()
else:
for d in j_dept[0].split():
p = DEPT.objects.get(name=d.strip())
depts.append(p)
j_type = login_types[j_type]
j_idc = IDC.objects.get(name=j_idc)
if j_type == 'M':
if a.password != j_password:
j_password = cryptor.decrypt(j_password)
a.ip = j_ip
a.port = j_port
a.login_type = j_type
a.idc = j_idc
a.is_active = j_active
a.comment = j_comment
a.username = j_user
a.password = j_password
else:
a.ip = j_ip
a.port = j_port
a.idc = j_idc
a.login_type = j_type
a.is_active = is_active[j_active]
a.comment = j_comment
a.save()
a.bis_group = groups
a.dept = depts
a.save()
def db_host_delete(request, host_id):
""" 删除主机操作 """
if is_group_admin(request) and not validate(request, asset=[host_id]):
return httperror(request, '删除失败, 您无权删除!')
asset = Asset.objects.filter(id=host_id)
if asset:
asset.delete()
else:
return httperror(request, '删除失败, 没有此主机!')
def db_idc_delete(request, idc_id):
""" 删除IDC操作 """
if idc_id == 1:
return httperror(request, '删除失败, 默认IDC不能删除!')
default_idc = IDC.objects.get(id=1)
idc = IDC.objects.filter(id=idc_id)
if idc:
idc_class = idc[0]
idc_class.asset_set.update(idc=default_idc)
idc.delete()
else:
return httperror(request, '删除失败, 没有这个IDC!')
@require_admin
def host_add(request):
""" 添加主机 """
header_title, path1, path2 = u'添加主机', u'资产管理', u'添加主机'
login_types = {'L': 'LDAP', 'M': 'MAP'}
eidc = IDC.objects.exclude(name='ALL')
if is_super_user(request):
edept = DEPT.objects.all()
egroup = BisGroup.objects.exclude(name='ALL')
elif is_group_admin(request):
dept = get_session_user_info(request)[5]
egroup = dept.bisgroup_set.all()
if request.method == 'POST': if request.method == 'POST':
j_ip = request.POST.get('j_ip') name = request.POST.get('name', '')
j_idc = request.POST.get('j_idc') asset_select = request.POST.getlist('asset_select', [])
j_port = request.POST.get('j_port') comment = request.POST.get('comment', '')
j_type = request.POST.get('j_type')
j_group = request.POST.getlist('j_group')
j_active = request.POST.get('j_active')
j_comment = request.POST.get('j_comment')
if is_super_user(request):
j_dept = request.POST.getlist('j_dept')
host_info = [j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment]
elif is_group_admin(request):
j_dept = request.POST.get('j_dept')
host_info = [j_ip, j_port, j_idc, j_type, j_group, [j_dept], j_active, j_comment]
if is_group_admin(request) and not validate(request, asset_group=j_group, edept=[j_dept]):
return httperror(request, u'添加失败,您无权操作!')
if Asset.objects.filter(ip=str(j_ip)):
emg = u'该IP %s 已存在!' % j_ip
return my_render('jasset/host_add.html', locals(), request)
if j_type == 'M':
j_user = request.POST.get('j_user')
j_password = request.POST.get('j_password', '')
db_host_insert(host_info, j_user, j_password)
else:
db_host_insert(host_info)
smg = u'主机 %s 添加成功' % j_ip
return my_render('jasset/host_add.html', locals(), request)
try:
if not name:
error = u'组名不能为空'
raise ServerError(error)
@require_admin asset_group_test = get_object(AssetGroup, name=name)
def host_add_batch(request): if asset_group_test:
""" 批量添加主机 """ error = u"该组名 %s 已存在" % name
header_title, path1, path2 = u'批量添加主机', u'资产管理', u'批量添加主机' raise ServerError(error)
login_types = {'LDAP': 'L', 'MAP': 'M'}
active_types = {'激活': 1, '禁用': 0}
dept_id = get_user_dept(request)
if request.method == 'POST':
multi_hosts = request.POST.get('j_multi').split('\n')
for host in multi_hosts:
if host == '':
break
j_ip, j_port, j_type, j_idc, j_groups, j_depts, j_active, j_comment = host.split()
j_active = active_types[str(j_active)]
j_group = ast.literal_eval(j_groups)
j_dept = ast.literal_eval(j_depts)
if j_type not in ['LDAP', 'MAP']:
return httperror(request, u'没有%s这种登录方式!' %j_type)
j_type = login_types[j_type]
idc = IDC.objects.filter(name=j_idc)
if idc:
j_idc = idc[0].id
else:
return httperror(request, '添加失败, 没有%s这个IDC' % j_idc)
group_ids, dept_ids = [], []
for group_name in j_group:
group = BisGroup.objects.filter(name=group_name)
if group:
group_id = group[0].id
else:
return httperror(request, '添加失败, 没有%s这个主机组' % group_name)
group_ids.append(group_id)
for dept_name in j_dept: except ServerError:
dept = DEPT.objects.filter(name=dept_name) pass
if dept: else:
dept_id = dept[0].id db_add_group(name=name, comment=comment, asset_select=asset_select)
else: msg = u"主机组 %s 添加成功" % name
return httperror(request, '添加失败, 没有%s这个部门' % dept_name)
dept_ids.append(dept_id)
if is_group_admin(request) and not validate(request, asset_group=group_ids, edept=dept_ids): return my_render('jasset/group_add.html', locals(), request)
return httperror(request, '添加失败, 没有%s这个主机组' % group_name)
if Asset.objects.filter(ip=str(j_ip)):
return httperror(request, '添加失败, 改IP%s已存在' % j_ip)
host_info = [j_ip, j_port, j_idc, j_type, group_ids, dept_ids, j_active, j_comment] @require_role('admin')
db_host_insert(host_info) def group_list(request):
"""
list asset group
列出资产组
"""
header_title, path1, path2 = u'查看资产组', u'资产管理', u'查看资产组'
keyword = request.GET.get('keyword', '')
gid = request.GET.get('gid')
sid = request.GET.get('sid')
asset_group_list = AssetGroup.objects.all()
smg = u'批量添加添加成功' if keyword:
return my_render('jasset/host_add_multi.html', locals(), request) asset_groups = asset_group_list.filter(Q(name__contains=keyword) | Q(comment__contains=keyword))
return my_render('jasset/host_add_multi.html', locals(), request) asset_group_list, p, asset_groups, page_range, current_page, show_first, show_end = pages(asset_group_list, request)
return my_render('jasset/group_list.html', locals(), request)
@require_admin @require_role('admin')
def host_edit_batch(request): def asset_add(request):
""" 批量修改主机 """ """
Asset add view
添加资产
"""
header_title, path1, path2 = u'添加资产', u'资产管理', u'添加资产'
if request.method == 'POST': if request.method == 'POST':
len_table = request.POST.get('len_table') ip = request.POST.get('ip')
for i in range(int(len_table)): port = request.POST.get('port')
j_id = "editable[" + str(i) + "][j_id]" group = request.POST.getlist('group')
j_ip = "editable[" + str(i) + "][j_ip]" use_default_auth = True if request.POST.getlist('use_default_auth', []) else False
j_port = "editable[" + str(i) + "][j_port]" is_active = True if request.POST.get('is_active') else False
j_dept = "editable[" + str(i) + "][j_dept]" comment = request.POST.get('comment')
j_idc = "editable[" + str(i) + "][j_idc]"
j_type = "editable[" + str(i) + "][j_type]" if not use_default_auth:
j_group = "editable[" + str(i) + "][j_group]" username = request.POST.get('username')
j_active = "editable[" + str(i) + "][j_active]" password = request.POST.get('password')
j_comment = "editable[" + str(i) + "][j_comment]" password_encode = CRYPTOR.encrypt(password)
else:
j_id = request.POST.get(j_id).strip() username = None
j_ip = request.POST.get(j_ip).strip() password_encode = None
j_port = request.POST.get(j_port).strip()
j_dept = request.POST.getlist(j_dept)
j_idc = request.POST.get(j_idc).strip()
j_type = request.POST.get(j_type).strip()
j_group = request.POST.getlist(j_group)
j_active = request.POST.get(j_active).strip()
j_comment = request.POST.get(j_comment).strip()
host_info = [j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment]
batch_host_edit(host_info)
return HttpResponseRedirect('/jasset/host_list/')
@require_login
def host_edit_common_batch(request):
""" 普通用户批量修改主机别名 """
u = get_session_user_info(request)[2]
if request.method == 'POST':
len_table = request.POST.get('len_table')
for i in range(int(len_table)):
j_id = "editable[" + str(i) + "][j_id]"
j_alias = "editable[" + str(i) + "][j_alias]"
j_id = request.POST.get(j_id, '').strip()
j_alias = request.POST.get(j_alias, '').strip()
a = Asset.objects.get(id=j_id)
asset_alias = AssetAlias.objects.filter(user=u, host=a)
if asset_alias:
asset_alias = asset_alias[0]
asset_alias.alias = j_alias
asset_alias.save()
else:
AssetAlias.objects.create(user=u, host=a, alias=j_alias)
return my_render('jasset/host_list_common.html', locals(), request)
try:
if Asset.objects.filter(ip=str(ip)):
error = u'该IP %s 已存在!' % ip
raise ServerError(error)
@require_login except ServerError:
def host_list(request): pass
""" 列出主机 """ else:
db_asset_add(
ip=ip, port=port, use_default_auth=use_default_auth, is_active=is_active, comment=comment,
username=username, password=password_encode
)
msg = u'主机 %s 添加成功' % ip
return my_render('jasset/asset_add.html', locals(), request)
#
#
# @require_admin
# def host_add_batch(request):
# """ 批量添加主机 """
# header_title, path1, path2 = u'批量添加主机', u'资产管理', u'批量添加主机'
# login_types = {'LDAP': 'L', 'MAP': 'M'}
# active_types = {'激活': 1, '禁用': 0}
# dept_id = get_user_dept(request)
# if request.method == 'POST':
# multi_hosts = request.POST.get('j_multi').split('\n')
# for host in multi_hosts:
# if host == '':
# break
# j_ip, j_port, j_type, j_idc, j_groups, j_depts, j_active, j_comment = host.split()
# j_active = active_types[str(j_active)]
# j_group = ast.literal_eval(j_groups)
# j_dept = ast.literal_eval(j_depts)
#
# if j_type not in ['LDAP', 'MAP']:
# return httperror(request, u'没有%s这种登录方式!' %j_type)
#
# j_type = login_types[j_type]
# idc = IDC.objects.filter(name=j_idc)
# if idc:
# j_idc = idc[0].id
# else:
# return httperror(request, '添加失败, 没有%s这个IDC' % j_idc)
#
# group_ids, dept_ids = [], []
# for group_name in j_group:
# group = BisGroup.objects.filter(name=group_name)
# if group:
# group_id = group[0].id
# else:
# return httperror(request, '添加失败, 没有%s这个主机组' % group_name)
# 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
# else:
# return httperror(request, '添加失败, 没有%s这个部门' % dept_name)
# dept_ids.append(dept_id)
#
# if is_group_admin(request) and not validate(request, asset_group=group_ids, edept=dept_ids):
# return httperror(request, '添加失败, 没有%s这个主机组' % group_name)
#
# if Asset.objects.filter(ip=str(j_ip)):
# return httperror(request, '添加失败, 改IP%s已存在' % j_ip)
#
# host_info = [j_ip, j_port, j_idc, j_type, group_ids, dept_ids, j_active, j_comment]
# db_host_insert(host_info)
#
# smg = u'批量添加添加成功'
# return my_render('jasset/host_add_multi.html', locals(), request)
#
# return my_render('jasset/host_add_multi.html', locals(), request)
#
#
# @require_admin
# def host_edit_batch(request):
# """ 批量修改主机 """
# if request.method == 'POST':
# len_table = request.POST.get('len_table')
# for i in range(int(len_table)):
# j_id = "editable[" + str(i) + "][j_id]"
# j_ip = "editable[" + str(i) + "][j_ip]"
# j_port = "editable[" + str(i) + "][j_port]"
# j_dept = "editable[" + str(i) + "][j_dept]"
# j_idc = "editable[" + str(i) + "][j_idc]"
# j_type = "editable[" + str(i) + "][j_type]"
# j_group = "editable[" + str(i) + "][j_group]"
# j_active = "editable[" + str(i) + "][j_active]"
# j_comment = "editable[" + str(i) + "][j_comment]"
#
# j_id = request.POST.get(j_id).strip()
# j_ip = request.POST.get(j_ip).strip()
# j_port = request.POST.get(j_port).strip()
# j_dept = request.POST.getlist(j_dept)
# j_idc = request.POST.get(j_idc).strip()
# j_type = request.POST.get(j_type).strip()
# j_group = request.POST.getlist(j_group)
# j_active = request.POST.get(j_active).strip()
# j_comment = request.POST.get(j_comment).strip()
#
# host_info = [j_id, j_ip, j_idc, j_port, j_type, j_group, j_dept, j_active, j_comment]
# batch_host_edit(host_info)
#
# return HttpResponseRedirect('/jasset/host_list/')
#
#
# @require_role(role='user')
# def host_edit_common_batch(request):
# """ 普通用户批量修改主机别名 """
# u = get_session_user_info(request)[2]
# if request.method == 'POST':
# len_table = request.POST.get('len_table')
# for i in range(int(len_table)):
# j_id = "editable[" + str(i) + "][j_id]"
# j_alias = "editable[" + str(i) + "][j_alias]"
# j_id = request.POST.get(j_id, '').strip()
# j_alias = request.POST.get(j_alias, '').strip()
# a = Asset.objects.get(id=j_id)
# asset_alias = AssetAlias.objects.filter(user=u, host=a)
# if asset_alias:
# asset_alias = asset_alias[0]
# asset_alias.alias = j_alias
# asset_alias.save()
# else:
# AssetAlias.objects.create(user=u, host=a, alias=j_alias)
# return my_render('jasset/host_list_common.html', locals(), request)
@require_role(role='user')
def asset_list(request):
"""
list assets
列出资产表
"""
header_title, path1, path2 = u'查看主机', u'资产管理', u'查看主机' header_title, path1, path2 = u'查看主机', u'资产管理', u'查看主机'
keyword = request.GET.get('keyword', '') keyword = request.GET.get('keyword', '')
dept_id = get_session_user_info(request)[3] gid = request.GET.get('gid', '') # asset group id
dept = DEPT.objects.get(id=dept_id)
did = request.GET.get('did', '')
gid = request.GET.get('gid', '')
sid = request.GET.get('sid', '') sid = request.GET.get('sid', '')
user_id = get_session_user_info(request)[0] assets_list = Asset.objects.all().order_by('ip')
post_all = Asset.objects.all().order_by('ip')
post_keyword_all = Asset.objects.filter(Q(ip__contains=keyword) |
Q(idc__name__contains=keyword) |
Q(bis_group__name__contains=keyword) |
Q(comment__contains=keyword)).distinct().order_by('ip')
if did:
if is_common_user(request):
return httperror(request, u'您无权查看!')
if is_group_admin(request):
user, dept = get_session_user_dept(request)
else:
dept = DEPT.objects.get(id=did)
posts = dept.asset_set.all()
return my_render('jasset/host_list_nop.html', locals(), request)
elif gid:
if is_common_user(request):
return httperror(request, u'您无权查看!')
elif is_group_admin(request) and not validate(request, user_group=[gid]):
return httperror(request, u'您无权查看!')
posts = []
user_group = UserGroup.objects.filter(id=gid)
if user_group:
perms = Perm.objects.filter(user_group=user_group)
for perm in perms:
for post in perm.asset_group.asset_set.all():
posts.append(post)
posts = list(set(posts))
else:
return httperror(request, u'没有这个小组!')
return my_render('jasset/host_list_nop.html', locals(), request)
elif sid:
if is_common_user(request):
return httperror(request, u'您无权查看!')
elif is_group_admin(request) and not validate(request, user_group=[sid]):
return httperror(request, u'您无权查看!')
posts, asset_groups = [], []
user_group = UserGroup.objects.filter(id=int(sid))
if user_group:
user_group = user_group[0]
for perm in user_group.sudoperm_set.all():
asset_groups.extend(perm.asset_group.all())
for asset_group in asset_groups:
posts.extend(asset_group.asset_set.all())
posts = list(set(posts))
else:
return httperror(request, u'没有这个sudo授权!')
return my_render('jasset/host_list_nop.html', locals(), request)
else:
if is_super_user(request):
if keyword:
posts = post_keyword_all
else:
posts = post_all
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return my_render('jasset/host_list.html', locals(), request)
elif is_group_admin(request):
if keyword:
posts = post_keyword_all.filter(dept=dept)
else:
posts = post_all.filter(dept=dept)
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) if keyword:
return my_render('jasset/host_list.html', locals(), request) assets_list = assets_list.filter(Q(ip__contains=keyword) |
Q(comment__contains=keyword)).distinct().order_by('ip')
elif is_common_user(request):
user_id, username = get_session_user_info(request)[0:2]
posts = user_perm_asset_api(username)
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return my_render('jasset/host_list_common.html', locals(), request)
assets_list, p, assets, page_range, current_page, show_first, show_end = pages(assets_list, request)
return my_render('jasset/asset_list.html', locals(), request)
@require_admin
def host_del(request, offset):
""" 删除主机 """
if offset == 'multi':
len_list = request.POST.get("len_list")
for i in range(int(len_list)):
key = "id_list[" + str(i) + "]"
host_id = request.POST.get(key)
db_host_delete(request, host_id)
else:
db_host_delete(request, offset)
return HttpResponseRedirect('/jasset/host_list/') @require_role('admin')
def asset_del(request):
"""
del a asset
删除主机
"""
asset_id = request.GET.get('id', '')
if asset_id:
Asset.objects.filter(id=asset_id).delete()
return HttpResponse(u'删除成功')
return Http404
@require_super_user @require_role(role='super')
def host_edit(request): def asset_edit(request):
""" 修改主机 """ """ 修改主机 """
header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机' header_title, path1, path2 = u'修改资产', u'资产管理', u'修改资产'
actives = {1: u'激活', 0: u'禁用'}
login_types = {'L': 'LDAP', 'M': 'MAP'}
eidc = IDC.objects.all()
egroup = BisGroup.objects.exclude(name='ALL')
edept = DEPT.objects.all()
host_id = request.GET.get('id', '')
post = Asset.objects.filter(id=int(host_id))
if post:
post = post[0]
else:
return httperror(request, '没有此主机!')
e_group = post.bis_group.all()
e_dept = post.dept.all()
if request.method == 'POST':
j_ip = request.POST.get('j_ip', '')
j_idc = request.POST.get('j_idc', '')
j_port = request.POST.get('j_port', '')
j_type = request.POST.get('j_type', '')
j_dept = request.POST.getlist('j_dept', '')
j_group = request.POST.getlist('j_group', '')
j_active = request.POST.get('j_active', '')
j_comment = request.POST.get('j_comment', '')
host_info = [j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment, post]
if j_type == 'M':
j_user = request.POST.get('j_user')
j_password = request.POST.get('j_password')
db_host_update(host_info, j_user, j_password)
else:
db_host_update(host_info)
smg = u'主机 %s 修改成功' % j_ip
return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id)
return my_render('jasset/host_edit.html', locals(), 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': asset_id = request.GET.get('id', '')
j_ip = request.POST.get('j_ip') if not asset_id:
j_idc = request.POST.get('j_idc') return HttpResponse('没有该主机')
j_port = request.POST.get('j_port') asset = get_object(Asset, id=asset_id)
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')
host_info = [j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment]
if not validate(request, asset_group=j_group, edept=j_dept):
emg = u'修改失败,您无权操作!'
return my_render('jasset/host_edit.html', locals(), request)
if j_type == 'M':
j_user = request.POST.get('j_user')
j_password = request.POST.get('j_password')
db_host_update(host_info, j_user, j_password, post)
else:
db_host_update(host_info, post)
smg = u'主机 %s 修改成功' % j_ip
return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id)
return my_render('jasset/host_edit.html', locals(), request)
@require_login
def host_detail(request):
""" 主机详情 """
header_title, path1, path2 = u'主机详细信息', u'资产管理', u'主机详情'
host_id = request.GET.get('id', '')
post = Asset.objects.filter(id=host_id)
if not post:
return httperror(request, '没有此主机!')
post = post[0]
if is_group_admin(request) and not validate(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 my_render('jasset/host_detail.html', locals(), request)
@require_super_user
def idc_add(request):
""" 添加IDC """
header_title, path1, path2 = u'添加IDC', u'资产管理', u'添加IDC'
if request.method == 'POST': if request.method == 'POST':
j_idc = request.POST.get('j_idc') ip = request.POST.get('ip')
j_comment = request.POST.get('j_comment') port = request.POST.get('port')
if IDC.objects.filter(name=j_idc): groups = request.POST.getlist('groups')
emg = u'该IDC已存在!' use_default_auth = True if request.POST.getlist('use_default_auth', []) else False
return my_render('jasset/idc_add.html', locals(), request) is_active = True if request.POST.get('is_active') else False
else: comment = request.POST.get('comment')
smg = u'IDC:%s添加成功' % j_idc
IDC.objects.create(name=j_idc, comment=j_comment) if not use_default_auth:
username = request.POST.get('username')
return my_render('jasset/idc_add.html', locals(), request) password = request.POST.get('password')
if password == asset.password:
password_encode = password
@require_admin else:
def idc_list(request): password_encode = CRYPTOR.encrypt(password)
""" 列出IDC """
header_title, path1, path2 = u'查看IDC', u'资产管理', u'查看IDC'
dept_id = get_user_dept(request)
dept = DEPT.objects.get(id=dept_id)
keyword = request.GET.get('keyword', '')
if keyword:
posts = IDC.objects.filter(Q(name__contains=keyword) | Q(comment__contains=keyword))
else:
posts = IDC.objects.exclude(name='ALL').order_by('id')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return my_render('jasset/idc_list.html', locals(), request)
@require_super_user
def idc_edit(request):
""" 修改IDC """
header_title, path1, path2 = u'编辑IDC', u'资产管理', u'编辑IDC'
idc_id = request.GET.get('id', '')
idc = IDC.objects.filter(id=idc_id)
if int(idc_id) == 1:
return httperror(request, u'默认IDC不能编辑!')
if idc:
idc = idc[0]
default = IDC.objects.get(id=1).asset_set.all()
eposts = Asset.objects.filter(idc=idc).order_by('ip')
posts = [g for g in default if g not in eposts]
else:
return httperror(request, u'此IDC不存在')
if request.method == 'POST':
idc_id = request.POST.get('id')
j_idc = request.POST.get('j_idc')
j_hosts = request.POST.getlist('j_hosts')
j_comment = request.POST.get('j_comment')
idc_default = request.POST.getlist('idc_default')
idc = IDC.objects.filter(id=idc_id)
if 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])
i = IDC.objects.get(id=1)
for host in idc_default:
g = Asset.objects.filter(id=host).update(idc=i)
else: else:
return httperror(request, u'此IDC不存在') username = None
password_encode = None
return HttpResponseRedirect('/jasset/idc_list/?id=%s' % idc_id)
return my_render('jasset/idc_edit.html', locals(), request)
@require_admin
def idc_detail(request):
""" IDC详情 """
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 = get_session_user_info(request)[5]
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 my_render('jasset/idc_detail.html', locals(), request)
@require_super_user
def idc_del(request):
""" 删除IDC """
offset = request.GET.get('id', '')
if offset == 'multi':
len_list = request.POST.get("len_list")
for i in range(int(len_list)):
key = "id_list[" + str(i) + "]"
idc_id = request.POST.get(key)
db_idc_delete(request, int(idc_id))
else:
db_idc_delete(request, int(offset))
return HttpResponseRedirect('/jasset/idc_list/')
@require_admin
def group_add(request):
""" 添加主机组 """
header_title, path1, path2 = u'添加主机组', u'资产管理', u'添加主机组'
if is_super_user(request):
posts = Asset.objects.all()
edept = DEPT.objects.all()
elif is_group_admin(request):
dept_id = get_user_dept(request)
dept = DEPT.objects.get(id=dept_id)
posts = Asset.objects.filter(dept=dept)
edept = get_session_user_info(request)[5]
if request.method == 'POST':
j_group = request.POST.get('j_group', '')
j_dept = request.POST.get('j_dept', '')
j_hosts = request.POST.getlist('j_hosts', '')
j_comment = request.POST.get('j_comment', '')
try: try:
if is_group_admin(request) and not validate(request, asset=j_hosts, edept=[j_dept]): asset_test = get_object(Asset, ip=ip)
emg = u'添加失败, 您无权操作!' if asset_test and asset_id != str(asset_test.id):
raise RaiseError error = u'该IP %s 已存在!' % ip
raise ServerError(error)
elif BisGroup.objects.filter(name=j_group): except ServerError:
emg = u'添加失败, 该主机组已存在!'
raise RaiseError
except RaiseError:
pass pass
else: else:
j_dept = DEPT.objects.filter(id=j_dept)[0] db_asset_update(id=asset_id, ip=ip, port=port, use_default_auth=use_default_auth,
group = BisGroup.objects.create(name=j_group, dept=j_dept, comment=j_comment) username=username, password=password_encode,
for host in j_hosts: is_active=is_active, comment=comment)
g = Asset.objects.get(id=host) msg = u'主机 %s 修改成功' % ip
group.asset_set.add(g) return HttpResponseRedirect('/jasset/asset_detail/?id=%s' % asset_id)
smg = u'主机组 %s 添加成功' % j_group
return my_render('jasset/asset_edit.html', locals(), request)
return my_render('jasset/group_add.html', locals(), request)
# @require_role(role='admin')
@require_admin # def host_edit_adm(request):
def group_list(request): # """ 部门管理员修改主机 """
""" 列出主机组 """ # header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
header_title, path1, path2 = u'查看主机组', u'资产管理', u'查看主机组' # actives = {1: u'激活', 0: u'禁用'}
dept_id = get_user_dept(request) # login_types = {'L': 'LDAP', 'M': 'MAP'}
dept = DEPT.objects.get(id=dept_id) # eidc = IDC.objects.all()
keyword = request.GET.get('keyword', '') # dept = get_session_user_info(request)[5]
gid = request.GET.get('gid') # egroup = BisGroup.objects.exclude(name='ALL').filter(dept=dept)
sid = request.GET.get('sid') # host_id = request.GET.get('id', '')
if gid: # post = Asset.objects.filter(id=int(host_id))
if is_common_user(request): # if post:
return httperror(request, u'您无权查看!') # post = post[0]
# else:
elif is_group_admin(request) and not validate(request, user_group=[gid]): # return httperror(request, '没有此主机!')
return httperror(request, u'您无权查看!') #
# e_group = post.bis_group.all()
posts = [] #
user_group = UserGroup.objects.filter(id=gid) # if request.method == 'POST':
if user_group: # j_ip = request.POST.get('j_ip')
user_group = user_group[0] # j_idc = request.POST.get('j_idc')
perms = Perm.objects.filter(user_group=user_group) # j_port = request.POST.get('j_port')
for perm in perms: # j_type = request.POST.get('j_type')
posts.append(perm.asset_group) # j_dept = request.POST.getlist('j_dept')
# j_group = request.POST.getlist('j_group')
elif sid: # j_active = request.POST.get('j_active')
if is_common_user(request): # j_comment = request.POST.get('j_comment')
return httperror(request, u'您无权查看!') #
# host_info = [j_ip, j_port, j_idc, j_type, j_group, j_dept, j_active, j_comment]
elif is_group_admin(request) and not validate(request, user_group=[sid]): #
return httperror(request, u'您无权查看!') # if not validate(request, asset_group=j_group, edept=j_dept):
# emg = u'修改失败,您无权操作!'
posts = [] # return my_render('jasset/asset_edit.html', locals(), request)
user_group = UserGroup.objects.filter(id=sid) #
if user_group: # if j_type == 'M':
user_group = user_group[0] # j_user = request.POST.get('j_user')
for perm in user_group.sudoperm_set.all(): # j_password = request.POST.get('j_password')
posts.extend(perm.asset_group.all()) # db_host_update(host_info, j_user, j_password, post)
posts = list(set(posts)) # else:
else: # db_host_update(host_info, post)
return httperror(request, u'没有此sudo授权!') #
# smg = u'主机 %s 修改成功' % j_ip
else: # return HttpResponseRedirect('/jasset/host_detail/?id=%s' % host_id)
if is_super_user(request): #
if keyword: # return my_render('jasset/asset_edit.html', locals(), request)
posts = BisGroup.objects.exclude(name='ALL').filter(
Q(name__contains=keyword) | Q(comment__contains=keyword))
else: @require_role('admin')
posts = BisGroup.objects.exclude(name='ALL').order_by('id') def asset_detail(request):
elif is_group_admin(request): """ 主机详情 """
if keyword: header_title, path1, path2 = u'主机详细信息', u'资产管理', u'主机详情'
posts = BisGroup.objects.filter(Q(name__contains=keyword) | Q(comment__contains=keyword)).filter( asset_id = request.GET.get('id', '')
dept=dept) asset = get_object(Asset, id=asset_id)
else:
posts = BisGroup.objects.filter(dept=dept).order_by('id') return my_render('jasset/asset_detail.html', locals(), request)
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
return my_render('jasset/group_list.html', locals(), request)
@require_admin #
def group_edit(request): #
""" 修改主机组 """ # @require_admin
header_title, path1, path2 = u'编辑主机组', u'资产管理', u'编辑主机组' # def group_edit(request):
group_id = request.GET.get('id', '') # """ 修改主机组 """
group = BisGroup.objects.filter(id=group_id) # header_title, path1, path2 = u'编辑主机组', u'资产管理', u'编辑主机组'
if group: # group_id = request.GET.get('id', '')
group = group[0] # group = BisGroup.objects.filter(id=group_id)
else: # if group:
httperror(request, u'没有这个主机组!') # group = group[0]
# else:
host_all = Asset.objects.all() # httperror(request, u'没有这个主机组!')
dept_id = get_session_user_info(request)[3] #
eposts = Asset.objects.filter(bis_group=group) # host_all = Asset.objects.all()
# dept_id = get_session_user_info(request)[3]
if is_group_admin(request) and not validate(request, asset_group=[group_id]): # eposts = Asset.objects.filter(bis_group=group)
return httperror(request, '编辑失败, 您无权操作!') #
dept = DEPT.objects.filter(id=group.dept.id) # if is_group_admin(request) and not validate(request, asset_group=[group_id]):
if dept: # return httperror(request, '编辑失败, 您无权操作!')
dept = dept[0] # dept = DEPT.objects.filter(id=group.dept.id)
else: # if dept:
return httperror(request, u'没有这个部门!') # dept = dept[0]
# else:
all_dept = dept.asset_set.all() # return httperror(request, u'没有这个部门!')
posts = [g for g in all_dept if g not in eposts] #
# all_dept = dept.asset_set.all()
if request.method == 'POST': # posts = [g for g in all_dept if g not in eposts]
j_group = request.POST.get('j_group', '') #
j_hosts = request.POST.getlist('j_hosts', '') # if request.method == 'POST':
j_dept = request.POST.get('j_dept', '') # j_group = request.POST.get('j_group', '')
j_comment = request.POST.get('j_comment', '') # j_hosts = request.POST.getlist('j_hosts', '')
# j_dept = request.POST.get('j_dept', '')
j_dept = DEPT.objects.filter(id=int(j_dept)) # j_comment = request.POST.get('j_comment', '')
j_dept = j_dept[0] #
# j_dept = DEPT.objects.filter(id=int(j_dept))
group.asset_set.clear() # j_dept = j_dept[0]
for host in j_hosts: #
g = Asset.objects.get(id=host) # group.asset_set.clear()
group.asset_set.add(g) # for host in j_hosts:
BisGroup.objects.filter(id=group_id).update(name=j_group, dept=j_dept, comment=j_comment) # g = Asset.objects.get(id=host)
smg = u'主机组%s修改成功' % j_group # group.asset_set.add(g)
return HttpResponseRedirect('/jasset/group_list') # BisGroup.objects.filter(id=group_id).update(name=j_group, dept=j_dept, comment=j_comment)
# smg = u'主机组%s修改成功' % j_group
return my_render('jasset/group_edit.html', locals(), request) # return HttpResponseRedirect('/jasset/group_list')
#
# return my_render('jasset/group_edit.html', locals(), request)
@require_admin #
def group_detail(request): #
""" 主机组详情 """ # @require_admin
header_title, path1, path2 = u'主机组详情', u'资产管理', u'主机组详情' # def group_detail(request):
login_types = {'L': 'LDAP', 'M': 'MAP'} # """ 主机组详情 """
dept = get_session_user_info(request)[5] # header_title, path1, path2 = u'主机组详情', u'资产管理', u'主机组详情'
group_id = request.GET.get('id', '') # login_types = {'L': 'LDAP', 'M': 'MAP'}
group = BisGroup.objects.get(id=group_id) # dept = get_session_user_info(request)[5]
if is_super_user(request): # group_id = request.GET.get('id', '')
posts = Asset.objects.filter(bis_group=group).order_by('ip') # group = BisGroup.objects.get(id=group_id)
# if is_super_user(request):
elif is_group_admin(request): # posts = Asset.objects.filter(bis_group=group).order_by('ip')
if not validate(request, asset_group=[group_id]): #
return httperror(request, u'您无权查看!') # elif is_group_admin(request):
posts = Asset.objects.filter(bis_group=group).filter(dept=dept).order_by('ip') # if not validate(request, asset_group=[group_id]):
# return httperror(request, u'您无权查看!')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) # posts = Asset.objects.filter(bis_group=group).filter(dept=dept).order_by('ip')
return my_render('jasset/group_detail.html', locals(), request) #
# contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
# return my_render('jasset/group_detail.html', locals(), request)
@require_admin #
def group_del_host(request): #
""" 主机组中剔除主机, 并不删除真实主机 """ # @require_admin
if request.method == 'POST': # def group_del_host(request):
group_id = request.POST.get('group_id') # """ 主机组中剔除主机, 并不删除真实主机 """
offset = request.GET.get('id', '') # if request.method == 'POST':
group = BisGroup.objects.get(id=group_id) # group_id = request.POST.get('group_id')
if offset == 'group': # offset = request.GET.get('id', '')
len_list = request.POST.get("len_list") # group = BisGroup.objects.get(id=group_id)
for i in range(int(len_list)): # if offset == 'group':
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) + "]"
group.asset_set.remove(g) # jid = request.POST.get(key)
# g = Asset.objects.get(id=jid)
else: # group.asset_set.remove(g)
offset = request.GET.get('id', '') #
group_id = request.GET.get('gid', '') # else:
group = BisGroup.objects.get(id=group_id) # offset = request.GET.get('id', '')
g = Asset.objects.get(id=offset) # group_id = request.GET.get('gid', '')
group.asset_set.remove(g) # group = BisGroup.objects.get(id=group_id)
# g = Asset.objects.get(id=offset)
return HttpResponseRedirect('/jasset/group_detail/?id=%s' % group.id) # group.asset_set.remove(g)
#
# return HttpResponseRedirect('/jasset/group_detail/?id=%s' % group.id)
@require_admin #
def group_del(request): #
""" 删除主机组 """ # @require_admin
offset = request.GET.get('id', '') # def group_del(request):
if offset == 'multi': # """ 删除主机组 """
len_list = request.POST.get("len_list") # offset = request.GET.get('id', '')
for i in range(int(len_list)): # if offset == 'multi':
key = "id_list[" + str(i) + "]" # len_list = request.POST.get("len_list")
gid = request.POST.get(key) # for i in range(int(len_list)):
if is_group_admin(request) and not validate(request, asset_group=[gid]): # key = "id_list[" + str(i) + "]"
return httperror(request, '删除失败, 您无权删除!') # gid = request.POST.get(key)
BisGroup.objects.filter(id=gid).delete() # if is_group_admin(request) and not validate(request, asset_group=[gid]):
else: # return httperror(request, '删除失败, 您无权删除!')
gid = int(offset) # BisGroup.objects.filter(id=gid).delete()
if is_group_admin(request) and not validate(request, asset_group=[gid]): # else:
return httperror(request, '删除失败, 您无权删除!') # gid = int(offset)
BisGroup.objects.filter(id=gid).delete() # if is_group_admin(request) and not validate(request, asset_group=[gid]):
return HttpResponseRedirect('/jasset/group_list/') # return httperror(request, '删除失败, 您无权删除!')
# BisGroup.objects.filter(id=gid).delete()
# return HttpResponseRedirect('/jasset/group_list/')
@require_admin #
def dept_host_ajax(request): #
""" 添加主机组时, 部门联动主机异步 """ # @require_admin
dept_id = request.GET.get('id', '') # def dept_host_ajax(request):
if dept_id not in ['1', '2']: # """ 添加主机组时, 部门联动主机异步 """
dept = DEPT.objects.filter(id=dept_id) # dept_id = request.GET.get('id', '')
if dept: # if dept_id not in ['1', '2']:
dept = dept[0] # dept = DEPT.objects.filter(id=dept_id)
hosts = dept.asset_set.all() # if dept:
else: # dept = dept[0]
hosts = Asset.objects.all() # hosts = dept.asset_set.all()
# else:
return my_render('jasset/dept_host_ajax.html', locals(), request) # hosts = Asset.objects.all()
#
# return my_render('jasset/dept_host_ajax.html', locals(), request)
def show_all_ajax(request): #
""" 批量修改主机时, 部门和组全部显示 """ #
env = request.GET.get('env', '') # def show_all_ajax(request):
get_id = request.GET.get('id', '') # """ 批量修改主机时, 部门和组全部显示 """
host = Asset.objects.filter(id=get_id) # env = request.GET.get('env', '')
if host: # get_id = request.GET.get('id', '')
host = host[0] # host = Asset.objects.filter(id=get_id)
return my_render('jasset/show_all_ajax.html', locals(), request) # if host:
# host = host[0]
# return my_render('jasset/show_all_ajax.html', locals(), request)
@require_login #
def host_search(request): #
""" 搜索主机 """ # @require_login
keyword = request.GET.get('keyword') # def host_search(request):
login_types = {'L': 'LDAP', 'M': 'MAP'} # """ 搜索主机 """
dept = get_session_user_info(request)[5] # keyword = request.GET.get('keyword')
post_all = Asset.objects.filter(Q(ip__contains=keyword) | # login_types = {'L': 'LDAP', 'M': 'MAP'}
Q(idc__name__contains=keyword) | # dept = get_session_user_info(request)[5]
Q(bis_group__name__contains=keyword) | # post_all = Asset.objects.filter(Q(ip__contains=keyword) |
Q(comment__contains=keyword)).distinct().order_by('ip') # Q(idc__name__contains=keyword) |
if is_super_user(request): # Q(bis_group__name__contains=keyword) |
posts = post_all # Q(comment__contains=keyword)).distinct().order_by('ip')
# if is_super_user(request):
elif is_group_admin(request): # posts = post_all
posts = post_all.filter(dept=dept) #
# elif is_group_admin(request):
elif is_common_user(request): # posts = post_all.filter(dept=dept)
user_id, username = get_session_user_info(request)[0:2] #
post_perm = user_perm_asset_api(username) # elif is_common_user(request):
posts = list(set(post_all) & set(post_perm)) # user_id, username = get_session_user_info(request)[0:2]
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request) # post_perm = user_perm_asset_api(username)
# posts = list(set(post_all) & set(post_perm))
return my_render('jasset/host_search.html', locals(), request) # contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
\ No newline at end of file #
# return my_render('jasset/host_search.html', locals(), request)
\ No newline at end of file
...@@ -4,12 +4,12 @@ from uuidfield import UUIDField ...@@ -4,12 +4,12 @@ from uuidfield import UUIDField
from django.db import models from django.db import models
from juser.models import UserGroup from juser.models import UserGroup
from jasset.models import Asset, BisGroup from jasset.models import Asset, AssetGroup
class Perm(models.Model): class Perm(models.Model):
user_group = models.ForeignKey(UserGroup) user_group = models.ForeignKey(UserGroup)
asset_group = models.ForeignKey(BisGroup) asset_group = models.ForeignKey(AssetGroup)
def __unicode__(self): def __unicode__(self):
return '%s_%s' % (self.user_group.name, self.asset_group.name) return '%s_%s' % (self.user_group.name, self.asset_group.name)
...@@ -27,7 +27,7 @@ class CmdGroup(models.Model): ...@@ -27,7 +27,7 @@ class CmdGroup(models.Model):
class SudoPerm(models.Model): class SudoPerm(models.Model):
user_group = models.ForeignKey(UserGroup) user_group = models.ForeignKey(UserGroup)
user_runas = models.CharField(max_length=100) user_runas = models.CharField(max_length=100)
asset_group = models.ManyToManyField(BisGroup) asset_group = models.ManyToManyField(AssetGroup)
cmd_group = models.ManyToManyField(CmdGroup) cmd_group = models.ManyToManyField(CmdGroup)
comment = models.CharField(max_length=30, null=True, blank=True) comment = models.CharField(max_length=30, null=True, blank=True)
......
...@@ -17,7 +17,7 @@ from django.core.paginator import Paginator, EmptyPage, InvalidPage ...@@ -17,7 +17,7 @@ from django.core.paginator import Paginator, EmptyPage, InvalidPage
from django.http import HttpResponse, Http404 from django.http import HttpResponse, Http404
from django.template import RequestContext from django.template import RequestContext
from juser.models import User, UserGroup from juser.models import User, UserGroup
from jasset.models import Asset, BisGroup, IDC from jasset.models import Asset, AssetGroup
from jlog.models import Log from jlog.models import Log
from jasset.models import AssetAlias from jasset.models import AssetAlias
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
...@@ -177,6 +177,7 @@ def pages(post_objects, request): ...@@ -177,6 +177,7 @@ def pages(post_objects, request):
else: else:
show_end = 0 show_end = 0
# 所有对象, 分页器, 本页对象, 所有页码, 本页页码,是否显示第一页,是否显示最后一页
return post_objects, paginator, page_objects, page_range, current_page, show_first, show_end return post_objects, paginator, page_objects, page_range, current_page, show_first, show_end
...@@ -429,7 +430,7 @@ class PyCrypt(object): ...@@ -429,7 +430,7 @@ class PyCrypt(object):
""" """
return crypt.crypt(password, '$6$%s$' % salt) return crypt.crypt(password, '$6$%s$' % salt)
def encrypt(self, passwd=None): def encrypt(self, passwd=None, length=32):
""" """
encrypt gen password encrypt gen password
对称加密之加密生成密码 对称加密之加密生成密码
...@@ -438,7 +439,6 @@ class PyCrypt(object): ...@@ -438,7 +439,6 @@ class PyCrypt(object):
passwd = self.random_pass() passwd = self.random_pass()
cryptor = AES.new(self.key, self.mode, b'8122ca7d906ad5e1') cryptor = AES.new(self.key, self.mode, b'8122ca7d906ad5e1')
length = 64
try: try:
count = len(passwd) count = len(passwd)
except TypeError: except TypeError:
......
...@@ -56,8 +56,8 @@ INSTALLED_APPS = ( ...@@ -56,8 +56,8 @@ INSTALLED_APPS = (
'django.contrib.humanize', 'django.contrib.humanize',
'jumpserver', 'jumpserver',
'juser', 'juser',
# 'jasset', 'jasset',
# 'jperm', 'jperm',
# 'jlog', # 'jlog',
) )
......
...@@ -12,21 +12,28 @@ from jasset.models import AssetAlias ...@@ -12,21 +12,28 @@ from jasset.models import AssetAlias
register = template.Library() register = template.Library()
@register.filter(name='stamp2str') # @register.filter(name='stamp2str')
def stamp2str(value): # def stamp2str(value):
try: # try:
return time.strftime('%Y/%m/%d %H:%M:%S', time.localtime(value)) # return time.strftime('%Y/%m/%d %H:%M:%S', time.localtime(value))
except AttributeError: # except AttributeError:
return '0000/00/00 00:00:00' # return '0000/00/00 00:00:00'
@register.filter(name='int2str') @register.filter(name='int2str')
def int2str(value): def int2str(value):
"""
int 转换为 str
"""
return str(value) return str(value)
@register.filter(name='get_role') @register.filter(name='get_role')
def get_role(user_id): def get_role(user_id):
"""
根据用户id获取用户权限
"""
user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'} user_role = {'SU': u'超级管理员', 'GA': u'组管理员', 'CU': u'普通用户'}
user = get_object(User, id=user_id) user = get_object(User, id=user_id)
if user: if user:
...@@ -35,66 +42,69 @@ def get_role(user_id): ...@@ -35,66 +42,69 @@ def get_role(user_id):
return u"普通用户" return u"普通用户"
@register.filter(name='groups_str') # @register.filter(name='groups_str')
def groups_str(user_id): # def groups_str(user_id):
groups = [] # groups = []
user = User.objects.get(id=user_id) # user = User.objects.get(id=user_id)
for group in user.group.all(): # for group in user.group.all():
groups.append(group.name) # groups.append(group.name)
if len(groups) < 3: # if len(groups) < 3:
return ' '.join(groups) # return ' '.join(groups)
else: # else:
return "%s ..." % ' '.join(groups[0:2]) # return "%s ..." % ' '.join(groups[0:2])
#
@register.filter(name='group_str2') @register.filter(name='group_str2')
def groups_str2(group_list): def groups_str2(group_list):
"""
将用户组列表转换为str
"""
if len(group_list) < 3: if len(group_list) < 3:
return ' '.join([group.name for group in group_list]) return ' '.join([group.name for group in group_list])
else: else:
return '%s ...' % ' '.join([group.name for group in group_list[0:2]]) return '%s ...' % ' '.join([group.name for group in group_list[0:2]])
#
@register.filter(name='group_str2_all') # @register.filter(name='group_str2_all')
def group_str2_all(group_list): # def group_str2_all(group_list):
group_lis = [] # group_lis = []
for i in group_list: # for i in group_list:
if str(i) != 'ALL': # if str(i) != 'ALL':
group_lis.append(i) # group_lis.append(i)
if len(group_lis) < 3: # if len(group_lis) < 3:
return ' '.join([group.name for group in group_lis]) # return ' '.join([group.name for group in group_lis])
else: # else:
return '%s ...' % ' '.join([group.name for group in group_lis[0:2]]) # return '%s ...' % ' '.join([group.name for group in group_lis[0:2]])
#
#
@register.filter(name='group_dept_all') # @register.filter(name='group_dept_all')
def group_dept_all(group_list): # def group_dept_all(group_list):
group_lis = [] # group_lis = []
for i in group_list: # for i in group_list:
if str(i) != 'ALL': # if str(i) != 'ALL':
group_lis.append(i) # group_lis.append(i)
return ' '.join([group.name for group in group_lis]) # return ' '.join([group.name for group in group_lis])
#
#
@register.filter(name='group_manage_str') # @register.filter(name='group_manage_str')
def group_manage_str(username): # def group_manage_str(username):
user = User.objects.get(username=username) # user = User.objects.get(username=username)
group = user.user_group.filter(type='M') # group = user.user_group.filter(type='M')
if group: # if group:
return group[0].name # return group[0].name
else: # else:
return '' # return ''
#
#
@register.filter(name='get_item') # @register.filter(name='get_item')
def get_item(dictionary, key): # def get_item(dictionary, key):
return dictionary.get(key) # return dictionary.get(key)
#
#
@register.filter(name='get_login_type') # @register.filter(name='get_login_type')
def get_login_type(login): # def get_login_type(login):
login_types = {'L': 'LDAP', 'M': 'MAP'} # login_types = {'L': 'LDAP', 'M': 'MAP'}
return login_types[login] # return login_types[login]
@register.filter(name='bool2str') @register.filter(name='bool2str')
...@@ -105,169 +115,171 @@ def bool2str(value): ...@@ -105,169 +115,171 @@ def bool2str(value):
return u'否' return u'否'
# @register.filter(name='user_readonly') # # @register.filter(name='user_readonly')
# def user_readonly(user_id): # # def user_readonly(user_id):
# user = User.objects.filter(id=user_id) # # user = User.objects.filter(id=user_id)
# if user: # # if user:
# user = user[0] # # user = user[0]
# if user.role == 'CU': # # if user.role == 'CU':
# return False # # return False
# return True # # return True
#
@register.filter(name='members_count') @register.filter(name='members_count')
def members_count(group_id): def members_count(group_id):
"""统计用户组下成员数量"""
group = get_object(UserGroup, id=group_id) group = get_object(UserGroup, id=group_id)
if group: if group:
return group.user_set.count() return group.user_set.count()
else: else:
return 0 return 0
#
@register.filter(name='group_user_count') # @register.filter(name='group_user_count')
def group_user_count(group_id): # def group_user_count(group_id):
group = UserGroup.objects.get(id=group_id) # group = UserGroup.objects.get(id=group_id)
return group.user_set.count() # return group.user_set.count()
#
#
@register.filter(name='dept_user_num') # @register.filter(name='dept_user_num')
def dept_user_num(dept_id): # def dept_user_num(dept_id):
dept = DEPT.objects.filter(id=dept_id) # dept = DEPT.objects.filter(id=dept_id)
if dept: # if dept:
dept = dept[0] # dept = dept[0]
return dept.user_set.count() # return dept.user_set.count()
else: # else:
return 0 # return 0
#
#
@register.filter(name='dept_group_num') # @register.filter(name='dept_group_num')
def dept_group_num(dept_id): # def dept_group_num(dept_id):
dept = DEPT.objects.filter(id=dept_id) # dept = DEPT.objects.filter(id=dept_id)
if dept: # if dept:
dept = dept[0] # dept = dept[0]
return dept.usergroup_set.all().count() # return dept.usergroup_set.all().count()
else: # else:
return 0 # return 0
#
#
@register.filter(name='perm_count') # @register.filter(name='perm_count')
def perm_count(group_id): # def perm_count(group_id):
group = UserGroup.objects.get(id=group_id) # group = UserGroup.objects.get(id=group_id)
return group.perm_set.count() # return group.perm_set.count()
#
#
@register.filter(name='dept_asset_num') # @register.filter(name='dept_asset_num')
def dept_asset_num(dept_id): # def dept_asset_num(dept_id):
dept = DEPT.objects.filter(id=dept_id) # dept = DEPT.objects.filter(id=dept_id)
if dept: # if dept:
dept = dept[0] # dept = dept[0]
return dept.asset_set.all().count() # return dept.asset_set.all().count()
return 0 # return 0
#
#
@register.filter(name='ugrp_perm_agrp_count') # @register.filter(name='ugrp_perm_agrp_count')
def ugrp_perm_agrp_count(user_group_id): # def ugrp_perm_agrp_count(user_group_id):
user_group = UserGroup.objects.filter(id=user_group_id) # user_group = UserGroup.objects.filter(id=user_group_id)
if user_group: # if user_group:
user_group = user_group[0] # user_group = user_group[0]
return user_group.perm_set.all().count() # return user_group.perm_set.all().count()
return 0 # return 0
#
#
@register.filter(name='ugrp_sudo_agrp_count') # @register.filter(name='ugrp_sudo_agrp_count')
def ugrp_sudo_agrp_count(user_group_id): # def ugrp_sudo_agrp_count(user_group_id):
user_group = UserGroup.objects.filter(id=user_group_id) # user_group = UserGroup.objects.filter(id=user_group_id)
asset_groups = [] # asset_groups = []
if user_group: # if user_group:
user_group = user_group[0] # user_group = user_group[0]
for perm in user_group.sudoperm_set.all(): # for perm in user_group.sudoperm_set.all():
asset_groups.extend(perm.asset_group.all()) # asset_groups.extend(perm.asset_group.all())
return len(set(asset_groups)) # return len(set(asset_groups))
return 0 # return 0
#
#
@register.filter(name='ugrp_perm_asset_count') # @register.filter(name='ugrp_perm_asset_count')
def ugrp_perm_asset_count(user_group_id): # def ugrp_perm_asset_count(user_group_id):
user_group = UserGroup.objects.filter(id=user_group_id) # user_group = UserGroup.objects.filter(id=user_group_id)
assets = [] # assets = []
if user_group: # if user_group:
user_group = user_group[0] # user_group = user_group[0]
asset_groups = [perm.asset_group for perm in user_group.perm_set.all()] # asset_groups = [perm.asset_group for perm in user_group.perm_set.all()]
for asset_group in asset_groups: # for asset_group in asset_groups:
assets.extend(asset_group.asset_set.all()) # assets.extend(asset_group.asset_set.all())
return len(set(assets)) # return len(set(assets))
#
#
@register.filter(name='ugrp_sudo_asset_count') # @register.filter(name='ugrp_sudo_asset_count')
def ugrp_sudo_asset_count(user_group_id): # def ugrp_sudo_asset_count(user_group_id):
user_group = UserGroup.objects.filter(id=user_group_id) # user_group = UserGroup.objects.filter(id=user_group_id)
asset_groups = [] # asset_groups = []
assets = [] # assets = []
if user_group: # if user_group:
user_group = user_group[0] # user_group = user_group[0]
for perm in user_group.sudoperm_set.all(): # for perm in user_group.sudoperm_set.all():
asset_groups.extend(perm.asset_group.all()) # asset_groups.extend(perm.asset_group.all())
#
for asset_group in asset_groups: # for asset_group in asset_groups:
assets.extend(asset_group.asset_set.all()) # assets.extend(asset_group.asset_set.all())
return len(set(assets)) # return len(set(assets))
#
#
@register.filter(name='get_user_alias') # @register.filter(name='get_user_alias')
def get_user_alias(post, user_id): # def get_user_alias(post, user_id):
user = User.objects.get(id=user_id) # user = User.objects.get(id=user_id)
host = Asset.objects.get(id=post.id) # host = Asset.objects.get(id=post.id)
alias = AssetAlias.objects.filter(user=user, host=host) # alias = AssetAlias.objects.filter(user=user, host=host)
if alias: # if alias:
return alias[0].alias # return alias[0].alias
else: # else:
return '' # return ''
#
#
@register.filter(name='group_type_to_str') # @register.filter(name='group_type_to_str')
def group_type_to_str(type_name): # def group_type_to_str(type_name):
group_types = { # group_types = {
'P': '用户', # 'P': '用户',
'M': '部门', # 'M': '部门',
'A': '用户组', # 'A': '用户组',
} # }
return group_types.get(type_name) # return group_types.get(type_name)
#
#
@register.filter(name='ast_to_list') # @register.filter(name='ast_to_list')
def ast_to_list(lis): # def ast_to_list(lis):
ast_lis = ast.literal_eval(lis) # ast_lis = ast.literal_eval(lis)
if len(ast_lis) <= 2: # if len(ast_lis) <= 2:
return ','.join([i for i in ast_lis]) # return ','.join([i for i in ast_lis])
else: # else:
restr = ','.join([i for i in ast_lis[0:2]]) + '...' # restr = ','.join([i for i in ast_lis[0:2]]) + '...'
return restr # return restr
#
#
@register.filter(name='get_group_count') # @register.filter(name='get_group_count')
def get_group_count(post, dept): # def get_group_count(post, dept):
count = post.asset_set.filter(dept=dept).count() # count = post.asset_set.filter(dept=dept).count()
return count # return count
#
#
@register.filter(name='get_idc_count') # @register.filter(name='get_idc_count')
def get_idc_count(post, dept): # def get_idc_count(post, dept):
count = post.asset_set.filter(dept=dept).count() # count = post.asset_set.filter(dept=dept).count()
return count # return count
#
#
@register.filter(name='ast_to_list_1') # @register.filter(name='ast_to_list_1')
def ast_to_list_1(lis): # def ast_to_list_1(lis):
return ast.literal_eval(lis) # return ast.literal_eval(lis)
#
#
@register.filter(name='string_length') # @register.filter(name='string_length')
def string_length(string, length): # def string_length(string, length):
return '%s ...' % string[0:length] # return '%s ...' % string[0:length]
@register.filter(name='to_name') @register.filter(name='to_name')
def to_name(user_id): def to_name(user_id):
"""user id 转位用户名称"""
try: try:
user = User.objects.filter(id=int(user_id)) user = User.objects.filter(id=int(user_id))
if user: if user:
...@@ -277,120 +289,122 @@ def to_name(user_id): ...@@ -277,120 +289,122 @@ def to_name(user_id):
return '非法用户' return '非法用户'
@register.filter(name='to_dept_name') # @register.filter(name='to_dept_name')
def to_dept_name(user_id): # def to_dept_name(user_id):
try: # try:
user = User.objects.filter(id=int(user_id)) # user = User.objects.filter(id=int(user_id))
if user: # if user:
user = user[0] # user = user[0]
return user.dept.name # return user.dept.name
except: # except:
return '非法部门' # return '非法部门'
@register.filter(name='to_role_name') @register.filter(name='to_role_name')
def to_role_name(role_id): def to_role_name(role_id):
"""role_id 转变为角色名称"""
role_dict = {'0': '普通用户', '1': '组管理员', '2': '超级管理员'} role_dict = {'0': '普通用户', '1': '组管理员', '2': '超级管理员'}
return role_dict.get(str(role_id), '未知') return role_dict.get(str(role_id), '未知')
@register.filter(name='to_avatar') @register.filter(name='to_avatar')
def to_avatar(role_id='0'): def to_avatar(role_id='0'):
"""不同角色不同头像"""
role_dict = {'0': 'user', '1': 'admin', '2': 'root'} role_dict = {'0': 'user', '1': 'admin', '2': 'root'}
return role_dict.get(str(role_id), 'user') return role_dict.get(str(role_id), 'user')
#
#
@register.filter(name='get_user_asset_group') # @register.filter(name='get_user_asset_group')
def get_user_asset_group(user): # def get_user_asset_group(user):
return user.get_asset_group() # return user.get_asset_group()
#
#
@register.filter(name='group_asset_list') # @register.filter(name='group_asset_list')
def group_asset_list(group): # def group_asset_list(group):
return group.asset_set.all() # return group.asset_set.all()
#
#
@register.filter(name='group_asset_list_count') # @register.filter(name='group_asset_list_count')
def group_asset_list_count(group): # def group_asset_list_count(group):
return group.asset_set.all().count() # return group.asset_set.all().count()
#
#
@register.filter(name='time_delta') # @register.filter(name='time_delta')
def time_delta(time_before): # def time_delta(time_before):
delta = datetime.datetime.now() - time_before # delta = datetime.datetime.now() - time_before
days = delta.days # days = delta.days
if days: # if days:
return "%s 天前" % days # return "%s 天前" % days
else: # else:
hours = delta.seconds/3600 # hours = delta.seconds/3600
if hours: # if hours:
return "%s 小时前" % hours # return "%s 小时前" % hours
else: # else:
mins = delta.seconds/60 # mins = delta.seconds/60
if mins: # if mins:
return '%s 分钟前' % mins # return '%s 分钟前' % mins
else: # else:
return '%s 秒前' % delta.seconds # return '%s 秒前' % delta.seconds
#
#
@register.filter(name='sudo_cmd_list') # @register.filter(name='sudo_cmd_list')
def sudo_cmd_list(cmd_group_id): # def sudo_cmd_list(cmd_group_id):
cmd_group = CmdGroup.objects.filter(id=cmd_group_id) # cmd_group = CmdGroup.objects.filter(id=cmd_group_id)
if cmd_group: # if cmd_group:
cmd_group = cmd_group[0] # cmd_group = cmd_group[0]
return cmd_group.cmd.split(',') # return cmd_group.cmd.split(',')
#
#
@register.filter(name='sudo_cmd_count') # @register.filter(name='sudo_cmd_count')
def sudo_cmd_count(user_group_id): # def sudo_cmd_count(user_group_id):
user_group = UserGroup.objects.filter(id=user_group_id) # user_group = UserGroup.objects.filter(id=user_group_id)
cmds = [] # cmds = []
if user_group: # if user_group:
user_group = user_group[0] # user_group = user_group[0]
cmd_groups = [] # cmd_groups = []
#
for perm in user_group.sudoperm_set.all(): # for perm in user_group.sudoperm_set.all():
cmd_groups.extend(perm.cmd_group.all()) # cmd_groups.extend(perm.cmd_group.all())
#
for cmd_group in cmd_groups: # for cmd_group in cmd_groups:
cmds.extend(cmd_group.cmd.split(',')) # cmds.extend(cmd_group.cmd.split(','))
return len(set(cmds)) # return len(set(cmds))
#
else: # else:
return 0 # return 0
#
#
@register.filter(name='sudo_cmd_count') # @register.filter(name='sudo_cmd_count')
def sudo_cmd_count(user_group_id): # def sudo_cmd_count(user_group_id):
user_group = UserGroup.objects.filter(id=user_group_id) # user_group = UserGroup.objects.filter(id=user_group_id)
cmds = [] # cmds = []
if user_group: # if user_group:
user_group = user_group[0] # user_group = user_group[0]
cmd_groups = [] # cmd_groups = []
for perm in user_group.sudoperm_set.all(): # for perm in user_group.sudoperm_set.all():
cmd_groups.extend(perm.cmd_group.all()) # cmd_groups.extend(perm.cmd_group.all())
#
for cmd_group in cmd_groups: # for cmd_group in cmd_groups:
cmds.extend(cmd_group.cmd.split(',')) # cmds.extend(cmd_group.cmd.split(','))
return len(set(cmds)) # return len(set(cmds))
else: # else:
return 0 # return 0
#
#
@register.filter(name='sudo_cmd_ids') # @register.filter(name='sudo_cmd_ids')
def sudo_cmd_ids(user_group_id): # def sudo_cmd_ids(user_group_id):
user_group = UserGroup.objects.filter(id=user_group_id) # user_group = UserGroup.objects.filter(id=user_group_id)
if user_group: # if user_group:
user_group = user_group[0] # user_group = user_group[0]
cmd_groups = [] # cmd_groups = []
for perm in user_group.sudoperm_set.all(): # for perm in user_group.sudoperm_set.all():
cmd_groups.extend(perm.cmd_group.all()) # cmd_groups.extend(perm.cmd_group.all())
cmd_ids = [str(cmd_group.id) for cmd_group in cmd_groups] # cmd_ids = [str(cmd_group.id) for cmd_group in cmd_groups]
return ','.join(cmd_ids) # return ','.join(cmd_ids)
else: # else:
return '0' # return '0'
#
#
@register.filter(name='cmd_group_split') # @register.filter(name='cmd_group_split')
def cmd_group_split(cmd_group): # def cmd_group_split(cmd_group):
return cmd_group.cmd.split(',') # return cmd_group.cmd.split(',')
...@@ -14,7 +14,7 @@ urlpatterns = patterns('', ...@@ -14,7 +14,7 @@ urlpatterns = patterns('',
(r'^file/download/$', 'jumpserver.views.download'), (r'^file/download/$', 'jumpserver.views.download'),
(r'^error/$', 'jumpserver.views.httperror'), (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')),
(r'^node_auth/', 'jumpserver.views.node_auth'), (r'^node_auth/', 'jumpserver.views.node_auth'),
......
...@@ -71,7 +71,7 @@ def group_list(request): ...@@ -71,7 +71,7 @@ def group_list(request):
if keyword: if keyword:
user_group_list = user_group_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword)) user_group_list = user_group_list.filter(Q(name__icontains=keyword) | Q(comment__icontains=keyword))
contacts, p, contacts, page_range, current_page, show_first, show_end = pages(user_group_list, request) user_group_list, p, user_groups, page_range, current_page, show_first, show_end = pages(user_group_list, request)
return my_render('juser/group_list.html', locals(), request) return my_render('juser/group_list.html', locals(), request)
...@@ -356,18 +356,18 @@ def user_list(request): ...@@ -356,18 +356,18 @@ def user_list(request):
header_title, path1, path2 = '查看用户', '用户管理', '用户列表' header_title, path1, path2 = '查看用户', '用户管理', '用户列表'
keyword = request.GET.get('keyword', '') keyword = request.GET.get('keyword', '')
gid = request.GET.get('gid', '') gid = request.GET.get('gid', '')
contact_list = User.objects.all().order_by('name') users_list = User.objects.all().order_by('username')
if gid: if gid:
user_group = UserGroup.objects.filter(id=gid) user_group = UserGroup.objects.filter(id=gid)
if user_group: if user_group:
user_group = user_group[0] user_group = user_group[0]
contact_list = user_group.user_set.all() users_list = user_group.user_set.all()
if keyword: if keyword:
contact_list = contact_list.filter(Q(username__icontains=keyword) | Q(name__icontains=keyword)).order_by('name') users_list = users_list.filter(Q(username__icontains=keyword) | Q(name__icontains=keyword)).order_by('username')
contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(contact_list, request) users_list, p, users, page_range, current_page, show_first, show_end = pages(users_list, request)
return my_render('juser/user_list.html', locals(), request) return my_render('juser/user_list.html', locals(), request)
...@@ -568,8 +568,6 @@ def user_edit(request): ...@@ -568,8 +568,6 @@ def user_edit(request):
role=role_post, role=role_post,
is_active=is_active) is_active=is_active)
print '#'* 10 + role_post
if email_need: if email_need:
msg = u""" msg = u"""
Hi %s: Hi %s:
...@@ -669,7 +667,7 @@ def change_info(request): ...@@ -669,7 +667,7 @@ def change_info(request):
if '' in [name, password, email]: if '' in [name, password, email]:
error = '不能为空' error = '不能为空'
if len(password) < 6 : if len(password) < 6:
error = '密码须大于6位' error = '密码须大于6位'
if not error: if not error:
......
...@@ -70,17 +70,17 @@ function move(from, to, from_o, to_o) { ...@@ -70,17 +70,17 @@ function move(from, to, from_o, to_o) {
}); });
} }
function move_left(from, to, from_o, to_o) { //function move_left(from, to, from_o, to_o) {
$("#" + from + " option").each(function () { // $("#" + from + " option").each(function () {
if ($(this).prop("selected") == true) { // if ($(this).prop("selected") == true) {
$("#" + to).append(this); // $("#" + to).append(this);
if( typeof from_o !== 'undefined'){ // if( typeof from_o !== 'undefined'){
$("#"+to_o).append($("#"+from_o +" option[value='"+this.value+"']")); // $("#"+to_o).append($("#"+from_o +" option[value='"+this.value+"']"));
} // }
} // }
$(this).attr("selected",'true'); // $(this).attr("selected",'true');
}); // });
} //}
//function move_all(from, to) { //function move_all(from, to) {
// $("#" + from).children().each(function () { // $("#" + from).children().each(function () {
......
...@@ -114,8 +114,8 @@ ...@@ -114,8 +114,8 @@
<small class="pull-right">{{ perm.date_add|naturaltime }}</small> <small class="pull-right">{{ perm.date_add|naturaltime }}</small>
{% endifequal %} {% endifequal %}
<strong>{{ perm.applyer }}</strong> <strong>{{ perm.applyer }}</strong>
<div>申请 {{ perm.bisgroup|ast_to_list }} 主机组权限</div> {# <div>申请 {{ perm.bisgroup|ast_to_list }} 主机组权限</div>#}
<div>申请 {{ perm.asset|ast_to_list }} 主机权限</div> {# <div>申请 {{ perm.asset|ast_to_list }} 主机权限</div>#}
<small class="text-muted">{{ perm.date_add }}</small> <small class="text-muted">{{ perm.date_add }}</small>
</div> </div>
</div> </div>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<div class="col-lg-10"> <div class="col-lg-10">
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
<div id="ibox-content" class="ibox-title"> <div id="ibox-content" class="ibox-title">
<h5> 填写主机基本信息 </h5> <h5> 填写资产基本信息 </h5>
<div 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>
...@@ -15,12 +15,6 @@ ...@@ -15,12 +15,6 @@
<a class="dropdown-toggle" data-toggle="dropdown" href="#"> <a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i> <i class="fa fa-wrench"></i>
</a> </a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">未启用 1</a>
</li>
<li><a href="#">未启用 2</a>
</li>
</ul>
<a class="close-link"> <a class="close-link">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
</a> </a>
...@@ -31,87 +25,61 @@ ...@@ -31,87 +25,61 @@
<div class="panel blank-panel"> <div class="panel blank-panel">
<div class="panel-options"> <div class="panel-options">
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
<li class="active"><a href="/jasset/host_add/" class="text-center"><i class="fa fa-laptop"></i> 单台添加 </a></li> <li class="active"><a href="/jasset/asset_add/" class="text-center"><i class="fa fa-laptop"></i> 单台添加 </a></li>
<li><a href="/jasset/host_add_multi" class="text-center"><i class="fa fa-bar-chart-o"></i> 批量添加 </a></li> <li><a href="/jasset/host_add_multi" class="text-center"><i class="fa fa-bar-chart-o"></i> 批量添加 </a></li>
</ul> </ul>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div class="tab-content"> <div class="tab-content">
<div id="tab-1" class="ibox float-e-margins tab-pane active"> <div id="tab-1" class="ibox float-e-margins tab-pane active">
{% if emg %} {% if error %}
<div class="alert alert-warning text-center">{{ emg }}</div> <div class="alert alert-warning text-center">{{ error }}</div>
{% endif %} {% endif %}
{% if smg %} {% if msg %}
<div class="alert alert-success text-center">{{ smg }}</div> <div class="alert alert-success text-center">{{ msg }}</div>
{% 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"> IP地址<span class="red-fonts">*</span> </label> <div class="form-group"><label class="col-sm-2 control-label"> IP地址<span class="red-fonts">*</span> </label>
<div class="col-sm-8"><input type="text" name="j_ip" placeholder="192.168.1.1" class="form-control"></div> <div class="col-sm-8"><input type="text" name="ip" placeholder="IP" 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"> 端口号<span class="red-fonts">*</span> </label> <div class="form-group">
<div class="col-sm-8"><input type="text" placeholder="22" name="j_port" class="form-control"></div> <label class="col-sm-2 control-label"> 端口号<span class="red-fonts">*</span> </label>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 登录方式<span class="red-fonts">*</span> </label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="radio i-checks"><label> <input type="radio" id="L" checked="" value="L" name="j_type" onclick="show(this)"> <i> LDAP </i></label></div> <input type="text" placeholder="Port" name="port" class="form-control">
<div class="radio i-checks"><label> <input type="radio" id="M" value="M" name="j_type" onclick="show(this)"> <i> MAP </i></label></div>
</div>
<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="col-sm-6"><input type="text" name="j_user" placeholder="lilei" class="form-control"></div>
</div>
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户密码 </label>
<div class="col-sm-6"><input type="password" name="j_password" placeholder="Password" class="form-control"></div>
</div>
</div> </div>
</div> </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
<label for="j_idc" class="col-lg-2 control-label"> 所属IDC<span class="red-fonts">*</span> </label> <label for="j_group" class="col-sm-2 control-label">使用默认管理账号</label>
<div class="col-sm-8"> <div class="col-sm-1">
<select id="j_idc" name="j_idc" class="form-control m-b"> <div class="radio i-checks">
{% for i in eidc %} <label>
<option value="{{i.id}}"> {{ i }} </option> <input type="checkbox" checked="" value="1" id="use_default_auth" name="use_default_auth">
{% endfor %} </label>
</select> </div>
</div> </div>
</div> </div>
{% ifequal session_role_id 2 %} <div class="form-group" id="admin_account" style="display: none">
<div class="hr-line-dashed"></div> <label class="col-sm-2 control-label"> 管理用户名<span class="red-fonts">*</span> </label>
<div class="form-group"> <div class="col-sm-3">
<label for="j_dept" class="col-lg-2 control-label">所属部门<span class="red-fonts">*</span></label> <input type="text" placeholder="Username" name="username" class="form-control">
<div class="col-sm-8">
<select id="j_dept" name="j_dept" class="form-control m-b" multiple size="10">
{% for d in edept %}
<option type="checkbox" value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
{% endfor %}
</select>
</div>
</div> </div>
{% endifequal %}
{% ifequal session_role_id 1 %} <label class="col-sm-1 control-label"> 密码<span class="red-fonts">*</span> </label>
<div class="hr-line-dashed"></div> <div class="col-sm-4">
<div class="form-group"><label class="col-sm-2 control-label"> 所属部门 <span class="red-fonts">*</span></label> <input type="password" placeholder="Password" name="password" class="form-control">
<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 %} </div>
<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">所属主机组</label> <label for="groups" class="col-sm-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="groups" name="groups" class="form-control m-b" multiple size="10">
{% for g in egroup %} {% for g in egroup %}
<option type="checkbox" value="{{ g.id }}">{{ 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 %}
...@@ -122,20 +90,22 @@ ...@@ -122,20 +90,22 @@
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 是否激活<span class="red-fonts">*</span> </label> <div class="form-group"><label class="col-sm-2 control-label"> 是否激活<span class="red-fonts">*</span> </label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="radio i-checks"><label> <input type="radio" checked="" value="1" name="j_active"> <i> 激活 </i></label></div> <div class="radio i-checks">
<div class="radio i-checks"><label> <input type="radio" value="0" name="j_active"> <i> 禁用 </i></label></div> <label> <input type="radio" checked="" value="1" name="is_active">激活 </label>
<label> <input type="radio" value="0" name="is_active"> 禁用</label>
</div>
</div> </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" placeholder="hadoop01" name="j_comment" class="form-control"></div> <div class="col-sm-8"><input type="text" placeholder="comment" name="comment" class="form-control"></div>
</div> </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-5"> <div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-white" type="submit"> 重置 </button> <button class="btn btn-white" type="reset"> 重置 </button>
<button class="btn btn-primary" type="submit"> 提交 </button> <button class="btn btn-primary" type="submit"> 提交 </button>
</div> </div>
</div> </div>
...@@ -149,17 +119,21 @@ ...@@ -149,17 +119,21 @@
</div> </div>
</div> </div>
</div> </div>
{% endblock %}
{% block self_footer_js %}
<script> <script>
var showFlag={};
function show(o){ $('document').ready(function(){
showFlag[o.name]=o.value; $('#use_default_auth').click(function(){
if(showFlag.j_type=="M"){ if ($(this).is(':checked')){
document.getElementById("a1").style.display=""; $('#admin_account').css('display', 'none')
} }
else{ else {
document.getElementById("a1").style.display="none"; $('#admin_account').css('display', 'block')
}}; }
})
});
$('#assetForm').validator({ $('#assetForm').validator({
timely: 2, timely: 2,
...@@ -167,34 +141,19 @@ $('#assetForm').validator({ ...@@ -167,34 +141,19 @@ $('#assetForm').validator({
rules: { rules: {
check_ip: [/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/, 'ip地址不正确'], check_ip: [/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/, 'ip地址不正确'],
check_port: [/^\d{1,5}$/, '端口号不正确'], check_port: [/^\d{1,5}$/, '端口号不正确'],
type_m: function(element){
return $("#M").is(":checked");
}
}, },
fields: { fields: {
"j_ip": { "ip": {
rule: "required;check_ip", rule: "required;check_ip",
tip: "输入IP", tip: "输入IP",
ok: "", ok: "",
msg: {required: "必须填写!"} msg: {required: "必须填写!"}
}, },
"j_port": { "port": {
rule: "required;check_port", rule: "required;check_port",
tip: "输入端口号", tip: "输入端口号",
ok: "", ok: "",
msg: {required: "必须填写!"} msg: {required: "必须填写!"}
},
"j_idc": {
rule: "required",
tip: "选择IDC",
ok: "",
msg: {checked: "必须填写!"}
},
"j_dept": {
rule: "required",
tip: "选择部门",
ok: "",
msg: {checked: "至少选择一个部门"}
} }
}, },
valid: function(form) { valid: function(form) {
......
...@@ -9,14 +9,11 @@ ...@@ -9,14 +9,11 @@
<div class="col-lg-4"> <div class="col-lg-4">
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
<div class="ibox-title"> <div class="ibox-title">
<span class="text text-primary"><b>{{ post.ip }}</b></span> <span class="text text-primary"><b>{{ asset.ip }}</b></span>
<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>
</a> </a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user"> <ul class="dropdown-menu dropdown-user">
</ul> </ul>
<a class="close-link"> <a class="close-link">
...@@ -34,55 +31,35 @@ ...@@ -34,55 +31,35 @@
<table class="table"> <table class="table">
<tr> <tr>
<td class="text-navy">IP</td> <td class="text-navy">IP</td>
<td>{{ post.ip }}</td> <td>{{ asset.ip }}</td>
</tr> </tr>
<tr> <tr>
<td class="text-navy">端口</td> <td class="text-navy">端口</td>
<td>{{ post.port }}</td> <td>{{ asset.port }}</td>
</tr>
<tr>
<td class="text-navy">登录方式</td>
<td>{{ post.login_type|get_login_type }}</td>
</tr>
<tr>
<td class="text-navy">IDC</td>
<td>{{ post.idc.name }} </td>
</tr> </tr>
<tr> <tr>
<td class="text-navy">部门</td> <td class="text-navy">主机组</td>
<td> <td>
<table class="table"> <table class="table">
{% for dept in post.dept.all %}
<tr>
<td>{{ dept.name }}</td>
</tr>
{% endfor %}
</table> </table>
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="text-navy">主机组</td> <td class="text-navy">使用默认管理账号</td>
<td> <td>{{ asset.use_default_auth|bool2str }}</td>
<table class="table">
{% for group in post.bis_group.all %}
<tr>
<td>{{ group.name }}</td>
</tr>
{% endfor %}
</table>
</td>
</tr> </tr>
<tr> <tr>
<td class="text-navy">激活</td> <td class="text-navy">激活</td>
<td>{{ post.is_active|bool2str }}</td> <td>{{ asset.is_active|bool2str }}</td>
</tr> </tr>
<tr> <tr>
<td class="text-navy">添加日期</td> <td class="text-navy">添加日期</td>
<td>{{ post.date_added|date:"Y-m-d H:i:s" }}</td> <td>{{ asset.date_added|date:"Y-m-d H:i:s" }}</td>
</tr> </tr>
<tr> <tr>
<td class="text-navy">备注</td> <td class="text-navy">备注</td>
<td>{{ post.comment }}</td> <td>{{ asset.comment }}</td>
</tr> </tr>
</table> </table>
</div> </div>
...@@ -116,17 +93,17 @@ ...@@ -116,17 +93,17 @@
<div> <div>
<div class="text-left"> <div class="text-left">
<table class="table"> <table class="table">
{% if user_permed_list %} {# {% if user_permed_list %}#}
{% for user in user_permed_list %} {# {% for user in user_permed_list %}#}
<tr> {# <tr>#}
<td class="text-navy">{{ user.name }}</td> {# <td class="text-navy">{{ user.name }}</td>#}
<td>{{ user.dept.name }}</td> {# <td>{{ user.dept.name }}</td>#}
<td><a href="/juser/user_detail/?id={{ user.id }}">详情</a></td> {# <td><a href="/juser/user_detail/?id={{ user.id }}">详情</a></td>#}
</tr> {# </tr>#}
{% endfor %} {# {% endfor %}#}
{% else %} {# {% else %}#}
<p class="text-center">(暂无)</p> {# <p class="text-center">(暂无)</p>#}
{% endif %} {# {% endif %}#}
</table> </table>
</div> </div>
</div> </div>
...@@ -157,49 +134,49 @@ ...@@ -157,49 +134,49 @@
<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">
{% if log %} {# {% if log %}#}
{% for l in log %} {# {% for l in log %}#}
<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 %}#}
<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 %} {# {% else %}#}
<p class="text-center">(暂无)</p> {# <p class="text-center">(暂无)</p>#}
{% endif %} {# {% endif %}#}
</div> </div>
</div> </div>
......
{% 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 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>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<div class="panel-body">
<div class="tab-content">
<div id="tab-1" class="ibox float-e-margins tab-pane active">
{% if error %}
<div class="alert alert-warning text-center">{{ error }}</div>
{% endif %}
{% if msg %}
<div class="alert alert-success text-center">{{ msg }}</div>
{% endif %}
<form id="assetForm" method="post" class="form-horizontal">
<div class="form-group"><label class="col-sm-2 control-label"> IP地址<span class="red-fonts">*</span> </label>
<div class="col-sm-8"><input type="text" name="ip" value="{{ asset.ip }}" class="form-control"></div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label class="col-sm-2 control-label"> 端口号<span class="red-fonts">*</span> </label>
<div class="col-sm-8">
<input type="text" value="{{ asset.port }}" name="port" class="form-control">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_group" class="col-sm-2 control-label">使用默认管理账号</label>
<div class="col-sm-1">
<div class="radio i-checks">
<label>
<input type="checkbox" {% ifequal asset.use_default_auth 1 %} checked="" {% endifequal %} value="1" id="use_default_auth" name="use_default_auth">
</label>
</div>
</div>
</div>
<div class="form-group" id="admin_account" {% ifequal asset.use_default_auth 1 %} style="display: none" {% endifequal %}>
<label class="col-sm-2 control-label"> 管理用户名<span class="red-fonts">*</span> </label>
<div class="col-sm-3">
<input type="text" {% ifnotequal asset.use_default_auth 1 %} value="{{ asset.username }}" {% endifnotequal %} name="username" class="form-control">
</div>
<label class="col-sm-1 control-label"> 密码<span class="red-fonts">*</span> </label>
<div class="col-sm-4">
<input type="password" {% ifnotequal asset.use_default_auth 1 %} value="{{ asset.password }}" {% endifnotequal %} name="password" class="form-control">
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="groups" class="col-sm-2 control-label">所属主机组</label>
<div class="col-sm-8">
<select id="groups" name="groups" class="form-control m-b" multiple size="10">
{% for g in egroup %}
<option type="checkbox" value="{{ g.id }}">{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option>
{% endfor %}
</select>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 是否激活<span class="red-fonts">*</span> </label>
<div class="col-sm-8">
<div class="radio i-checks">
{% ifequal asset.is_active 1 %}
<label> <input type="radio" checked="" value="1" name="is_active">激活 </label>
<label> <input type="radio" value="0" name="is_active"> 禁用</label>
{% else %}
<label> <input type="radio" value="1" name="is_active">激活 </label>
<label> <input type="radio" checked="" value="0" name="is_active"> 禁用</label>
{% endifequal %}
</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="{{ asset.comment }}" name="comment" class="form-control"></div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-white" type="reset"> 重置 </button>
<button class="btn btn-primary" type="submit"> 提交 </button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block self_footer_js %}
<script>
$('document').ready(function(){
$('#use_default_auth').click(function(){
if ($(this).is(':checked')){
$('#admin_account').css('display', 'none')
}
else {
$('#admin_account').css('display', 'block')
}
})
});
$('#assetForm').validator({
timely: 2,
theme: "yellow_right_effect",
rules: {
check_ip: [/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/, 'ip地址不正确'],
check_port: [/^\d{1,5}$/, '端口号不正确'],
},
fields: {
"ip": {
rule: "required;check_ip",
tip: "输入IP",
ok: "",
msg: {required: "必须填写!"}
},
"port": {
rule: "required;check_port",
tip: "输入端口号",
ok: "",
msg: {required: "必须填写!"}
}
},
valid: function(form) {
form.submit();
}
});
</script>
{% endblock %}
\ No newline at end of file
...@@ -16,12 +16,6 @@ ...@@ -16,12 +16,6 @@
<a class="dropdown-toggle" data-toggle="dropdown" href="#"> <a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i> <i class="fa fa-wrench"></i>
</a> </a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">未启用 1</a>
</li>
<li><a href="#">未启用 2</a>
</li>
</ul>
<a class="close-link"> <a class="close-link">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
</a> </a>
...@@ -30,14 +24,14 @@ ...@@ -30,14 +24,14 @@
<div class="ibox-content"> <div class="ibox-content">
<div> <div>
<a target="_blank" href="/jasset/host_add" class="btn btn-sm btn-primary "> 添加 </a> <a target="_blank" href="/jasset/asset_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">
<input type="text" style="display: none"> <input type="text" style="display: none">
<div class="input-group-btn"> <div class="input-group-btn">
<button id='search_btn' type="button" class="btn btn-sm btn-primary" onclick="host_search()"> <button type="submit" class="btn btn-sm btn-primary">
Search - 搜索 -
</button> </button>
</div> </div>
</div> </div>
...@@ -48,37 +42,35 @@ ...@@ -48,37 +42,35 @@
<table class="table table-striped table-bordered table-hover " id="editable" name="editable"> <table class="table table-striped table-bordered table-hover " id="editable" name="editable">
<thead> <thead>
<tr> <tr>
<th class="text-center"><input id="checkall" type="checkbox" class="i-checks" name="checkall" value="checkall" data-editable='false' onclick="check_all('contents_form')"></th> <th class="text-center">
<th class="text-center" name="j_ip"> IP地址 </th> <input id="checkall" type="checkbox" class="i-checks" name="checkall" value="checkall" data-editable='false' onclick="check_all('contents_form')">
</th>
<th class="text-center" name="ip"> IP地址 </th>
<th class="text-center"> 端口号 </th> <th class="text-center"> 端口号 </th>
<th class="text-center" name="j_type"> 登录方式 </th>
<th class="text-center" name="j_idc"> 所属IDC </th>
<th class="text-center"> 所属部门 </th>
<th class="text-center"> 所属主机组 </th> <th class="text-center"> 所属主机组 </th>
<th class="text-center"> 是否激活 </th> <th class="text-center"> 使用默认管理 </th>
<th class="text-center" name="j_comment"> 备注 </th> <th class="text-center"> 激活 </th>
<th class="text-center" name="comment"> 备注 </th>
<th class="text-center"> 操作 </th> <th class="text-center"> 操作 </th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for post in contacts.object_list %} {% for asset in assets.object_list %}
<tr class="gradeX"> <tr class="gradeX">
<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="id" value="{{ asset.id }}" data-editable='false'>
<td class="text-center" name="j_ip"> {{ post.ip }} </td> <input name="id" value="{{ asset.id }}" type="checkbox" class="i-checks">
<td class="text-center" name="j_port"> {{ post.port }} </td> </td>
<td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td> <td class="text-center"> {{ asset.ip }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td> <td class="text-center"> {{ asset.port }} </td>
<td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</td> <td class="text-center">{{ asset.port }}</td>
<!--<td class="text-center" id="j_dept_{{post.id}}" name="j_dept" onclick="show_all('dept', '{{post.id}}')">{{ post.dept.all | group_str2 }}</td>--> <td class="text-center"> {{ asset.use_default_auth|bool2str }} </td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td> <td class="text-center"> {{ asset.is_active|bool2str }} </td>
<!--<td class="text-center" id="j_group_{{post.id}}" name="j_group" onclick="show_all('group', '{{post.id}}')">{{ post.bis_group.all | group_str2_all }}</td>--> <td class="text-center"> {{ asset.comment }} </td>
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </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 href="/jasset/host_detail/?id={{ post.id }}" class="btn btn-xs btn-primary">详情</a> <a href="/jasset/asset_detail/?id={{ asset.id }}" class="btn btn-xs btn-primary">详情</a>
{% ifnotequal session_role_id 0 %} {% ifnotequal session_role_id 0 %}
<a href="/jasset/host_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a> <a href="/jasset/asset_edit/?id={{ asset.id }}" class="btn btn-xs btn-info">编辑</a>
<a href="/jasset/host_del/{{ post.id }}" class="btn btn-xs btn-danger">删除</a> <a value="/jasset/asset_del/?id={{ asset.id }}" class="btn btn-xs btn-danger asset_del">删除</a>
{% endifnotequal %} {% endifnotequal %}
</td> </td>
</tr> </tr>
...@@ -98,7 +90,9 @@ ...@@ -98,7 +90,9 @@
</div> </div>
</div> </div>
</div> </div>
{% endblock %}
{% block self_footer_js %}
<script> <script>
$('table td').on('change', function(env, id){ $('table td').on('change', function(env, id){
var url = "/jasset/show_all_ajax/?env=" + env + "&id=" + id; var url = "/jasset/show_all_ajax/?env=" + env + "&id=" + id;
...@@ -111,10 +105,21 @@ ...@@ -111,10 +105,21 @@
$("#j_dept_"+id).html(data); $("#j_dept_"+id).html(data);
} }
}); });
}) });
$(document).ready(function(){ $(document).ready(function(){
$('#editable').editableTableWidget({editor: $('<textarea>')}); $('#editable').editableTableWidget({editor: $('<textarea>')});
$('.asset_del').click(function(){
var row = $(this).closest('tr');
$.get(
$(this).attr('value'),
{},
function(data){
alert(data);
row.remove()
}
)
})
}); });
...@@ -157,22 +162,22 @@ ...@@ -157,22 +162,22 @@
} }
} }
function host_search(){ {# function host_search(){#}
$.ajax({ {# $.ajax({#}
type: "GET", {# type: "GET",#}
url: "/jasset/search/", {# url: "/jasset/search/",#}
data: $("#search_form").serialize(), {# data: $("#search_form").serialize(),#}
success: function (data) { {# success: function (data) {#}
$("#contents_form").html(data); {# $("#contents_form").html(data);#}
} {# }#}
}); {# });#}
} {# }#}
$("#search_input").keydown(function(e){ $("#search_input").keydown(function(e){
if(e.keyCode==13){ if(e.keyCode==13){
host_search() host_search()
} }
}) });
function show_all(env, id) { function show_all(env, id) {
var url = "/jasset/show_all_ajax/?env=" + env + "&id=" + id; var url = "/jasset/show_all_ajax/?env=" + env + "&id=" + id;
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
<div class="col-lg-10"> <div class="col-lg-10">
<div class="ibox float-e-margins"> <div class="ibox float-e-margins">
<div id="ibox-content" class="ibox-title"> <div id="ibox-content" class="ibox-title">
<h5> 填写主机组基本信息 </h5> <h5> 填写资产组基本信息 </h5>
<div 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,64 +30,38 @@ ...@@ -30,64 +30,38 @@
<a class="dropdown-toggle" data-toggle="dropdown" href="#"> <a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i> <i class="fa fa-wrench"></i>
</a> </a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">未启用 1</a>
</li>
<li><a href="#">未启用 2</a>
</li>
</ul>
<a class="close-link"> <a class="close-link">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
</a> </a>
</div> </div>
</div> </div>
<select id="assets_total" name="assets" class="form-control m-b" size="12" multiple style="display: none"> {# <select id="assets_total" name="assets" class="form-control m-b" size="12" multiple style="display: none">#}
{% for asset in posts %} {# {% for asset in assets_all %}#}
<option value="{{ asset.id }}">{{ asset.ip }}</option> {# <option value="{{ asset.id }}">{{ asset.ip }}</option>#}
{% endfor %} {# {% endfor %}#}
</select> {# </select>#}
{##}
<select id="asset_select_total" name="j_hosts" class="form-control m-b" size="12" multiple style="display: none"> {# <select id="asset_select_total" name="j_hosts" class="form-control m-b" size="12" multiple style="display: none">#}
{% for asset in eposts %} {# {% for asset in eposts %}#}
<option value="{{ asset.id }}">{{ asset.ip }}</option> {# <option value="{{ asset.id }}">{{ asset.ip }}</option>#}
{% endfor %} {# {% endfor %}#}
</select> {# </select>#}
<div class="ibox-content"> <div class="ibox-content">
{% if emg %} {% if error %}
<div class="alert alert-warning text-center">{{ emg }}</div> <div class="alert alert-warning text-center">{{ error }}</div>
{% endif %} {% endif %}
{% if smg %} {% if msg %}
<div class="alert alert-success text-center">{{ smg }}</div> <div class="alert alert-success text-center">{{ msg }}</div>
{% 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"> 主机组名<span class="red-fonts">*</span></label> <div class="form-group">
<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> <label class="col-sm-2 control-label"> 主机组名<span class="red-fonts">*</span></label>
</div> <div class="col-sm-8">
<input type="text" placeholder="Name" name="name" class="form-control">
{% 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 %}
<option value="{{ d.id }}">{{ d.name }}</option>
{% 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="{{ 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 %} </div>
<div class="hr-line-dashed"></div> <div class="hr-line-dashed"></div>
<div class="form-group"> <div class="form-group">
...@@ -108,8 +82,8 @@ ...@@ -108,8 +82,8 @@
<div class="col-sm-4"> <div class="col-sm-4">
<div> <div>
<select id="assets" name="assets" class="form-control m-b" size="12" multiple> <select id="assets" name="assets" class="form-control m-b" size="12" multiple>
{% for post in posts %} {% for asset in asset_all %}
<option value="{{ post.id }}">{{ post.ip }}</option> <option value="{{ asset.id }}">{{ asset.ip }}</option>
{% endfor %} {% endfor %}
</select> </select>
</div> </div>
...@@ -118,27 +92,30 @@ ...@@ -118,27 +92,30 @@
<div class="col-sm-1"> <div class="col-sm-1">
<div class="btn-group" style="margin-top: 60px;"> <div class="btn-group" style="margin-top: 60px;">
<button type="button" class="btn btn-white" onclick="move('assets', 'asset_select', 'assets_total', 'asset_select_total' )"><i class="fa fa-chevron-right"></i></button> <button type="button" class="btn btn-white" onclick="move('assets', 'asset_select', 'assets_total', 'asset_select_total' )"><i class="fa fa-chevron-right"></i></button>
<button type="button" class="btn btn-white" onclick="move_left('asset_select', 'assets', 'asset_select_total', 'assets_total')"><i class="fa fa-chevron-left"></i> </button> <button type="button" class="btn btn-white" onclick="move('asset_select', 'assets', 'asset_select_total', 'assets_total')"><i class="fa fa-chevron-left"></i> </button>
</div> </div>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<div> <div>
<select id="asset_select" name="j_hosts" class="form-control m-b" size="12" multiple></select> <select id="asset_select" name="asset_select" class="form-control m-b" size="12" multiple></select>
</div> </div>
</div> </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">
<div class="col-sm-8"><input type="text" value="{{ j_comment }}" placeholder=包括web组所有主机 name="j_comment" class="form-control"></div> <label class="col-sm-2 control-label"> 备注 </label>
<div class="col-sm-8">
<input type="text" placeholder="Comment" name="comment" class="form-control">
</div>
</div> </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-5"> <div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-white" type="submit"> 重置 </button> <button class="btn btn-white" type="reset"> 重置 </button>
<button class="btn btn-primary" id="submit_button" type="submit" onclick="on_submit('groups_selected') "> 提交 </button> <button class="btn btn-primary" type="submit" onclick="on_submit('groups_selected') "> 提交 </button>
</div> </div>
</div> </div>
</form> </form>
......
...@@ -16,12 +16,6 @@ ...@@ -16,12 +16,6 @@
<a class="dropdown-toggle" data-toggle="dropdown" href="#"> <a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i> <i class="fa fa-wrench"></i>
</a> </a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">未启用 1</a>
</li>
<li><a href="#">未启用 2</a>
</li>
</ul>
<a class="close-link"> <a class="close-link">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
</a> </a>
...@@ -29,14 +23,14 @@ ...@@ -29,14 +23,14 @@
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<div class=""> <div class="">
<a target="_blank" href="/jasset/group_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">
<input type="text" style="display: none"> <input type="text" style="display: none">
<div class="input-group-btn"> <div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary"> <button id='search_btn' type="submit" class="btn btn-sm btn-primary">
Search - 搜索 -
</button> </button>
</div> </div>
</div> </div>
...@@ -47,26 +41,24 @@ ...@@ -47,26 +41,24 @@
<table class="table table-striped table-bordered table-hover " id="editable" > <table class="table table-striped table-bordered table-hover " id="editable" >
<thead> <thead>
<tr> <tr>
<th class="text-center"><input id="checkall" type="checkbox" class="i-checks" name="checkall" value="checkall" data-editable='false' onclick="check_all('contents_form')"></th> <th class="text-center">
<input id="checkall" type="checkbox" class="i-checks" name="checkall" value="checkall" data-editable='false' onclick="check_all('contents_form')">
</th>
<th class="text-center"> 主机组名 </th> <th class="text-center"> 主机组名 </th>
<th class="text-center"> 所属部门 </th>
<th class="text-center"> 主机数量 </th> <th class="text-center"> 主机数量 </th>
<th class="text-center"> 备注 </th> <th class="text-center"> 备注 </th>
<th class="text-center"> 操作 </th> <th class="text-center"> 操作 </th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for post in contacts.object_list %} {% for asset_group in asset_groups.object_list %}
<tr class="gradeX"> <tr class="gradeX">
<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="id" value="{{ asset_group.id }}" data-editable='false'>
<td class="text-center"> {{ post.name }} </td> <input name="id" value="{{ post.id }}" type="checkbox" class="i-checks">
<td class="text-center"> {{ post.dept.name }} </td> </td>
{% ifequal session_role_id 2 %} <td class="text-center"> {{ asset_group.name }} </td>
<td class="text-center"> <a href="/jasset/group_detail/?id={{ post.id }}">{{ post.asset_set.count }}</a> </td> <td class="text-center"> <a href="/jasset/group_detail/?id={{ post.id }}">{{ asset_group.asset_set.count }}</a> </td>
{% else %} <td class="text-center"> {{ asset_group.comment }} </td>
<td class="text-center"> <a href="/jasset/group_detail/?id={{ post.id }}">{{ post|get_group_count:dept }}</a> </td>
{% endifequal %}
<td class="text-center"> {{ post.comment }} </td>
<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>
......
{% 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 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" autocomplete="off">
<div class="form-group"><label class="col-sm-2 control-label"> IP地址<span class="red-fonts">*</span> </label>
<div class="col-sm-8"><input type="text" name="j_ip" value="{{ post.ip }}" placeholder="192.168.1.1" class="form-control"></div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 端口号<span class="red-fonts">*</span> </label>
<div class="col-sm-8"><input type="text" placeholder="22" name="j_port" value="{{ post.port }}" class="form-control"></div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 登录方式<span class="red-fonts">*</span> </label>
<div class="col-sm-8">
{% for t, type in login_types.items %}
{% ifequal t post.login_type %}
<div class="radio i-checks"><label> <input type="radio" checked="" value="{{ t }}" name="j_type" onclick="show(this)"> <i> {{ type }} </i></label></div>
{% else %}
<div class="radio i-checks"><label> <input type="radio" value="{{ t }}" name="j_type" onclick="show(this)"> <i> {{ type }} </i></label></div>
{% endifequal %}
{% endfor %}
</div>
{% ifequal post.login_type 'M' %}
<div name="type" id="type">
<div class="form-group"><label class="col-sm-2 col-sm-offset-1 control-label"> 普通用户名 </label>
<div class="col-sm-6"><input type="text" name="j_user" 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>
</div>
{% endifequal %}
</div>
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_idc" class="col-lg-2 control-label"> 所属IDC<span class="red-fonts">*</span> </label>
<div class="col-sm-8">
<select id="j_idc" name="j_idc" class="form-control m-b">
{% for i in eidc %}
{% ifequal i.id post.idc_id %}
<option value="{{i.id}}" selected> {{ i }} </option>
{% else %}
<option value="{{i.id}}"> {{ i }} </option>
{% endifequal %}
{% endfor %}
</select>
</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" multiple size="10">
{% for d in edept %}
{% if d in e_dept %}
<option type="checkbox" selected value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
{% else %}
<option type="checkbox" value="{{ d.id }}">{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}</option>
{% endif %}
{% endfor %}
</select>
</div>
</div>
{% endifequal %}
{% ifequal session_role_id 1 %}
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 所属部门<span class="red-fonts">*</span> </label>
<input type="text" name="j_dept" value="{{ dept.id }}" style="display: none">
<div class="col-sm-8"><input type="text" value="{{ dept.name }}" class="form-control" readonly="readonly"></div>
</div>
{% endifequal %}
<div class="hr-line-dashed"></div>
<div class="form-group">
<label for="j_group" class="col-lg-2 control-label"> 所属主机组</label>
<div class="col-sm-8">
<select id="j_group" name="j_group" class="form-control m-b" multiple size="10">
{% for g in egroup %}
{% if g in e_group %}
<option type="checkbox" value="{{ g.id }}" selected>{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option>
{% else %}
<option type="checkbox" value="{{ g.id }}" >{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}</option>
{% endif %}
{% endfor %}
</select>
</div>
</div>
<div class="hr-line-dashed"></div>
<div class="form-group"><label class="col-sm-2 control-label"> 是否激活<span class="red-fonts">*</span> </label>
<div class="col-sm-8">
{% for a,active in actives.items %}
{% ifequal a post.is_active %}
<div class="radio i-checks"><label> <input type="radio" checked value="{{ a }}" name="j_active"> <i> {{ active }} </i></label></div>
{% else %}
<div class="radio i-checks"><label> <input type="radio" value="{{ a }}" name="j_active"> <i> {{ active }} </i></label></div>
{% endifequal %}
{% endfor %}
</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" placeholder="hadoop01" value="{{ post.comment }}" 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" style="display: i"> 提交 </button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script>
var showFlag={};
function show(o){
showFlag[o.name]=o.value;
if(showFlag.j_type=="M"){
document.getElementById("type").style.display="";
}
else{
document.getElementById("type").style.display="none";
}};
$('#assetForm').validator({
timely: 2,
theme: "yellow_right_effect",
rules: {
check_ip: [/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/, 'ip地址不正确'],
check_port: [/^\d{1,5}$/, '端口号不正确'],
type_m: function(element){
return $("#M").is(":checked");
}
},
fields: {
"j_ip": {
rule: "required;check_ip",
tip: "输入IP",
ok: "",
msg: {required: "必须填写!"}
},
"j_port": {
rule: "required;check_port",
tip: "输入端口号",
ok: "",
msg: {required: "必须填写!"}
},
"j_idc": {
rule: "required",
tip: "选择IDC",
ok: "",
msg: {checked: "必须填写!"}
},
"j_dept": {
rule: "required",
tip: "选择部门",
ok: "",
msg: {checked: "至少选择一个部门"}
},
"j_user": {
rule: "required(type_m)",
tip: "普通用户名",
ok: "",
msg: {required: "请填写用户名"}
},
"j_password": {
rule: "required(type_m);length[6~100]",
tip: "密码6-16位",
ok: "",
msg: {required: "6-16位"}
}
},
valid: function(form) {
form.submit();
}
});
</script>
{% endblock %}
\ No newline at end of file
{% 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 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">
<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 %}
\ No newline at end of file
{% 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-12">
<div class="ibox float-e-margins" id="all">
<div class="ibox-title">
<h5> IDC<span class="text-info"> {{ idc.name }} </span>详细信息列表 </h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</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 %}
<div class="">
<a target="_blank" href="/jasset/host_add" class="btn btn-sm btn-primary "> 添加主机 </a>
</div>
<form id="contents_form" name="contents_form">
<table class="table table-striped table-bordered table-hover " id="editable" name="editable">
<thead>
<tr>
<th class="text-center"><input id="checkall" type="checkbox" class="i-checks" name="checkall" value="checkall" data-editable='false' onclick="check_all('contents_form')"></th>
<th class="text-center" name="j_ip"> IP地址 </th>
<th class="text-center"> 端口号 </th>
<th class="text-center" name="j_type"> 登录方式 </th>
<th class="text-center" id="j_group_name" value="{{ idc_name }}"> 所属IDC </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_comment"> 备注 </th>
<th class="text-center"> 操作 </th>
</tr>
</thead>
<tbody>
{% for post in contacts.object_list %}
<tr class="gradeX">
<td class="text-center" name="j_id" value="{{ post.id }}" data-editable='false'><input name="id" value="{{ post.id }}" type="checkbox" class="i-checks"></td>
<td class="text-center" name="j_ip"> {{ post.ip }} </td>
<td class="text-center" name="j_port"> {{ post.port }} </td>
<td class="text-center" name="j_type"> {{ post.login_type|get_login_type }} </td>
<td class="text-center" name="j_idc"> {{ post.idc.name }} </td>
<td class="text-center" name="j_dept">{{ post.dept.all | group_str2 }}</td>
<td class="text-center" name="j_group">{{ post.bis_group.all | group_str2_all }}</td>
<td class="text-center" name="j_active"> {{ post.is_active|bool2str }} </td>
<td class="text-center" name="j_comment"> {{ post.comment }} </td>
<td class="text-center" data-editable='false'>
<a href="/jasset/host_detail/?id={{ post.id }}" class="btn btn-xs btn-primary">详情</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>
</tr>
{% endfor %}
</tbody>
</table>
<div class="row">
<div class="col-sm-6">
<input type="button" id="del_button" class="btn btn-danger btn-sm" name="del_button" value="删除" onclick="del('contents_form')" />
<input type="button" id="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />
</div>
<div class="col-sm-6">
<div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
<ul class="pagination" style="margin-top: 0; float: right">
{% if keyword %}
{% if contacts.has_previous %}
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
<a href="?keyword={{ keyword }}&page={{ contacts.previous_page_number }}">Previous</a>
</li>
{% else %}
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" id="editable_previous">
<a href="#">Previous</a>
</li>
{% endif %}
{% ifequal show_first 1 %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page=1&id={{ idc.id }}" title="第1页">1...</a></li>
{% endifequal %}
{% for page in page_range %}
{% ifequal current_page page %}
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page={{ page }}&id={{ idc.id }}" title="第{{ page }}页">{{ page }}</a></li>
{% else %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page={{ page }}&id={{ idc.id }}" title="第{{ page }}页">{{ page }}</a></li>
{% endifequal %}
{% endfor %}
{% ifequal show_end 1 %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?keyword={{ keyword }}&page={{ p.num_pages }}&id={{ idc.id }}" title="第{{ page }}页">...{{ p.num_pages }}</a></li>
{% endifequal %}
{% if contacts.has_next %}
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
<a href="?keyword={{ keyword }}&page={{ contacts.next_page_number }}&id={{ idc.id }}">Next</a>
</li>
{% else %}
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
<a href="#">Next</a>
</li>
{% endif %}
{% else %}
{% if contacts.has_previous %}
<li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
<a href="?page={{ contacts.previous_page_number }}&id={{ idc.id }}">Previous</a>
</li>
{% else %}
<li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" id="editable_previous">
<a href="#">Previous</a>
</li>
{% endif %}
{% ifequal show_first 1 %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page=1&id={{ idc.id }}" title="第1页">1...</a></li>
{% endifequal %}
{% for page in page_range %}
{% ifequal current_page page %}
<li class="paginate_button active" aria-controls="editable" tabindex="0"><a href="?page={{ page }}&id={{ idc.id }}" title="第{{ page }}页">{{ page }}</a></li>
{% else %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page={{ page }}&id={{ idc.id }}" title="第{{ page }}页">{{ page }}</a></li>
{% endifequal %}
{% endfor %}
{% ifequal show_end 1 %}
<li class="paginate_button" aria-controls="editable" tabindex="0"><a href="?page={{ p.num_pages }}&id={{ idc.id }}" title="第{{ page }}页">...{{ p.num_pages }}</a></li>
{% endifequal %}
{% if contacts.has_next %}
<li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
<a href="?page={{ contacts.next_page_number }}&id={{ idc.id }}">Next</a>
</li>
{% else %}
<li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
<a href="#">Next</a>
</li>
{% endif %}
{% endif %}
</ul>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
$('#editable').editableTableWidget();
});
function alter(form) {
selectData = GetTableDataBox();
if (selectData[1] != 0) {
$.ajax({
type: "post",
url: "/jasset/host_edit/batch/",
data: {"editable": selectData[0], "len_table": selectData[1]},
success: function (data) {
alert("修改成功");
window.open("/jasset/host_list/", "_self");
}
});
}
}
function del(form) {
var checkboxes = document.getElementById(form);
var id_list = {};
var group_name = $('#j_group_name').attr("value");
console.log(group_name);
var j = 0;
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") {
id_list[j] = checkboxes.elements[i].value;
j++;
}
}
if (confirm("确定从该IDC中删除")) {
$.ajax({
type: "POST",
url: "/jasset/host_del/multi/",
data: {"id_list": id_list, "len_list": j, "group_name": group_name},
success: function (data) {
window.open(window.location.href, "_self");
}
});
}
}
</script>
{% endblock %}
\ No newline at end of file
{% 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 %}
\ No newline at end of file
{% 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 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="">
{% ifequal session_role_id 2 %}
<a target="_blank" href="/jasset/idc_add" class="btn btn-sm btn-primary "> 添加IDC </a>
{% endifequal %}
<form id="search_form" method="get" action="" class="pull-right mail-search">
<div class="input-group">
<input type="text" class="form-control input-sm" id="search_input" name="keyword" placeholder="Search">
<input type="text" style="display: none">
<div class="input-group-btn">
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
Search
</button>
</div>
</div>
</form>
</div>
<form id="contents_form" name="contents_form">
<table class="table table-striped table-bordered table-hover " id="editable" >
<thead>
<tr>
{% ifequal session_role_id 2 %}
<th class="text-center"><input id="checkall" type="checkbox" class="i-checks" name="checkall" value="checkall" data-editable='false' onclick="check_all('contents_form')"></th>
{% endifequal %}
<th class="text-center"> 机房名 </th>
<th class="text-center"> 主机数量 </th>
<th class="text-center"> 备注 </th>
<th class="text-center"> 操作 </th>
</tr>
</thead>
<tbody>
{% for post in contacts.object_list %}
<tr class="gradeX">
{% ifequal session_role_id 2 %}
<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>
{% endifequal %}
<td class="text-center"> {{ post.name }} </td>
{% ifequal session_role_id 2 %}
<td class="text-center"> <a href="/jasset/idc_detail/?id={{ post.id }}">{{ post.asset_set.count }}</a> </td>
{% else %}
<td class="text-center"> <a href="/jasset/idc_detail/?id={{ post.id }}">{{ post|get_idc_count:dept }}</a> </td>
{% endifequal %}
<td class="text-center"> {{ post.comment }} </td>
<td class="text-center">
<a href="/jasset/idc_detail/?id={{ post.id }}" class="iframe btn btn-xs btn-primary">详情</a>
{% ifequal session_role_id 2 %}
<a href="/jasset/idc_edit/?id={{ post.id }}" class="btn btn-xs btn-info">编辑</a>
<a href="/jasset/idc_del/?id={{ post.id }}" class="btn btn-xs btn-danger">删除</a>
{% endifequal %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="row">
<div class="col-sm-6">
{% 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="alter_button" class="btn btn-warning btn-sm" name="alter_button" value="修改" onclick="alter('contents_form')" />-->
{% endifequal %}
</div>
{% include 'paginator.html' %}
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script>
function del(form) {
var checkboxes = document.getElementById(form);
var id_list = {};
var j = 0;
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") {
id_list[j] = checkboxes.elements[i].value;
j++;
}
}
if (confirm("确定删除")) {
$.ajax({
type: "POST",
url: "/jasset/idc_del/?id=multi",
data: {"id_list": id_list, "len_list": j},
success: function (data) {
window.open("/jasset/idc_list/", "_self");
}
});
}
}
</script>
{% endblock %}
\ No newline at end of file
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for group in contacts.object_list %} {% for group in user_groups.object_list %}
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center"> <td class="text-center">
<input type="checkbox" name="selected" value="{{ group.id }}"> <input type="checkbox" name="selected" value="{{ group.id }}">
......
...@@ -109,30 +109,30 @@ ...@@ -109,30 +109,30 @@
<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 group in user|get_user_asset_group %} {# {% for group in user|get_user_asset_group %}#}
<div class="timeline-item"> {# <div class="timeline-item">#}
<div class="row"> {# <div class="row">#}
<div class="col-xs-3 date"> {# <div class="col-xs-3 date">#}
<i class="fa fa-repeat"></i> {# <i class="fa fa-repeat"></i>#}
<b><a href="/jperm/perm_list/?uid={{ user.id }}&agid={{ group.id }}">{{ group.name }}</a></b> {# <b><a href="/jperm/perm_list/?uid={{ user.id }}&agid={{ group.id }}">{{ group.name }}</a></b>#}
<br> {# <br>#}
<small class="text-navy">共: {{ group | group_asset_list_count }}台</small> {# <small class="text-navy">共: {{ group | group_asset_list_count }}台</small>#}
</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>{{ group.comment }}</strong></p> {# <p class="m-b-xs"><strong>{{ group.comment }}</strong></p>#}
<p> {# <p>#}
{% for asset in group|group_asset_list %} {# {% for asset in group|group_asset_list %}#}
{{ asset.ip }}<br> {# {{ asset.ip }}<br>#}
{% endfor %} {# {% endfor %}#}
</p> {# </p>#}
<p></p> {# <p></p>#}
</div> {# </div>#}
</div> {# </div>#}
</div> {# </div>#}
{% endfor %} {# {% endfor %}#}
{% if not user|get_user_asset_group %} {# {% if not user|get_user_asset_group %}#}
(无) {# (无)#}
{% endif %} {# {% endif %}#}
</div> </div>
</div> </div>
</div> </div>
...@@ -154,7 +154,8 @@ ...@@ -154,7 +154,8 @@
<img alt="image" class="img-circle" src="/static/img/{{ session_role_id | to_avatar }}.png"> <img alt="image" class="img-circle" src="/static/img/{{ session_role_id | to_avatar }}.png">
</a> </a>
<div class="media-body "> <div class="media-body ">
<small class="pull-right">{{ log.start_time|time_delta }}</small> {# <small class="pull-right">{{ log.start_time|time_delta }}</small>#}
<small class="pull-right">{{ log.start_time }}</small>
<strong>{{ log.user }}</strong> 登录了 <span class="text-navy">{{ log.host }}. </span><br> <strong>{{ log.user }}</strong> 登录了 <span class="text-navy">{{ log.host }}. </span><br>
<small class="text-muted">{{ log.start_time|date:"Y-m-d H:i:s" }}</small> <small class="text-muted">{{ log.start_time|date:"Y-m-d H:i:s" }}</small>
</div> </div>
...@@ -177,21 +178,18 @@ ...@@ -177,21 +178,18 @@
<img alt="image" class="img-circle" src="/static/img/{{ session_role_id | to_avatar }}.png"> <img alt="image" class="img-circle" src="/static/img/{{ session_role_id | to_avatar }}.png">
</a> </a>
<div class="media-body "> <div class="media-body ">
<small class="pull-right">{{ log.start_time|time_delta }}</small> <small class="pull-right">{{ log.start_time }}</small>
{# <small class="pull-right">{{ log.start_time|time_delta }}</small>#}
<strong>{{ log.user }}</strong> 登录了 <span class="text-navy">{{ log.host }}. </span><br> <strong>{{ log.user }}</strong> 登录了 <span class="text-navy">{{ log.host }}. </span><br>
<small class="text-muted">{{ log.start_time|date:"Y-m-d H:i:s" }}</small> <small class="text-muted">{{ log.start_time|date:"Y-m-d H:i:s" }}</small>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for user in contacts.object_list %} {% for user in users.object_list %}
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center"> <td class="text-center">
<input type="checkbox" name="selected" value="{{ user.id }}"> <input type="checkbox" name="selected" value="{{ user.id }}">
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
<td class="text-center"> {{ user.name }} </td> <td class="text-center"> {{ user.name }} </td>
<td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.group.all | group_str2 }} </td> <td class="text-center" title="{% for user_group in user.group.all %} {{ user_group.name }} {% endfor %}"> {{ user.group.all | group_str2 }} </td>
<td class="text-center"> {{ user.id | get_role }}</td> <td class="text-center"> {{ user.id | get_role }}</td>
<td class="text-center">{{ user.is_active|bool2str }}</td> <td class="text-center">{{ user.is_active | bool2str }}</td>
<td class="text-center"><a href="/juser/down_key/?id={{ user.id }}">下载</a></td> <td class="text-center"><a href="/juser/down_key/?id={{ user.id }}">下载</a></td>
<td class="text-center"> <td class="text-center">
<a href="../user_detail/?id={{ user.id }}" class="btn btn-xs btn-primary">详情</a> <a href="../user_detail/?id={{ user.id }}" class="btn btn-xs btn-primary">详情</a>
...@@ -78,7 +78,7 @@ ...@@ -78,7 +78,7 @@
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm-6">
<div class="dataTables_info" id="editable_info" role="status" aria-live="polite"> <div class="dataTables_info" id="editable_info" role="status" aria-live="polite">
Showing {{ contacts.start_index }} to {{ contacts.end_index }} of {{ p.count }} entries Showing {{ users.start_index }} to {{ users.end_index }} of {{ p.count }} entries
</div> </div>
</div> </div>
{% include 'paginator.html' %} {% include 'paginator.html' %}
...@@ -93,25 +93,27 @@ ...@@ -93,25 +93,27 @@
{% block self_head_css_js %} {% block self_head_css_js %}
<script> <script>
$(document).ready(function(){ $(document).ready(function(){
$(".iframe").on('click', function() { {# $(".iframe").on('click', function() {#}
var url = $(this).attr("value"); {# var url = $(this).attr("value");#}
$.layer({ {# $.layer({#}
type: 2, {# type: 2,#}
title: '用户详情', {# title: '用户详情',#}
maxmin: true, {# maxmin: true,#}
shift: 'top', {# shift: 'top',#}
border: [2, 0.3, '#1AB394'], {# border: [2, 0.3, '#1AB394'],#}
shade: [0.5, '#000000'], {# shade: [0.5, '#000000'],#}
shadeClose: true, {# shadeClose: true,#}
area: ['800px', '600px'], {# area: ['800px', '600px'],#}
iframe: {src: url} {# iframe: {src: url}#}
}) {# })#}
}); {# });#}
var check_array = []; var check_array = [];
$('#del_btn').click(function(){ $('#del_btn').click(function(){
if (confirm("确定删除")) { if (confirm("确定删除")) {
$(".gradeX input:checked").each(function() {check_array.push($(this).attr("value")) }); $(".gradeX input:checked").each(function() {
check_array.push($(this).attr("value"))
});
$.post("/juser/user_del_ajax/", $.post("/juser/user_del_ajax/",
{ids: check_array.join(",")}, {ids: check_array.join(",")},
function(data){ function(data){
......
...@@ -18,12 +18,10 @@ ...@@ -18,12 +18,10 @@
<li id="jasset"> <li id="jasset">
<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="group_add"><a href="/jasset/group_add/">添加资产组</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="group_list group_detail group_edit"><a href="/jasset/group_list/">查看资产组</a></li>
<li class="idc_add"><a href="/jasset/idc_add/">添加IDC</a></li> <li class="asset_add asset_add_multi"><a href="/jasset/asset_add/">添加资产</a></li>
<li class="idc_list idc_detail idc_edit"><a href="/jasset/idc_list/">查看IDC</a></li> <li class="host_list host_detail host_edit"><a href="/jasset/asset_list/">查看资产<span class="label label-info pull-right">{{ host_active_num }}/{{ host_total_num}}</span></a></li>
<li class="group_add"><a href="/jasset/group_add/">添加主机组</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">
......
...@@ -26,11 +26,11 @@ ...@@ -26,11 +26,11 @@
<img alt="image" class="img-circle" src="/static/img/a4.jpg"> <img alt="image" class="img-circle" src="/static/img/a4.jpg">
</a> </a>
<div class="media-body"> <div class="media-body">
<small class="pull-right text-navy">{{ apply.date_add|naturaltime }}</small> {# <small class="pull-right text-navy">{{ apply.date_add|naturaltime }}</small>#}
<strong>{{ apply.applyer }}</strong><br> {# <strong>{{ apply.applyer }}</strong><br>#}
<small class="text-muted">主机组: {{ apply.bisgroup|ast_to_list }}</small><br/> {# <small class="text-muted">主机组: {{ apply.bisgroup|ast_to_list }}</small><br/>#}
<small class="text-muted">主机: {{ apply.asset|ast_to_list }}</small><br/> {# <small class="text-muted">主机: {{ apply.asset|ast_to_list }}</small><br/>#}
<small class="text-muted">申请时间: {{ apply.date_add|date:"Y-m-d H:i:s" }}</small> {# <small class="text-muted">申请时间: {{ apply.date_add|date:"Y-m-d H:i:s" }}</small>#}
</div> </div>
</div> </div>
</li> </li>
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<strong class="font-bold">{{ session_user_id | to_name}} <span style="color: #8095a8"></span></strong> <strong class="font-bold">{{ session_user_id | to_name}} <span style="color: #8095a8"></span></strong>
</span> </span>
<span class="text-muted text-xs block"> <span class="text-muted text-xs block">
{{ session_role_id | to_role_name }} <b class="caret"></b> {{ session_user_id | get_role }} <b class="caret"></b>
</span> </span>
</span> </span>
</a> </a>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment