Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
J
jumpserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
jumpserver
Commits
8bf9103f
Commit
8bf9103f
authored
9 years ago
by
ibuler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改资产管理
parent
4eb78e15
Hide whitespace changes
Inline
Side-by-side
Showing
29 changed files
with
1288 additions
and
2381 deletions
+1288
-2381
AddUserAsset.py
docs/AddUserAsset.py
+7
-7
models.py
jasset/models.py
+4
-18
urls.py
jasset/urls.py
+18
-20
views.py
jasset/views.py
+474
-879
models.py
jperm/models.py
+3
-3
api.py
jumpserver/api.py
+3
-3
settings.py
jumpserver/settings.py
+2
-2
mytags.py
jumpserver/templatetags/mytags.py
+327
-313
urls.py
jumpserver/urls.py
+1
-1
views.py
juser/views.py
+6
-8
base.js
static/js/base.js
+11
-11
index.html
templates/index.html
+2
-2
asset_add.html
templates/jasset/asset_add.html
+49
-90
asset_detail.html
templates/jasset/asset_detail.html
+64
-87
asset_edit.html
templates/jasset/asset_edit.html
+165
-0
asset_list.html
templates/jasset/asset_list.html
+48
-43
group_add.html
templates/jasset/group_add.html
+33
-56
group_list.html
templates/jasset/group_list.html
+12
-20
host_edit.html
templates/jasset/host_edit.html
+0
-229
idc_add.html
templates/jasset/idc_add.html
+0
-80
idc_detail.html
templates/jasset/idc_detail.html
+0
-212
idc_edit.html
templates/jasset/idc_edit.html
+0
-110
idc_list.html
templates/jasset/idc_list.html
+0
-126
group_list.html
templates/juser/group_list.html
+1
-1
user_detail.html
templates/juser/user_detail.html
+28
-30
user_list.html
templates/juser/user_list.html
+20
-18
nav.html
templates/nav.html
+4
-6
nav_bar_header.html
templates/nav_bar_header.html
+5
-5
nav_li_profile.html
templates/nav_li_profile.html
+1
-1
No files found.
docs/AddUserAsset.py
View file @
8bf9103f
...
...
@@ -127,14 +127,14 @@ def test_add_log():
if
__name__
==
'__main__'
:
install
()
test_add_dept
()
test_add_group
()
test_add_user
()
test_add_idc
()
test_add_asset_group
()
#
install()
#
test_add_dept()
#
test_add_group()
#
test_add_user()
#
test_add_idc()
#
test_add_asset_group()
test_add_asset
()
test_add_log
()
#
test_add_log()
...
...
This diff is collapsed.
Click to expand it.
jasset/models.py
View file @
8bf9103f
...
...
@@ -3,15 +3,7 @@ from django.db import models
from
juser.models
import
User
,
UserGroup
class
IDC
(
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
):
class
AssetGroup
(
models
.
Model
):
GROUP_TYPE
=
(
(
'P'
,
'PRIVATE'
),
(
'A'
,
'ASSET'
),
...
...
@@ -67,17 +59,12 @@ class BisGroup(models.Model):
class
Asset
(
models
.
Model
):
LOGIN_TYPE_CHOICES
=
(
(
'L'
,
'LDAP'
),
(
'M'
,
'MAP'
),
)
ip
=
models
.
IPAddressField
(
unique
=
True
)
port
=
models
.
IntegerField
(
max_length
=
6
)
idc
=
models
.
ForeignKey
(
IDC
)
bis_group
=
models
.
ManyToManyField
(
BisGroup
)
login_type
=
models
.
CharField
(
max_length
=
1
,
choices
=
LOGIN_TYPE_CHOICES
,
default
=
'L'
)
group
=
models
.
ManyToManyField
(
AssetGroup
)
username
=
models
.
CharField
(
max_length
=
20
,
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
)
is_active
=
models
.
BooleanField
(
default
=
True
)
comment
=
models
.
CharField
(
max_length
=
100
,
blank
=
True
,
null
=
True
)
...
...
@@ -108,4 +95,4 @@ class AssetAlias(models.Model):
alias
=
models
.
CharField
(
max_length
=
100
,
blank
=
True
,
null
=
True
)
def
__unicode__
(
self
):
return
self
.
comment
\ No newline at end of file
return
self
.
alias
This diff is collapsed.
Click to expand it.
jasset/urls.py
View file @
8bf9103f
...
...
@@ -3,26 +3,23 @@ from django.conf.urls import patterns, include, url
from
jasset.views
import
*
urlpatterns
=
patterns
(
''
,
url
(
r'^host_add/$'
,
host_add
),
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'^asset_add/$'
,
asset_add
),
# url(r"^host_add_multi/$", host_add_batch),
url
(
r'^group_add/$'
,
group_add
),
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_del/(\w+)/$'
,
host_del
),
url
(
r'^host_edit/$'
,
view_splitter
,
{
'su'
:
host_edit
,
'adm'
:
host_edit_adm
}),
url
(
r'^host_edit/batch/$'
,
host_edit_batch
),
url
(
r'^host_edit_common/batch/$'
,
host_edit_common_batch
),
url
(
r'^asset_list/$'
,
asset_list
),
url
(
r'^asset_del/$'
,
asset_del
),
url
(
r"^asset_detail/$"
,
asset_detail
),
url
(
r'^asset_edit/$'
,
asset_edit
),
# 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'^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
This diff is collapsed.
Click to expand it.
jasset/views.py
View file @
8bf9103f
...
...
@@ -7,917 +7,512 @@ from django.template import RequestContext
from
django.shortcuts
import
get_object_or_404
from
jperm.models
import
Perm
from
jasset.asset_api
import
*
from
jumpserver.api
import
*
def
get_host_groups
(
groups
):
""" 获取主机所属的组类 """
ret
=
[]
for
group_id
in
groups
:
group
=
BisGroup
.
objects
.
filter
(
id
=
group_id
)
if
group
:
group
=
group
[
0
]
ret
.
append
(
group
)
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
()
@require_role
(
'admin'
)
def
group_add
(
request
):
"""
Add asset group
添加资产组
"""
header_title
,
path1
,
path2
=
u'添加资产组'
,
u'资产管理'
,
u'添加资产组'
asset_all
=
Asset
.
objects
.
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_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
)
name
=
request
.
POST
.
get
(
'name'
,
''
)
asset_select
=
request
.
POST
.
getlist
(
'asset_select'
,
[])
comment
=
request
.
POST
.
get
(
'comment'
,
''
)
try
:
if
not
name
:
error
=
u'组名不能为空'
raise
ServerError
(
error
)
@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
)
asset_group_test
=
get_object
(
AssetGroup
,
name
=
name
)
if
asset_group_test
:
error
=
u"该组名
%
s 已存在"
%
name
raise
ServerError
(
error
)
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
)
except
ServerError
:
pass
else
:
db_add_group
(
name
=
name
,
comment
=
comment
,
asset_select
=
asset_select
)
msg
=
u"主机组
%
s 添加成功"
%
name
if
is_group_admin
(
request
)
and
not
validate
(
request
,
asset_group
=
group_ids
,
edept
=
dept_ids
):
return
httperror
(
request
,
'添加失败, 没有
%
s这个主机组'
%
group_name
)
return
my_render
(
'jasset/group_add.html'
,
locals
(),
request
)
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
)
@require_role
(
'admin'
)
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'批量添加添加成功'
return
my_render
(
'jasset/host_add_multi.html'
,
locals
(),
request
)
if
keyword
:
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
def
host_edit_batch
(
request
):
""" 批量修改主机 """
@require_role
(
'admin'
)
def
asset_add
(
request
):
"""
Asset add view
添加资产
"""
header_title
,
path1
,
path2
=
u'添加资产'
,
u'资产管理'
,
u'添加资产'
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_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
)
ip
=
request
.
POST
.
get
(
'ip'
)
port
=
request
.
POST
.
get
(
'port'
)
group
=
request
.
POST
.
getlist
(
'group'
)
use_default_auth
=
True
if
request
.
POST
.
getlist
(
'use_default_auth'
,
[])
else
False
is_active
=
True
if
request
.
POST
.
get
(
'is_active'
)
else
False
comment
=
request
.
POST
.
get
(
'comment'
)
if
not
use_default_auth
:
username
=
request
.
POST
.
get
(
'username'
)
password
=
request
.
POST
.
get
(
'password'
)
password_encode
=
CRYPTOR
.
encrypt
(
password
)
else
:
username
=
None
password_encode
=
None
try
:
if
Asset
.
objects
.
filter
(
ip
=
str
(
ip
)):
error
=
u'该IP
%
s 已存在!'
%
ip
raise
ServerError
(
error
)
@require_login
def
host_list
(
request
):
""" 列出主机 """
except
ServerError
:
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'查看主机'
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
dept_id
=
get_session_user_info
(
request
)[
3
]
dept
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
did
=
request
.
GET
.
get
(
'did'
,
''
)
gid
=
request
.
GET
.
get
(
'gid'
,
''
)
gid
=
request
.
GET
.
get
(
'gid'
,
''
)
# asset group id
sid
=
request
.
GET
.
get
(
'sid'
,
''
)
user_id
=
get_session_user_info
(
request
)[
0
]
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
)
assets_list
=
Asset
.
objects
.
all
()
.
order_by
(
'ip'
)
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_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
)
if
keyword
:
assets_list
=
assets_list
.
filter
(
Q
(
ip__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
distinct
()
.
order_by
(
'ip'
)
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
def
hos
t_edit
(
request
):
@require_
role
(
role
=
'super'
)
def
asse
t_edit
(
request
):
""" 修改主机 """
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
()
header_title
,
path1
,
path2
=
u'修改资产'
,
u'资产管理'
,
u'修改资产'
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
]
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
)
asset_id
=
request
.
GET
.
get
(
'id'
,
''
)
if
not
asset_id
:
return
HttpResponse
(
'没有该主机'
)
asset
=
get_object
(
Asset
,
id
=
asset_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'
:
j_idc
=
request
.
POST
.
get
(
'j_idc'
)
j_comment
=
request
.
POST
.
get
(
'j_comment'
)
if
IDC
.
objects
.
filter
(
name
=
j_idc
):
emg
=
u'该IDC已存在!'
return
my_render
(
'jasset/idc_add.html'
,
locals
(),
request
)
else
:
smg
=
u'IDC:
%
s添加成功'
%
j_idc
IDC
.
objects
.
create
(
name
=
j_idc
,
comment
=
j_comment
)
return
my_render
(
'jasset/idc_add.html'
,
locals
(),
request
)
@require_admin
def
idc_list
(
request
):
""" 列出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
)
ip
=
request
.
POST
.
get
(
'ip'
)
port
=
request
.
POST
.
get
(
'port'
)
groups
=
request
.
POST
.
getlist
(
'groups'
)
use_default_auth
=
True
if
request
.
POST
.
getlist
(
'use_default_auth'
,
[])
else
False
is_active
=
True
if
request
.
POST
.
get
(
'is_active'
)
else
False
comment
=
request
.
POST
.
get
(
'comment'
)
if
not
use_default_auth
:
username
=
request
.
POST
.
get
(
'username'
)
password
=
request
.
POST
.
get
(
'password'
)
if
password
==
asset
.
password
:
password_encode
=
password
else
:
password_encode
=
CRYPTOR
.
encrypt
(
password
)
else
:
return
httperror
(
request
,
u'此IDC不存在'
)
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'
,
''
)
username
=
None
password_encode
=
None
try
:
if
is_group_admin
(
request
)
and
not
validate
(
request
,
asset
=
j_hosts
,
edept
=
[
j_dept
]):
emg
=
u'添加失败, 您无权操作!'
raise
RaiseError
elif
BisGroup
.
objects
.
filter
(
name
=
j_group
):
emg
=
u'添加失败, 该主机组已存在!'
raise
RaiseError
except
RaiseError
:
asset_test
=
get_object
(
Asset
,
ip
=
ip
)
if
asset_test
and
asset_id
!=
str
(
asset_test
.
id
):
error
=
u'该IP
%
s 已存在!'
%
ip
raise
ServerError
(
error
)
except
ServerError
:
pass
else
:
j_dept
=
DEPT
.
objects
.
filter
(
id
=
j_dept
)[
0
]
group
=
BisGroup
.
objects
.
create
(
name
=
j_group
,
dept
=
j_dept
,
comment
=
j_comment
)
for
host
in
j_hosts
:
g
=
Asset
.
objects
.
get
(
id
=
host
)
group
.
asset_set
.
add
(
g
)
smg
=
u'主机组
%
s 添加成功'
%
j_group
return
my_render
(
'jasset/group_add.html'
,
locals
(),
request
)
@require_admin
def
group_list
(
request
):
""" 列出主机组 """
header_title
,
path1
,
path2
=
u'查看主机组'
,
u'资产管理'
,
u'查看主机组'
dept_id
=
get_user_dept
(
request
)
dept
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
gid
=
request
.
GET
.
get
(
'gid'
)
sid
=
request
.
GET
.
get
(
'sid'
)
if
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
:
user_group
=
user_group
[
0
]
perms
=
Perm
.
objects
.
filter
(
user_group
=
user_group
)
for
perm
in
perms
:
posts
.
append
(
perm
.
asset_group
)
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
=
[]
user_group
=
UserGroup
.
objects
.
filter
(
id
=
sid
)
if
user_group
:
user_group
=
user_group
[
0
]
for
perm
in
user_group
.
sudoperm_set
.
all
():
posts
.
extend
(
perm
.
asset_group
.
all
())
posts
=
list
(
set
(
posts
))
else
:
return
httperror
(
request
,
u'没有此sudo授权!'
)
else
:
if
is_super_user
(
request
):
if
keyword
:
posts
=
BisGroup
.
objects
.
exclude
(
name
=
'ALL'
)
.
filter
(
Q
(
name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
else
:
posts
=
BisGroup
.
objects
.
exclude
(
name
=
'ALL'
)
.
order_by
(
'id'
)
elif
is_group_admin
(
request
):
if
keyword
:
posts
=
BisGroup
.
objects
.
filter
(
Q
(
name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
filter
(
dept
=
dept
)
else
:
posts
=
BisGroup
.
objects
.
filter
(
dept
=
dept
)
.
order_by
(
'id'
)
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
):
""" 修改主机组 """
header_title
,
path1
,
path2
=
u'编辑主机组'
,
u'资产管理'
,
u'编辑主机组'
group_id
=
request
.
GET
.
get
(
'id'
,
''
)
group
=
BisGroup
.
objects
.
filter
(
id
=
group_id
)
if
group
:
group
=
group
[
0
]
else
:
httperror
(
request
,
u'没有这个主机组!'
)
host_all
=
Asset
.
objects
.
all
()
dept_id
=
get_session_user_info
(
request
)[
3
]
eposts
=
Asset
.
objects
.
filter
(
bis_group
=
group
)
if
is_group_admin
(
request
)
and
not
validate
(
request
,
asset_group
=
[
group_id
]):
return
httperror
(
request
,
'编辑失败, 您无权操作!'
)
dept
=
DEPT
.
objects
.
filter
(
id
=
group
.
dept
.
id
)
if
dept
:
dept
=
dept
[
0
]
else
:
return
httperror
(
request
,
u'没有这个部门!'
)
all_dept
=
dept
.
asset_set
.
all
()
posts
=
[
g
for
g
in
all_dept
if
g
not
in
eposts
]
if
request
.
method
==
'POST'
:
j_group
=
request
.
POST
.
get
(
'j_group'
,
''
)
j_hosts
=
request
.
POST
.
getlist
(
'j_hosts'
,
''
)
j_dept
=
request
.
POST
.
get
(
'j_dept'
,
''
)
j_comment
=
request
.
POST
.
get
(
'j_comment'
,
''
)
j_dept
=
DEPT
.
objects
.
filter
(
id
=
int
(
j_dept
))
j_dept
=
j_dept
[
0
]
group
.
asset_set
.
clear
()
for
host
in
j_hosts
:
g
=
Asset
.
objects
.
get
(
id
=
host
)
group
.
asset_set
.
add
(
g
)
BisGroup
.
objects
.
filter
(
id
=
group_id
)
.
update
(
name
=
j_group
,
dept
=
j_dept
,
comment
=
j_comment
)
smg
=
u'主机组
%
s修改成功'
%
j_group
return
HttpResponseRedirect
(
'/jasset/group_list'
)
return
my_render
(
'jasset/group_edit.html'
,
locals
(),
request
)
@require_admin
def
group_detail
(
request
):
""" 主机组详情 """
header_title
,
path1
,
path2
=
u'主机组详情'
,
u'资产管理'
,
u'主机组详情'
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
dept
=
get_session_user_info
(
request
)[
5
]
group_id
=
request
.
GET
.
get
(
'id'
,
''
)
group
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
if
is_super_user
(
request
):
posts
=
Asset
.
objects
.
filter
(
bis_group
=
group
)
.
order_by
(
'ip'
)
elif
is_group_admin
(
request
):
if
not
validate
(
request
,
asset_group
=
[
group_id
]):
return
httperror
(
request
,
u'您无权查看!'
)
posts
=
Asset
.
objects
.
filter
(
bis_group
=
group
)
.
filter
(
dept
=
dept
)
.
order_by
(
'ip'
)
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
return
my_render
(
'jasset/group_detail.html'
,
locals
(),
request
)
@require_admin
def
group_del_host
(
request
):
""" 主机组中剔除主机, 并不删除真实主机 """
if
request
.
method
==
'POST'
:
group_id
=
request
.
POST
.
get
(
'group_id'
)
offset
=
request
.
GET
.
get
(
'id'
,
''
)
group
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
if
offset
==
'group'
:
len_list
=
request
.
POST
.
get
(
"len_list"
)
for
i
in
range
(
int
(
len_list
)):
key
=
"id_list["
+
str
(
i
)
+
"]"
jid
=
request
.
POST
.
get
(
key
)
g
=
Asset
.
objects
.
get
(
id
=
jid
)
group
.
asset_set
.
remove
(
g
)
else
:
offset
=
request
.
GET
.
get
(
'id'
,
''
)
group_id
=
request
.
GET
.
get
(
'gid'
,
''
)
group
=
BisGroup
.
objects
.
get
(
id
=
group_id
)
g
=
Asset
.
objects
.
get
(
id
=
offset
)
group
.
asset_set
.
remove
(
g
)
return
HttpResponseRedirect
(
'/jasset/group_detail/?id=
%
s'
%
group
.
id
)
@require_admin
def
group_del
(
request
):
""" 删除主机组 """
offset
=
request
.
GET
.
get
(
'id'
,
''
)
if
offset
==
'multi'
:
len_list
=
request
.
POST
.
get
(
"len_list"
)
for
i
in
range
(
int
(
len_list
)):
key
=
"id_list["
+
str
(
i
)
+
"]"
gid
=
request
.
POST
.
get
(
key
)
if
is_group_admin
(
request
)
and
not
validate
(
request
,
asset_group
=
[
gid
]):
return
httperror
(
request
,
'删除失败, 您无权删除!'
)
BisGroup
.
objects
.
filter
(
id
=
gid
)
.
delete
()
else
:
gid
=
int
(
offset
)
if
is_group_admin
(
request
)
and
not
validate
(
request
,
asset_group
=
[
gid
]):
return
httperror
(
request
,
'删除失败, 您无权删除!'
)
BisGroup
.
objects
.
filter
(
id
=
gid
)
.
delete
()
return
HttpResponseRedirect
(
'/jasset/group_list/'
)
@require_admin
def
dept_host_ajax
(
request
):
""" 添加主机组时, 部门联动主机异步 """
dept_id
=
request
.
GET
.
get
(
'id'
,
''
)
if
dept_id
not
in
[
'1'
,
'2'
]:
dept
=
DEPT
.
objects
.
filter
(
id
=
dept_id
)
if
dept
:
dept
=
dept
[
0
]
hosts
=
dept
.
asset_set
.
all
()
else
:
hosts
=
Asset
.
objects
.
all
()
return
my_render
(
'jasset/dept_host_ajax.html'
,
locals
(),
request
)
def
show_all_ajax
(
request
):
""" 批量修改主机时, 部门和组全部显示 """
env
=
request
.
GET
.
get
(
'env'
,
''
)
get_id
=
request
.
GET
.
get
(
'id'
,
''
)
host
=
Asset
.
objects
.
filter
(
id
=
get_id
)
if
host
:
host
=
host
[
0
]
return
my_render
(
'jasset/show_all_ajax.html'
,
locals
(),
request
)
@require_login
def
host_search
(
request
):
""" 搜索主机 """
keyword
=
request
.
GET
.
get
(
'keyword'
)
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
dept
=
get_session_user_info
(
request
)[
5
]
post_all
=
Asset
.
objects
.
filter
(
Q
(
ip__contains
=
keyword
)
|
Q
(
idc__name__contains
=
keyword
)
|
Q
(
bis_group__name__contains
=
keyword
)
|
Q
(
comment__contains
=
keyword
))
.
distinct
()
.
order_by
(
'ip'
)
if
is_super_user
(
request
):
posts
=
post_all
elif
is_group_admin
(
request
):
posts
=
post_all
.
filter
(
dept
=
dept
)
elif
is_common_user
(
request
):
user_id
,
username
=
get_session_user_info
(
request
)[
0
:
2
]
post_perm
=
user_perm_asset_api
(
username
)
posts
=
list
(
set
(
post_all
)
&
set
(
post_perm
))
contact_list
,
p
,
contacts
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
posts
,
request
)
return
my_render
(
'jasset/host_search.html'
,
locals
(),
request
)
\ No newline at end of file
db_asset_update
(
id
=
asset_id
,
ip
=
ip
,
port
=
port
,
use_default_auth
=
use_default_auth
,
username
=
username
,
password
=
password_encode
,
is_active
=
is_active
,
comment
=
comment
)
msg
=
u'主机
%
s 修改成功'
%
ip
return
HttpResponseRedirect
(
'/jasset/asset_detail/?id=
%
s'
%
asset_id
)
return
my_render
(
'jasset/asset_edit.html'
,
locals
(),
request
)
# @require_role(role='admin')
# def host_edit_adm(request):
# """ 部门管理员修改主机 """
# header_title, path1, path2 = u'修改主机', u'资产管理', u'修改主机'
# actives = {1: u'激活', 0: u'禁用'}
# login_types = {'L': 'LDAP', 'M': 'MAP'}
# eidc = IDC.objects.all()
# dept = get_session_user_info(request)[5]
# egroup = BisGroup.objects.exclude(name='ALL').filter(dept=dept)
# host_id = request.GET.get('id', '')
# post = Asset.objects.filter(id=int(host_id))
# if post:
# post = post[0]
# else:
# return httperror(request, '没有此主机!')
#
# e_group = post.bis_group.all()
#
# if request.method == 'POST':
# j_ip = request.POST.get('j_ip')
# j_idc = request.POST.get('j_idc')
# 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]
#
# if not validate(request, asset_group=j_group, edept=j_dept):
# emg = u'修改失败,您无权操作!'
# return my_render('jasset/asset_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/asset_edit.html', locals(), request)
@require_role
(
'admin'
)
def
asset_detail
(
request
):
""" 主机详情 """
header_title
,
path1
,
path2
=
u'主机详细信息'
,
u'资产管理'
,
u'主机详情'
asset_id
=
request
.
GET
.
get
(
'id'
,
''
)
asset
=
get_object
(
Asset
,
id
=
asset_id
)
return
my_render
(
'jasset/asset_detail.html'
,
locals
(),
request
)
#
#
# @require_admin
# def group_edit(request):
# """ 修改主机组 """
# header_title, path1, path2 = u'编辑主机组', u'资产管理', u'编辑主机组'
# group_id = request.GET.get('id', '')
# group = BisGroup.objects.filter(id=group_id)
# if group:
# group = group[0]
# else:
# httperror(request, u'没有这个主机组!')
#
# host_all = Asset.objects.all()
# dept_id = get_session_user_info(request)[3]
# eposts = Asset.objects.filter(bis_group=group)
#
# if is_group_admin(request) and not validate(request, asset_group=[group_id]):
# return httperror(request, '编辑失败, 您无权操作!')
# dept = DEPT.objects.filter(id=group.dept.id)
# if dept:
# dept = dept[0]
# else:
# return httperror(request, u'没有这个部门!')
#
# all_dept = dept.asset_set.all()
# posts = [g for g in all_dept if g not in eposts]
#
# if request.method == 'POST':
# j_group = request.POST.get('j_group', '')
# j_hosts = request.POST.getlist('j_hosts', '')
# j_dept = request.POST.get('j_dept', '')
# j_comment = request.POST.get('j_comment', '')
#
# j_dept = DEPT.objects.filter(id=int(j_dept))
# j_dept = j_dept[0]
#
# group.asset_set.clear()
# for host in j_hosts:
# g = Asset.objects.get(id=host)
# group.asset_set.add(g)
# BisGroup.objects.filter(id=group_id).update(name=j_group, dept=j_dept, comment=j_comment)
# smg = u'主机组%s修改成功' % j_group
# return HttpResponseRedirect('/jasset/group_list')
#
# return my_render('jasset/group_edit.html', locals(), request)
#
#
# @require_admin
# def group_detail(request):
# """ 主机组详情 """
# header_title, path1, path2 = u'主机组详情', u'资产管理', u'主机组详情'
# login_types = {'L': 'LDAP', 'M': 'MAP'}
# dept = get_session_user_info(request)[5]
# group_id = request.GET.get('id', '')
# group = BisGroup.objects.get(id=group_id)
# if is_super_user(request):
# posts = Asset.objects.filter(bis_group=group).order_by('ip')
#
# elif is_group_admin(request):
# if not validate(request, asset_group=[group_id]):
# return httperror(request, u'您无权查看!')
# posts = Asset.objects.filter(bis_group=group).filter(dept=dept).order_by('ip')
#
# contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
# return my_render('jasset/group_detail.html', locals(), request)
#
#
# @require_admin
# def group_del_host(request):
# """ 主机组中剔除主机, 并不删除真实主机 """
# if request.method == 'POST':
# group_id = request.POST.get('group_id')
# offset = request.GET.get('id', '')
# group = BisGroup.objects.get(id=group_id)
# if offset == 'group':
# len_list = request.POST.get("len_list")
# for i in range(int(len_list)):
# key = "id_list[" + str(i) + "]"
# jid = request.POST.get(key)
# g = Asset.objects.get(id=jid)
# group.asset_set.remove(g)
#
# else:
# offset = request.GET.get('id', '')
# group_id = request.GET.get('gid', '')
# group = BisGroup.objects.get(id=group_id)
# g = Asset.objects.get(id=offset)
# group.asset_set.remove(g)
#
# return HttpResponseRedirect('/jasset/group_detail/?id=%s' % group.id)
#
#
# @require_admin
# def group_del(request):
# """ 删除主机组 """
# offset = request.GET.get('id', '')
# if offset == 'multi':
# len_list = request.POST.get("len_list")
# for i in range(int(len_list)):
# key = "id_list[" + str(i) + "]"
# gid = request.POST.get(key)
# if is_group_admin(request) and not validate(request, asset_group=[gid]):
# return httperror(request, '删除失败, 您无权删除!')
# BisGroup.objects.filter(id=gid).delete()
# else:
# gid = int(offset)
# if is_group_admin(request) and not validate(request, asset_group=[gid]):
# return httperror(request, '删除失败, 您无权删除!')
# BisGroup.objects.filter(id=gid).delete()
# return HttpResponseRedirect('/jasset/group_list/')
#
#
# @require_admin
# def dept_host_ajax(request):
# """ 添加主机组时, 部门联动主机异步 """
# dept_id = request.GET.get('id', '')
# if dept_id not in ['1', '2']:
# dept = DEPT.objects.filter(id=dept_id)
# if dept:
# dept = dept[0]
# hosts = dept.asset_set.all()
# else:
# hosts = Asset.objects.all()
#
# return my_render('jasset/dept_host_ajax.html', locals(), request)
#
#
# def show_all_ajax(request):
# """ 批量修改主机时, 部门和组全部显示 """
# env = request.GET.get('env', '')
# get_id = request.GET.get('id', '')
# host = Asset.objects.filter(id=get_id)
# if host:
# host = host[0]
# return my_render('jasset/show_all_ajax.html', locals(), request)
#
#
# @require_login
# def host_search(request):
# """ 搜索主机 """
# keyword = request.GET.get('keyword')
# login_types = {'L': 'LDAP', 'M': 'MAP'}
# dept = get_session_user_info(request)[5]
# post_all = Asset.objects.filter(Q(ip__contains=keyword) |
# Q(idc__name__contains=keyword) |
# Q(bis_group__name__contains=keyword) |
# Q(comment__contains=keyword)).distinct().order_by('ip')
# if is_super_user(request):
# posts = post_all
#
# elif is_group_admin(request):
# posts = post_all.filter(dept=dept)
#
# elif is_common_user(request):
# user_id, username = get_session_user_info(request)[0:2]
# post_perm = user_perm_asset_api(username)
# posts = list(set(post_all) & set(post_perm))
# contact_list, p, contacts, page_range, current_page, show_first, show_end = pages(posts, request)
#
# return my_render('jasset/host_search.html', locals(), request)
\ No newline at end of file
This diff is collapsed.
Click to expand it.
jperm/models.py
View file @
8bf9103f
...
...
@@ -4,12 +4,12 @@ from uuidfield import UUIDField
from
django.db
import
models
from
juser.models
import
UserGroup
from
jasset.models
import
Asset
,
Bis
Group
from
jasset.models
import
Asset
,
Asset
Group
class
Perm
(
models
.
Model
):
user_group
=
models
.
ForeignKey
(
UserGroup
)
asset_group
=
models
.
ForeignKey
(
Bis
Group
)
asset_group
=
models
.
ForeignKey
(
Asset
Group
)
def
__unicode__
(
self
):
return
'
%
s_
%
s'
%
(
self
.
user_group
.
name
,
self
.
asset_group
.
name
)
...
...
@@ -27,7 +27,7 @@ class CmdGroup(models.Model):
class
SudoPerm
(
models
.
Model
):
user_group
=
models
.
ForeignKey
(
UserGroup
)
user_runas
=
models
.
CharField
(
max_length
=
100
)
asset_group
=
models
.
ManyToManyField
(
Bis
Group
)
asset_group
=
models
.
ManyToManyField
(
Asset
Group
)
cmd_group
=
models
.
ManyToManyField
(
CmdGroup
)
comment
=
models
.
CharField
(
max_length
=
30
,
null
=
True
,
blank
=
True
)
...
...
This diff is collapsed.
Click to expand it.
jumpserver/api.py
View file @
8bf9103f
...
...
@@ -17,7 +17,7 @@ from django.core.paginator import Paginator, EmptyPage, InvalidPage
from
django.http
import
HttpResponse
,
Http404
from
django.template
import
RequestContext
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
jasset.models
import
AssetAlias
from
django.core.exceptions
import
ObjectDoesNotExist
,
MultipleObjectsReturned
...
...
@@ -177,6 +177,7 @@ def pages(post_objects, request):
else
:
show_end
=
0
# 所有对象, 分页器, 本页对象, 所有页码, 本页页码,是否显示第一页,是否显示最后一页
return
post_objects
,
paginator
,
page_objects
,
page_range
,
current_page
,
show_first
,
show_end
...
...
@@ -429,7 +430,7 @@ class PyCrypt(object):
"""
return
crypt
.
crypt
(
password
,
'$6$
%
s$'
%
salt
)
def
encrypt
(
self
,
passwd
=
None
):
def
encrypt
(
self
,
passwd
=
None
,
length
=
32
):
"""
encrypt gen password
对称加密之加密生成密码
...
...
@@ -438,7 +439,6 @@ class PyCrypt(object):
passwd
=
self
.
random_pass
()
cryptor
=
AES
.
new
(
self
.
key
,
self
.
mode
,
b
'8122ca7d906ad5e1'
)
length
=
64
try
:
count
=
len
(
passwd
)
except
TypeError
:
...
...
This diff is collapsed.
Click to expand it.
jumpserver/settings.py
View file @
8bf9103f
...
...
@@ -56,8 +56,8 @@ INSTALLED_APPS = (
'django.contrib.humanize'
,
'jumpserver'
,
'juser'
,
#
'jasset',
#
'jperm',
'jasset'
,
'jperm'
,
# 'jlog',
)
...
...
This diff is collapsed.
Click to expand it.
jumpserver/templatetags/mytags.py
View file @
8bf9103f
...
...
@@ -12,21 +12,28 @@ from jasset.models import AssetAlias
register
=
template
.
Library
()
@register.filter
(
name
=
'stamp2str'
)
def
stamp2str
(
value
):
try
:
return
time
.
strftime
(
'
%
Y/
%
m/
%
d
%
H:
%
M:
%
S'
,
time
.
localtime
(
value
))
except
AttributeError
:
return
'0000/00/00 00:00:00'
#
@register.filter(name='stamp2str')
#
def stamp2str(value):
#
try:
#
return time.strftime('%Y/%m/%d %H:%M:%S', time.localtime(value))
#
except AttributeError:
#
return '0000/00/00 00:00:00'
@register.filter
(
name
=
'int2str'
)
def
int2str
(
value
):
"""
int 转换为 str
"""
return
str
(
value
)
@register.filter
(
name
=
'get_role'
)
def
get_role
(
user_id
):
"""
根据用户id获取用户权限
"""
user_role
=
{
'SU'
:
u'超级管理员'
,
'GA'
:
u'组管理员'
,
'CU'
:
u'普通用户'
}
user
=
get_object
(
User
,
id
=
user_id
)
if
user
:
...
...
@@ -35,66 +42,69 @@ def get_role(user_id):
return
u"普通用户"
@register.filter
(
name
=
'groups_str'
)
def
groups_str
(
user_id
):
groups
=
[]
user
=
User
.
objects
.
get
(
id
=
user_id
)
for
group
in
user
.
group
.
all
():
groups
.
append
(
group
.
name
)
if
len
(
groups
)
<
3
:
return
' '
.
join
(
groups
)
else
:
return
"
%
s ..."
%
' '
.
join
(
groups
[
0
:
2
])
#
@register.filter(name='groups_str')
#
def groups_str(user_id):
#
groups = []
#
user = User.objects.get(id=user_id)
#
for group in user.group.all():
#
groups.append(group.name)
#
if len(groups) < 3:
#
return ' '.join(groups)
#
else:
#
return "%s ..." % ' '.join(groups[0:2])
#
@register.filter
(
name
=
'group_str2'
)
def
groups_str2
(
group_list
):
"""
将用户组列表转换为str
"""
if
len
(
group_list
)
<
3
:
return
' '
.
join
([
group
.
name
for
group
in
group_list
])
else
:
return
'
%
s ...'
%
' '
.
join
([
group
.
name
for
group
in
group_list
[
0
:
2
]])
@register.filter
(
name
=
'group_str2_all'
)
def
group_str2_all
(
group_list
):
group_lis
=
[]
for
i
in
group_list
:
if
str
(
i
)
!=
'ALL'
:
group_lis
.
append
(
i
)
if
len
(
group_lis
)
<
3
:
return
' '
.
join
([
group
.
name
for
group
in
group_lis
])
else
:
return
'
%
s ...'
%
' '
.
join
([
group
.
name
for
group
in
group_lis
[
0
:
2
]])
@register.filter
(
name
=
'group_dept_all'
)
def
group_dept_all
(
group_list
):
group_lis
=
[]
for
i
in
group_list
:
if
str
(
i
)
!=
'ALL'
:
group_lis
.
append
(
i
)
return
' '
.
join
([
group
.
name
for
group
in
group_lis
])
@register.filter
(
name
=
'group_manage_str'
)
def
group_manage_str
(
username
):
user
=
User
.
objects
.
get
(
username
=
username
)
group
=
user
.
user_group
.
filter
(
type
=
'M'
)
if
group
:
return
group
[
0
]
.
name
else
:
return
''
@register.filter
(
name
=
'get_item'
)
def
get_item
(
dictionary
,
key
):
return
dictionary
.
get
(
key
)
@register.filter
(
name
=
'get_login_type'
)
def
get_login_type
(
login
):
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
return
login_types
[
login
]
#
#
@register.filter(name='group_str2_all')
#
def group_str2_all(group_list):
#
group_lis = []
#
for i in group_list:
#
if str(i) != 'ALL':
#
group_lis.append(i)
#
if len(group_lis) < 3:
#
return ' '.join([group.name for group in group_lis])
#
else:
#
return '%s ...' % ' '.join([group.name for group in group_lis[0:2]])
#
#
#
@register.filter(name='group_dept_all')
#
def group_dept_all(group_list):
#
group_lis = []
#
for i in group_list:
#
if str(i) != 'ALL':
#
group_lis.append(i)
#
return ' '.join([group.name for group in group_lis])
#
#
#
@register.filter(name='group_manage_str')
#
def group_manage_str(username):
#
user = User.objects.get(username=username)
#
group = user.user_group.filter(type='M')
#
if group:
#
return group[0].name
#
else:
#
return ''
#
#
#
@register.filter(name='get_item')
#
def get_item(dictionary, key):
#
return dictionary.get(key)
#
#
#
@register.filter(name='get_login_type')
#
def get_login_type(login):
#
login_types = {'L': 'LDAP', 'M': 'MAP'}
#
return login_types[login]
@register.filter
(
name
=
'bool2str'
)
...
...
@@ -105,169 +115,171 @@ def bool2str(value):
return
u'否'
# @register.filter(name='user_readonly')
# def user_readonly(user_id):
# user = User.objects.filter(id=user_id)
# if user:
# user = user[0]
# if user.role == 'CU':
# return False
# return True
#
#
#
@register.filter(name='user_readonly')
#
#
def user_readonly(user_id):
#
#
user = User.objects.filter(id=user_id)
#
#
if user:
#
#
user = user[0]
#
#
if user.role == 'CU':
#
#
return False
#
#
return True
@register.filter
(
name
=
'members_count'
)
def
members_count
(
group_id
):
"""统计用户组下成员数量"""
group
=
get_object
(
UserGroup
,
id
=
group_id
)
if
group
:
return
group
.
user_set
.
count
()
else
:
return
0
@register.filter
(
name
=
'group_user_count'
)
def
group_user_count
(
group_id
):
group
=
UserGroup
.
objects
.
get
(
id
=
group_id
)
return
group
.
user_set
.
count
()
@register.filter
(
name
=
'dept_user_num'
)
def
dept_user_num
(
dept_id
):
dept
=
DEPT
.
objects
.
filter
(
id
=
dept_id
)
if
dept
:
dept
=
dept
[
0
]
return
dept
.
user_set
.
count
()
else
:
return
0
@register.filter
(
name
=
'dept_group_num'
)
def
dept_group_num
(
dept_id
):
dept
=
DEPT
.
objects
.
filter
(
id
=
dept_id
)
if
dept
:
dept
=
dept
[
0
]
return
dept
.
usergroup_set
.
all
()
.
count
()
else
:
return
0
@register.filter
(
name
=
'perm_count'
)
def
perm_count
(
group_id
):
group
=
UserGroup
.
objects
.
get
(
id
=
group_id
)
return
group
.
perm_set
.
count
()
@register.filter
(
name
=
'dept_asset_num'
)
def
dept_asset_num
(
dept_id
):
dept
=
DEPT
.
objects
.
filter
(
id
=
dept_id
)
if
dept
:
dept
=
dept
[
0
]
return
dept
.
asset_set
.
all
()
.
count
()
return
0
@register.filter
(
name
=
'ugrp_perm_agrp_count'
)
def
ugrp_perm_agrp_count
(
user_group_id
):
user_group
=
UserGroup
.
objects
.
filter
(
id
=
user_group_id
)
if
user_group
:
user_group
=
user_group
[
0
]
return
user_group
.
perm_set
.
all
()
.
count
()
return
0
@register.filter
(
name
=
'ugrp_sudo_agrp_count'
)
def
ugrp_sudo_agrp_count
(
user_group_id
):
user_group
=
UserGroup
.
objects
.
filter
(
id
=
user_group_id
)
asset_groups
=
[]
if
user_group
:
user_group
=
user_group
[
0
]
for
perm
in
user_group
.
sudoperm_set
.
all
():
asset_groups
.
extend
(
perm
.
asset_group
.
all
())
return
len
(
set
(
asset_groups
))
return
0
@register.filter
(
name
=
'ugrp_perm_asset_count'
)
def
ugrp_perm_asset_count
(
user_group_id
):
user_group
=
UserGroup
.
objects
.
filter
(
id
=
user_group_id
)
assets
=
[]
if
user_group
:
user_group
=
user_group
[
0
]
asset_groups
=
[
perm
.
asset_group
for
perm
in
user_group
.
perm_set
.
all
()]
for
asset_group
in
asset_groups
:
assets
.
extend
(
asset_group
.
asset_set
.
all
())
return
len
(
set
(
assets
))
@register.filter
(
name
=
'ugrp_sudo_asset_count'
)
def
ugrp_sudo_asset_count
(
user_group_id
):
user_group
=
UserGroup
.
objects
.
filter
(
id
=
user_group_id
)
asset_groups
=
[]
assets
=
[]
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
:
assets
.
extend
(
asset_group
.
asset_set
.
all
())
return
len
(
set
(
assets
))
@register.filter
(
name
=
'get_user_alias'
)
def
get_user_alias
(
post
,
user_id
):
user
=
User
.
objects
.
get
(
id
=
user_id
)
host
=
Asset
.
objects
.
get
(
id
=
post
.
id
)
alias
=
AssetAlias
.
objects
.
filter
(
user
=
user
,
host
=
host
)
if
alias
:
return
alias
[
0
]
.
alias
else
:
return
''
@register.filter
(
name
=
'group_type_to_str'
)
def
group_type_to_str
(
type_name
):
group_types
=
{
'P'
:
'用户'
,
'M'
:
'部门'
,
'A'
:
'用户组'
,
}
return
group_types
.
get
(
type_name
)
@register.filter
(
name
=
'ast_to_list'
)
def
ast_to_list
(
lis
):
ast_lis
=
ast
.
literal_eval
(
lis
)
if
len
(
ast_lis
)
<=
2
:
return
','
.
join
([
i
for
i
in
ast_lis
])
else
:
restr
=
','
.
join
([
i
for
i
in
ast_lis
[
0
:
2
]])
+
'...'
return
restr
@register.filter
(
name
=
'get_group_count'
)
def
get_group_count
(
post
,
dept
):
count
=
post
.
asset_set
.
filter
(
dept
=
dept
)
.
count
()
return
count
@register.filter
(
name
=
'get_idc_count'
)
def
get_idc_count
(
post
,
dept
):
count
=
post
.
asset_set
.
filter
(
dept
=
dept
)
.
count
()
return
count
@register.filter
(
name
=
'ast_to_list_1'
)
def
ast_to_list_1
(
lis
):
return
ast
.
literal_eval
(
lis
)
@register.filter
(
name
=
'string_length'
)
def
string_length
(
string
,
length
):
return
'
%
s ...'
%
string
[
0
:
length
]
#
#
@register.filter(name='group_user_count')
#
def group_user_count(group_id):
#
group = UserGroup.objects.get(id=group_id)
#
return group.user_set.count()
#
#
#
@register.filter(name='dept_user_num')
#
def dept_user_num(dept_id):
#
dept = DEPT.objects.filter(id=dept_id)
#
if dept:
#
dept = dept[0]
#
return dept.user_set.count()
#
else:
#
return 0
#
#
#
@register.filter(name='dept_group_num')
#
def dept_group_num(dept_id):
#
dept = DEPT.objects.filter(id=dept_id)
#
if dept:
#
dept = dept[0]
#
return dept.usergroup_set.all().count()
#
else:
#
return 0
#
#
#
@register.filter(name='perm_count')
#
def perm_count(group_id):
#
group = UserGroup.objects.get(id=group_id)
#
return group.perm_set.count()
#
#
#
@register.filter(name='dept_asset_num')
#
def dept_asset_num(dept_id):
#
dept = DEPT.objects.filter(id=dept_id)
#
if dept:
#
dept = dept[0]
#
return dept.asset_set.all().count()
#
return 0
#
#
#
@register.filter(name='ugrp_perm_agrp_count')
#
def ugrp_perm_agrp_count(user_group_id):
#
user_group = UserGroup.objects.filter(id=user_group_id)
#
if user_group:
#
user_group = user_group[0]
#
return user_group.perm_set.all().count()
#
return 0
#
#
#
@register.filter(name='ugrp_sudo_agrp_count')
#
def ugrp_sudo_agrp_count(user_group_id):
#
user_group = UserGroup.objects.filter(id=user_group_id)
#
asset_groups = []
#
if user_group:
#
user_group = user_group[0]
#
for perm in user_group.sudoperm_set.all():
#
asset_groups.extend(perm.asset_group.all())
#
return len(set(asset_groups))
#
return 0
#
#
#
@register.filter(name='ugrp_perm_asset_count')
#
def ugrp_perm_asset_count(user_group_id):
#
user_group = UserGroup.objects.filter(id=user_group_id)
#
assets = []
#
if user_group:
#
user_group = user_group[0]
#
asset_groups = [perm.asset_group for perm in user_group.perm_set.all()]
#
for asset_group in asset_groups:
#
assets.extend(asset_group.asset_set.all())
#
return len(set(assets))
#
#
#
@register.filter(name='ugrp_sudo_asset_count')
#
def ugrp_sudo_asset_count(user_group_id):
#
user_group = UserGroup.objects.filter(id=user_group_id)
#
asset_groups = []
#
assets = []
#
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:
#
assets.extend(asset_group.asset_set.all())
#
return len(set(assets))
#
#
#
@register.filter(name='get_user_alias')
#
def get_user_alias(post, user_id):
#
user = User.objects.get(id=user_id)
#
host = Asset.objects.get(id=post.id)
#
alias = AssetAlias.objects.filter(user=user, host=host)
#
if alias:
#
return alias[0].alias
#
else:
#
return ''
#
#
#
@register.filter(name='group_type_to_str')
#
def group_type_to_str(type_name):
#
group_types = {
#
'P': '用户',
#
'M': '部门',
#
'A': '用户组',
#
}
#
return group_types.get(type_name)
#
#
#
@register.filter(name='ast_to_list')
#
def ast_to_list(lis):
#
ast_lis = ast.literal_eval(lis)
#
if len(ast_lis) <= 2:
#
return ','.join([i for i in ast_lis])
#
else:
#
restr = ','.join([i for i in ast_lis[0:2]]) + '...'
#
return restr
#
#
#
@register.filter(name='get_group_count')
#
def get_group_count(post, dept):
#
count = post.asset_set.filter(dept=dept).count()
#
return count
#
#
#
@register.filter(name='get_idc_count')
#
def get_idc_count(post, dept):
#
count = post.asset_set.filter(dept=dept).count()
#
return count
#
#
#
@register.filter(name='ast_to_list_1')
#
def ast_to_list_1(lis):
#
return ast.literal_eval(lis)
#
#
#
@register.filter(name='string_length')
#
def string_length(string, length):
#
return '%s ...' % string[0:length]
@register.filter
(
name
=
'to_name'
)
def
to_name
(
user_id
):
"""user id 转位用户名称"""
try
:
user
=
User
.
objects
.
filter
(
id
=
int
(
user_id
))
if
user
:
...
...
@@ -277,120 +289,122 @@ def to_name(user_id):
return
'非法用户'
@register.filter
(
name
=
'to_dept_name'
)
def
to_dept_name
(
user_id
):
try
:
user
=
User
.
objects
.
filter
(
id
=
int
(
user_id
))
if
user
:
user
=
user
[
0
]
return
user
.
dept
.
name
except
:
return
'非法部门'
#
@register.filter(name='to_dept_name')
#
def to_dept_name(user_id):
#
try:
#
user = User.objects.filter(id=int(user_id))
#
if user:
#
user = user[0]
#
return user.dept.name
#
except:
#
return '非法部门'
@register.filter
(
name
=
'to_role_name'
)
def
to_role_name
(
role_id
):
"""role_id 转变为角色名称"""
role_dict
=
{
'0'
:
'普通用户'
,
'1'
:
'组管理员'
,
'2'
:
'超级管理员'
}
return
role_dict
.
get
(
str
(
role_id
),
'未知'
)
@register.filter
(
name
=
'to_avatar'
)
def
to_avatar
(
role_id
=
'0'
):
"""不同角色不同头像"""
role_dict
=
{
'0'
:
'user'
,
'1'
:
'admin'
,
'2'
:
'root'
}
return
role_dict
.
get
(
str
(
role_id
),
'user'
)
@register.filter
(
name
=
'get_user_asset_group'
)
def
get_user_asset_group
(
user
):
return
user
.
get_asset_group
()
@register.filter
(
name
=
'group_asset_list'
)
def
group_asset_list
(
group
):
return
group
.
asset_set
.
all
()
@register.filter
(
name
=
'group_asset_list_count'
)
def
group_asset_list_count
(
group
):
return
group
.
asset_set
.
all
()
.
count
()
@register.filter
(
name
=
'time_delta'
)
def
time_delta
(
time_before
):
delta
=
datetime
.
datetime
.
now
()
-
time_before
days
=
delta
.
days
if
days
:
return
"
%
s 天前"
%
days
else
:
hours
=
delta
.
seconds
/
3600
if
hours
:
return
"
%
s 小时前"
%
hours
else
:
mins
=
delta
.
seconds
/
60
if
mins
:
return
'
%
s 分钟前'
%
mins
else
:
return
'
%
s 秒前'
%
delta
.
seconds
@register.filter
(
name
=
'sudo_cmd_list'
)
def
sudo_cmd_list
(
cmd_group_id
):
cmd_group
=
CmdGroup
.
objects
.
filter
(
id
=
cmd_group_id
)
if
cmd_group
:
cmd_group
=
cmd_group
[
0
]
return
cmd_group
.
cmd
.
split
(
','
)
@register.filter
(
name
=
'sudo_cmd_count'
)
def
sudo_cmd_count
(
user_group_id
):
user_group
=
UserGroup
.
objects
.
filter
(
id
=
user_group_id
)
cmds
=
[]
if
user_group
:
user_group
=
user_group
[
0
]
cmd_groups
=
[]
for
perm
in
user_group
.
sudoperm_set
.
all
():
cmd_groups
.
extend
(
perm
.
cmd_group
.
all
())
for
cmd_group
in
cmd_groups
:
cmds
.
extend
(
cmd_group
.
cmd
.
split
(
','
))
return
len
(
set
(
cmds
))
else
:
return
0
@register.filter
(
name
=
'sudo_cmd_count'
)
def
sudo_cmd_count
(
user_group_id
):
user_group
=
UserGroup
.
objects
.
filter
(
id
=
user_group_id
)
cmds
=
[]
if
user_group
:
user_group
=
user_group
[
0
]
cmd_groups
=
[]
for
perm
in
user_group
.
sudoperm_set
.
all
():
cmd_groups
.
extend
(
perm
.
cmd_group
.
all
())
for
cmd_group
in
cmd_groups
:
cmds
.
extend
(
cmd_group
.
cmd
.
split
(
','
))
return
len
(
set
(
cmds
))
else
:
return
0
@register.filter
(
name
=
'sudo_cmd_ids'
)
def
sudo_cmd_ids
(
user_group_id
):
user_group
=
UserGroup
.
objects
.
filter
(
id
=
user_group_id
)
if
user_group
:
user_group
=
user_group
[
0
]
cmd_groups
=
[]
for
perm
in
user_group
.
sudoperm_set
.
all
():
cmd_groups
.
extend
(
perm
.
cmd_group
.
all
())
cmd_ids
=
[
str
(
cmd_group
.
id
)
for
cmd_group
in
cmd_groups
]
return
','
.
join
(
cmd_ids
)
else
:
return
'0'
@register.filter
(
name
=
'cmd_group_split'
)
def
cmd_group_split
(
cmd_group
):
return
cmd_group
.
cmd
.
split
(
','
)
#
#
#
@register.filter(name='get_user_asset_group')
#
def get_user_asset_group(user):
#
return user.get_asset_group()
#
#
#
@register.filter(name='group_asset_list')
#
def group_asset_list(group):
#
return group.asset_set.all()
#
#
#
@register.filter(name='group_asset_list_count')
#
def group_asset_list_count(group):
#
return group.asset_set.all().count()
#
#
#
@register.filter(name='time_delta')
#
def time_delta(time_before):
#
delta = datetime.datetime.now() - time_before
#
days = delta.days
#
if days:
#
return "%s 天前" % days
#
else:
#
hours = delta.seconds/3600
#
if hours:
#
return "%s 小时前" % hours
#
else:
#
mins = delta.seconds/60
#
if mins:
#
return '%s 分钟前' % mins
#
else:
#
return '%s 秒前' % delta.seconds
#
#
#
@register.filter(name='sudo_cmd_list')
#
def sudo_cmd_list(cmd_group_id):
#
cmd_group = CmdGroup.objects.filter(id=cmd_group_id)
#
if cmd_group:
#
cmd_group = cmd_group[0]
#
return cmd_group.cmd.split(',')
#
#
#
@register.filter(name='sudo_cmd_count')
#
def sudo_cmd_count(user_group_id):
#
user_group = UserGroup.objects.filter(id=user_group_id)
#
cmds = []
#
if user_group:
#
user_group = user_group[0]
#
cmd_groups = []
#
#
for perm in user_group.sudoperm_set.all():
#
cmd_groups.extend(perm.cmd_group.all())
#
#
for cmd_group in cmd_groups:
#
cmds.extend(cmd_group.cmd.split(','))
#
return len(set(cmds))
#
#
else:
#
return 0
#
#
#
@register.filter(name='sudo_cmd_count')
#
def sudo_cmd_count(user_group_id):
#
user_group = UserGroup.objects.filter(id=user_group_id)
#
cmds = []
#
if user_group:
#
user_group = user_group[0]
#
cmd_groups = []
#
for perm in user_group.sudoperm_set.all():
#
cmd_groups.extend(perm.cmd_group.all())
#
#
for cmd_group in cmd_groups:
#
cmds.extend(cmd_group.cmd.split(','))
#
return len(set(cmds))
#
else:
#
return 0
#
#
#
@register.filter(name='sudo_cmd_ids')
#
def sudo_cmd_ids(user_group_id):
#
user_group = UserGroup.objects.filter(id=user_group_id)
#
if user_group:
#
user_group = user_group[0]
#
cmd_groups = []
#
for perm in user_group.sudoperm_set.all():
#
cmd_groups.extend(perm.cmd_group.all())
#
cmd_ids = [str(cmd_group.id) for cmd_group in cmd_groups]
#
return ','.join(cmd_ids)
#
else:
#
return '0'
#
#
#
@register.filter(name='cmd_group_split')
#
def cmd_group_split(cmd_group):
#
return cmd_group.cmd.split(',')
This diff is collapsed.
Click to expand it.
jumpserver/urls.py
View file @
8bf9103f
...
...
@@ -14,7 +14,7 @@ urlpatterns = patterns('',
(
r'^file/download/$'
,
'jumpserver.views.download'
),
(
r'^error/$'
,
'jumpserver.views.httperror'
),
(
r'^juser/'
,
include
(
'juser.urls'
)),
#
(r'^jasset/', include('jasset.urls')),
(
r'^jasset/'
,
include
(
'jasset.urls'
)),
# (r'^jlog/', include('jlog.urls')),
# (r'^jperm/', include('jperm.urls')),
(
r'^node_auth/'
,
'jumpserver.views.node_auth'
),
...
...
This diff is collapsed.
Click to expand it.
juser/views.py
View file @
8bf9103f
...
...
@@ -71,7 +71,7 @@ def group_list(request):
if
keyword
:
user_group_list
=
user_group_list
.
filter
(
Q
(
name__icontains
=
keyword
)
|
Q
(
comment__icontains
=
keyword
))
contacts
,
p
,
contact
s
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
user_group_list
,
request
)
user_group_list
,
p
,
user_group
s
,
page_range
,
current_page
,
show_first
,
show_end
=
pages
(
user_group_list
,
request
)
return
my_render
(
'juser/group_list.html'
,
locals
(),
request
)
...
...
@@ -356,18 +356,18 @@ def user_list(request):
header_title
,
path1
,
path2
=
'查看用户'
,
'用户管理'
,
'用户列表'
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
gid
=
request
.
GET
.
get
(
'gid'
,
''
)
contact_list
=
User
.
objects
.
all
()
.
order_by
(
'
name'
)
users_list
=
User
.
objects
.
all
()
.
order_by
(
'user
name'
)
if
gid
:
user_group
=
UserGroup
.
objects
.
filter
(
id
=
gid
)
if
user_group
:
user_group
=
user_group
[
0
]
contact
_list
=
user_group
.
user_set
.
all
()
users
_list
=
user_group
.
user_set
.
all
()
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
(
'user
name'
)
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
)
...
...
@@ -568,8 +568,6 @@ def user_edit(request):
role
=
role_post
,
is_active
=
is_active
)
print
'#'
*
10
+
role_post
if
email_need
:
msg
=
u"""
Hi
%
s:
...
...
@@ -669,7 +667,7 @@ def change_info(request):
if
''
in
[
name
,
password
,
email
]:
error
=
'不能为空'
if
len
(
password
)
<
6
:
if
len
(
password
)
<
6
:
error
=
'密码须大于6位'
if
not
error
:
...
...
This diff is collapsed.
Click to expand it.
static/js/base.js
View file @
8bf9103f
...
...
@@ -70,17 +70,17 @@ function move(from, to, from_o, to_o) {
});
}
function
move_left
(
from
,
to
,
from_o
,
to_o
)
{
$
(
"#"
+
from
+
" option"
).
each
(
function
()
{
if
(
$
(
this
).
prop
(
"selected"
)
==
true
)
{
$
(
"#"
+
to
).
append
(
this
);
if
(
typeof
from_o
!==
'undefined'
){
$
(
"#"
+
to_o
).
append
(
$
(
"#"
+
from_o
+
" option[value='"
+
this
.
value
+
"']"
));
}
}
$
(
this
).
attr
(
"selected"
,
'true'
);
});
}
//
function move_left(from, to, from_o, to_o) {
//
$("#" + from + " option").each(function () {
//
if ($(this).prop("selected") == true) {
//
$("#" + to).append(this);
//
if( typeof from_o !== 'undefined'){
//
$("#"+to_o).append($("#"+from_o +" option[value='"+this.value+"']"));
//
}
//
}
//
$(this).attr("selected",'true');
//
});
//
}
//function move_all(from, to) {
// $("#" + from).children().each(function () {
...
...
This diff is collapsed.
Click to expand it.
templates/index.html
View file @
8bf9103f
...
...
@@ -114,8 +114,8 @@
<small
class=
"pull-right"
>
{{ perm.date_add|naturaltime }}
</small>
{% endifequal %}
<strong>
{{ perm.applyer }}
</strong>
<div>
申请 {{ perm.bisgroup|ast_to_list }} 主机组权限
</div>
<div>
申请 {{ perm.asset|ast_to_list }} 主机权限
</div>
{#
<div>
申请 {{ perm.bisgroup|ast_to_list }} 主机组权限
</div>
#}
{#
<div>
申请 {{ perm.asset|ast_to_list }} 主机权限
</div>
#}
<small
class=
"text-muted"
>
{{ perm.date_add }}
</small>
</div>
</div>
...
...
This diff is collapsed.
Click to expand it.
templates/jasset/
hos
t_add.html
→
templates/jasset/
asse
t_add.html
View file @
8bf9103f
...
...
@@ -7,7 +7,7 @@
<div
class=
"col-lg-10"
>
<div
class=
"ibox float-e-margins"
>
<div
id=
"ibox-content"
class=
"ibox-title"
>
<h5>
填写
主机
基本信息
</h5>
<h5>
填写
资产
基本信息
</h5>
<div
class=
"ibox-tools"
>
<a
class=
"collapse-link"
>
<i
class=
"fa fa-chevron-up"
></i>
...
...
@@ -15,12 +15,6 @@
<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>
...
...
@@ -31,87 +25,61 @@
<div
class=
"panel blank-panel"
>
<div
class=
"panel-options"
>
<ul
class=
"nav nav-tabs"
>
<li
class=
"active"
><a
href=
"/jasset/
hos
t_add/"
class=
"text-center"
><i
class=
"fa fa-laptop"
></i>
单台添加
</a></li>
<li
class=
"active"
><a
href=
"/jasset/
asse
t_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>
</ul>
</div>
<div
class=
"panel-body"
>
<div
class=
"tab-content"
>
<div
id=
"tab-1"
class=
"ibox float-e-margins tab-pane active"
>
{% if e
mg
%}
<div
class=
"alert alert-warning text-center"
>
{{ e
mg
}}
</div>
{% if e
rror
%}
<div
class=
"alert alert-warning text-center"
>
{{ e
rror
}}
</div>
{% endif %}
{% if
sm
g %}
<div
class=
"alert alert-success text-center"
>
{{
sm
g }}
</div>
{% if
ms
g %}
<div
class=
"alert alert-success text-center"
>
{{
ms
g }}
</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=
"
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
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"
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=
"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"
><label>
<input
type=
"radio"
id=
"L"
checked=
""
value=
"L"
name=
"j_type"
onclick=
"show(this)"
>
<i>
LDAP
</i></label></div>
<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>
<input
type=
"text"
placeholder=
"Port"
name=
"port"
class=
"form-control"
>
</div>
</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 %}
<
option
value=
"{{i.id}}"
>
{{ i }}
</option
>
{% endfor %}
</
select
>
<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"
checked=
""
value=
"1"
id=
"use_default_auth"
name=
"use_default_auth"
>
</label>
</
div
>
</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 %}
<option
type=
"checkbox"
value=
"{{ d.id }}"
>
{{ d.name }} {% if d.comment %} --- {{ d.comment }} {% endif %}
</option>
{% endfor %}
</select>
</div>
<div
class=
"form-group"
id=
"admin_account"
style=
"display: none"
>
<label
class=
"col-sm-2 control-label"
>
管理用户名
<span
class=
"red-fonts"
>
*
</span>
</label>
<div
class=
"col-sm-3"
>
<input
type=
"text"
placeholder=
"Username"
name=
"username"
class=
"form-control"
>
</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>
<label
class=
"col-sm-1 control-label"
>
密码
<span
class=
"red-fonts"
>
*
</span>
</label>
<div
class=
"col-sm-4"
>
<input
type=
"password"
placeholder=
"Password"
name=
"password"
class=
"form-control"
>
</div>
{% endifequal %}
</div>
<div
class=
"hr-line-dashed"
></div>
<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"
>
<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 %}
<option
type=
"checkbox"
value=
"{{ g.id }}"
>
{{ g.name }} {% if g.comment %} --- {{ g.comment }} {% endif %}
</option>
{% endfor %}
...
...
@@ -122,20 +90,22 @@
<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"
><label>
<input
type=
"radio"
checked=
""
value=
"1"
name=
"j_active"
>
<i>
激活
</i></label></div>
<div
class=
"radio i-checks"
><label>
<input
type=
"radio"
value=
"0"
name=
"j_active"
>
<i>
禁用
</i></label></div>
<div
class=
"radio i-checks"
>
<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
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"
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
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"col-sm-4 col-sm-offset-
5
"
>
<button
class=
"btn btn-white"
type=
"
submi
t"
>
重置
</button>
<div
class=
"col-sm-4 col-sm-offset-
2
"
>
<button
class=
"btn btn-white"
type=
"
rese
t"
>
重置
</button>
<button
class=
"btn btn-primary"
type=
"submit"
>
提交
</button>
</div>
</div>
...
...
@@ -149,17 +119,21 @@
</div>
</div>
</div>
{% endblock %}
{% block self_footer_js %}
<script>
var
showFlag
=
{};
function
show
(
o
){
showFlag
[
o
.
name
]
=
o
.
value
;
if
(
showFlag
.
j_type
==
"M"
){
document
.
getElementById
(
"a1"
).
style
.
display
=
""
;
}
else
{
document
.
getElementById
(
"a1"
).
style
.
display
=
"none"
;
}};
$
(
'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
,
...
...
@@ -167,34 +141,19 @@ $('#assetForm').validator({
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"
:
{
"ip"
:
{
rule
:
"required;check_ip"
,
tip
:
"输入IP"
,
ok
:
""
,
msg
:
{
required
:
"必须填写!"
}
},
"
j_
port"
:
{
"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
:
"至少选择一个部门"
}
}
},
valid
:
function
(
form
)
{
...
...
This diff is collapsed.
Click to expand it.
templates/jasset/
hos
t_detail.html
→
templates/jasset/
asse
t_detail.html
View file @
8bf9103f
...
...
@@ -9,14 +9,11 @@
<div
class=
"col-lg-4"
>
<div
class=
"ibox float-e-margins"
>
<div
class=
"ibox-title"
>
<span
class=
"text text-primary"
><b>
{{
pos
t.ip }}
</b></span>
<span
class=
"text text-primary"
><b>
{{
asse
t.ip }}
</b></span>
<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"
>
</ul>
<a
class=
"close-link"
>
...
...
@@ -34,55 +31,35 @@
<table
class=
"table"
>
<tr>
<td
class=
"text-navy"
>
IP
</td>
<td>
{{
pos
t.ip }}
</td>
<td>
{{
asse
t.ip }}
</td>
</tr>
<tr>
<td
class=
"text-navy"
>
端口
</td>
<td>
{{ post.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>
<td>
{{ asset.port }}
</td>
</tr>
<tr>
<td
class=
"text-navy"
>
部门
</td>
<td
class=
"text-navy"
>
主机组
</td>
<td>
<table
class=
"table"
>
{% for dept in post.dept.all %}
<tr>
<td>
{{ dept.name }}
</td>
</tr>
{% endfor %}
</table>
</td>
</tr>
<tr>
<td
class=
"text-navy"
>
主机组
</td>
<td>
<table
class=
"table"
>
{% for group in post.bis_group.all %}
<tr>
<td>
{{ group.name }}
</td>
</tr>
{% endfor %}
</table>
</td>
<td
class=
"text-navy"
>
使用默认管理账号
</td>
<td>
{{ asset.use_default_auth|bool2str }}
</td>
</tr>
<tr>
<td
class=
"text-navy"
>
激活
</td>
<td>
{{
pos
t.is_active|bool2str }}
</td>
<td>
{{
asse
t.is_active|bool2str }}
</td>
</tr>
<tr>
<td
class=
"text-navy"
>
添加日期
</td>
<td>
{{
pos
t.date_added|date:"Y-m-d H:i:s" }}
</td>
<td>
{{
asse
t.date_added|date:"Y-m-d H:i:s" }}
</td>
</tr>
<tr>
<td
class=
"text-navy"
>
备注
</td>
<td>
{{
pos
t.comment }}
</td>
<td>
{{
asse
t.comment }}
</td>
</tr>
</table>
</div>
...
...
@@ -116,17 +93,17 @@
<div>
<div
class=
"text-left"
>
<table
class=
"table"
>
{% if user_permed_list %
}
{% for user in user_permed_list %
}
<tr>
<td
class=
"text-navy"
>
{{ user.name }}
</td>
<td>
{{ user.dept.name }}
</td>
<td><a
href=
"/juser/user_detail/?id={{ user.id }}"
>
详情
</a></td>
</tr>
{% endfor %
}
{% else %
}
<p
class=
"text-center"
>
(暂无)
</p>
{% endif %
}
{# {% if user_permed_list %}#
}
{# {% for user in user_permed_list %}#
}
{#
<tr>
#}
{#
<td
class=
"text-navy"
>
{{ user.name }}
</td>
#}
{#
<td>
{{ user.dept.name }}
</td>
#}
{#
<td><a
href=
"/juser/user_detail/?id={{ user.id }}"
>
详情
</a></td>
#}
{#
</tr>
#}
{# {% endfor %}#
}
{# {% else %}#
}
{#
<p
class=
"text-center"
>
(暂无)
</p>
#}
{# {% endif %}#
}
</table>
</div>
</div>
...
...
@@ -157,49 +134,49 @@
<small><i
class=
"fa fa-map-marker"
></i>
此主机最近一周用户登录信息.
</small>
</div>
<div
class=
"ibox-content inspinia-timeline"
>
{% if log %
}
{% for l in log %
}
<div
class=
"timeline-item"
>
<div
class=
"row"
>
<div
class=
"col-xs-5 date"
>
<i
class=
"fa fa-info-circle"
></i>
<small
class=
"text-navy"
>
{{ l.user }}
</small>
<br/>
<strong>
{{l.dept_name}}
</strong>
</div>
<div
class=
"col-xs-7 content no-top-border"
>
<p
class=
"m-b-xs"
><strong>
详细信息
</strong></p>
<p>
来源IP: {{ l.remote_ip }}
</p>
<p>
开始: {{ l.start_time |date:"Y-m-d H:i:s" }}
</p>
<p>
结束: {{ l.end_time |date:"Y-m-d H:i:s" }}
</p>
</div>
</div>
</div>
{% endfor %
}
<button
id=
"show"
class=
"btn btn-primary btn-block m-t"
><i
class=
"fa fa-arrow-down"
></i>
所有
</button>
<div
id=
'more'
style=
"display: none"
>
<br/>
{% for l in log_more %
}
<div
class=
"timeline-item"
>
<div
class=
"row"
>
<div
class=
"col-xs-5 date"
>
<i
class=
"fa fa-info-circle"
></i>
<small
class=
"text-navy"
>
{{ l.user }}
</small>
<br/>
<strong>
{{l.dept_name}}
</strong>
</div>
<div
class=
"col-xs-7 content no-top-border"
>
<p
class=
"m-b-xs"
><strong>
详细信息
</strong></p>
<p>
来源IP: {{ l.remote_ip }}
</p>
<p>
开始: {{ l.start_time |date:"Y-m-d H:i:s" }}
</p>
<p>
结束: {{ l.end_time |date:"Y-m-d H:i:s" }}
</p>
</div>
</div>
</div>
{% endfor %
}
{% else %
}
<p
class=
"text-center"
>
(暂无)
</p>
{% endif %
}
{# {% if log %}#
}
{# {% for l in log %}#
}
{#
<div
class=
"timeline-item"
>
#}
{#
<div
class=
"row"
>
#}
{#
<div
class=
"col-xs-5 date"
>
#}
{#
<i
class=
"fa fa-info-circle"
></i>
#}
{#
<small
class=
"text-navy"
>
{{ l.user }}
</small>
#}
{#
<br/>
#}
{#
<strong>
{{l.dept_name}}
</strong>
#}
{#
</div>
#}
{#
<div
class=
"col-xs-7 content no-top-border"
>
#}
{#
<p
class=
"m-b-xs"
><strong>
详细信息
</strong></p>
#}
{#
<p>
来源IP: {{ l.remote_ip }}
</p>
#}
{#
<p>
开始: {{ l.start_time |date:"Y-m-d H:i:s" }}
</p>
#}
{#
<p>
结束: {{ l.end_time |date:"Y-m-d H:i:s" }}
</p>
#}
{#
</div>
#}
{#
</div>
#}
{#
</div>
#}
{# {% endfor %}#
}
{#
<button
id=
"show"
class=
"btn btn-primary btn-block m-t"
><i
class=
"fa fa-arrow-down"
></i>
所有
</button>
#}
{#
<div
id=
'more'
style=
"display: none"
>
#}
{#
<br/>
#}
{# {% for l in log_more %}#
}
{#
<div
class=
"timeline-item"
>
#}
{#
<div
class=
"row"
>
#}
{#
<div
class=
"col-xs-5 date"
>
#}
{#
<i
class=
"fa fa-info-circle"
></i>
#}
{#
<small
class=
"text-navy"
>
{{ l.user }}
</small>
#}
{#
<br/>
#}
{#
<strong>
{{l.dept_name}}
</strong>
#}
{#
</div>
#}
{#
<div
class=
"col-xs-7 content no-top-border"
>
#}
{#
<p
class=
"m-b-xs"
><strong>
详细信息
</strong></p>
#}
{#
<p>
来源IP: {{ l.remote_ip }}
</p>
#}
{#
<p>
开始: {{ l.start_time |date:"Y-m-d H:i:s" }}
</p>
#}
{#
<p>
结束: {{ l.end_time |date:"Y-m-d H:i:s" }}
</p>
#}
{#
</div>
#}
{#
</div>
#}
{#
</div>
#}
{# {% endfor %}#
}
{# {% else %}#
}
{#
<p
class=
"text-center"
>
(暂无)
</p>
#}
{# {% endif %}#
}
</div>
</div>
...
...
This diff is collapsed.
Click to expand it.
templates/jasset/asset_edit.html
0 → 100644
View file @
8bf9103f
{% 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
This diff is collapsed.
Click to expand it.
templates/jasset/
hos
t_list.html
→
templates/jasset/
asse
t_list.html
View file @
8bf9103f
...
...
@@ -16,12 +16,6 @@
<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>
...
...
@@ -30,14 +24,14 @@
<div
class=
"ibox-content"
>
<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"
>
<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=
"button"
class=
"btn btn-sm btn-primary"
onclick=
"host_search()
"
>
Search
<button
type=
"submit"
class=
"btn btn-sm btn-primary
"
>
- 搜索 -
</button>
</div>
</div>
...
...
@@ -48,37 +42,35 @@
<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"
>
<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"
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"
name=
"j_comment"
>
备注
</th>
<th
class=
"text-center"
>
使用默认管理
</th>
<th
class=
"text-center"
>
激活
</th>
<th
class=
"text-center"
name=
"comment"
>
备注
</th>
<th
class=
"text-center"
>
操作
</th>
</tr>
</thead>
<tbody>
{% for
post in contac
ts.object_list %}
{% for
asset in asse
ts.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" id="j_dept_{{post.id}}" name="j_dept" onclick="show_all('dept', '{{post.id}}')">{{ 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" 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"
name=
"j_active"
>
{{ post.is_active|bool2str }}
</td>
<td
class=
"text-center"
name=
"j_comment"
>
{{ post.comment }}
</td>
<td
class=
"text-center"
name=
"id"
value=
"{{ asset.id }}"
data-editable=
'false'
>
<input
name=
"id"
value=
"{{ asset.id }}"
type=
"checkbox"
class=
"i-checks"
>
</td>
<td
class=
"text-center"
>
{{ asset.ip }}
</td>
<td
class=
"text-center"
>
{{ asset.port }}
</td>
<td
class=
"text-center"
>
{{ asset.port }}
</td>
<td
class=
"text-center"
>
{{ asset.use_default_auth|bool2str }}
</td>
<td
class=
"text-center"
>
{{ asset.is_active|bool2str }}
</td>
<td
class=
"text-center"
>
{{ asset.comment }}
</td>
<td
class=
"text-center"
data-editable=
'false'
>
<a
href=
"/jasset/
host_detail/?id={{ pos
t.id }}"
class=
"btn btn-xs btn-primary"
>
详情
</a>
<a
href=
"/jasset/
asset_detail/?id={{ asse
t.id }}"
class=
"btn btn-xs btn-primary"
>
详情
</a>
{% ifnotequal session_role_id 0 %}
<a
href=
"/jasset/
host_edit/?id={{ pos
t.id }}"
class=
"btn btn-xs btn-info"
>
编辑
</a>
<a
href=
"/jasset/host_del/{{ post.id }}"
class=
"btn btn-xs btn-danger
"
>
删除
</a>
<a
href=
"/jasset/
asset_edit/?id={{ asse
t.id }}"
class=
"btn btn-xs btn-info"
>
编辑
</a>
<a
value=
"/jasset/asset_del/?id={{ asset.id }}"
class=
"btn btn-xs btn-danger asset_del
"
>
删除
</a>
{% endifnotequal %}
</td>
</tr>
...
...
@@ -98,7 +90,9 @@
</div>
</div>
</div>
{% endblock %}
{% block self_footer_js %}
<script>
$
(
'table td'
).
on
(
'change'
,
function
(
env
,
id
){
var
url
=
"/jasset/show_all_ajax/?env="
+
env
+
"&id="
+
id
;
...
...
@@ -111,10 +105,21 @@
$
(
"#j_dept_"
+
id
).
html
(
data
);
}
});
})
})
;
$
(
document
).
ready
(
function
(){
$
(
'#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 @@
}
}
function
host_search
(){
$
.
ajax
({
type
:
"GET"
,
url
:
"/jasset/search/"
,
data
:
$
(
"#search_form"
).
serialize
(),
success
:
function
(
data
)
{
$
(
"#contents_form"
).
html
(
data
);
}
});
}
{
#
function
host_search
(){
#
}
{
#
$
.
ajax
({
#
}
{
#
type
:
"GET"
,
#
}
{
#
url
:
"/jasset/search/"
,
#
}
{
#
data
:
$
(
"#search_form"
).
serialize
(),
#
}
{
#
success
:
function
(
data
)
{
#
}
{
#
$
(
"#contents_form"
).
html
(
data
);
#
}
{
#
}
#
}
{
#
});
#
}
{
#
}
#
}
$
(
"#search_input"
).
keydown
(
function
(
e
){
if
(
e
.
keyCode
==
13
){
host_search
()
}
})
})
;
function
show_all
(
env
,
id
)
{
var
url
=
"/jasset/show_all_ajax/?env="
+
env
+
"&id="
+
id
;
...
...
This diff is collapsed.
Click to expand it.
templates/jasset/group_add.html
View file @
8bf9103f
...
...
@@ -22,7 +22,7 @@
<div
class=
"col-lg-10"
>
<div
class=
"ibox float-e-margins"
>
<div
id=
"ibox-content"
class=
"ibox-title"
>
<h5>
填写
主机
组基本信息
</h5>
<h5>
填写
资产
组基本信息
</h5>
<div
class=
"ibox-tools"
>
<a
class=
"collapse-link"
>
<i
class=
"fa fa-chevron-up"
></i>
...
...
@@ -30,64 +30,38 @@
<a
class=
"dropdown-toggle"
data-toggle=
"dropdown"
href=
"#"
>
<i
class=
"fa fa-wrench"
></i>
</a>
<ul
class=
"dropdown-menu dropdown-user"
>
<li><a
href=
"#"
>
未启用 1
</a>
</li>
<li><a
href=
"#"
>
未启用 2
</a>
</li>
</ul>
<a
class=
"close-link"
>
<i
class=
"fa fa-times"
></i>
</a>
</div>
</div>
<select
id=
"assets_total"
name=
"assets"
class=
"form-control m-b"
size=
"12"
multiple
style=
"display: none"
>
{% for asset in posts %
}
<option
value=
"{{ asset.id }}"
>
{{ asset.ip }}
</option>
{% endfor %
}
</select>
<select
id=
"asset_select_total"
name=
"j_hosts"
class=
"form-control m-b"
size=
"12"
multiple
style=
"display: none"
>
{% for asset in eposts %
}
<option
value=
"{{ asset.id }}"
>
{{ asset.ip }}
</option>
{% endfor %
}
</select>
{#
<select
id=
"assets_total"
name=
"assets"
class=
"form-control m-b"
size=
"12"
multiple
style=
"display: none"
>
#}
{# {% for asset in assets_all %}#
}
{#
<option
value=
"{{ asset.id }}"
>
{{ asset.ip }}
</option>
#}
{# {% endfor %}#
}
{#
</select>
#}
{##}
{#
<select
id=
"asset_select_total"
name=
"j_hosts"
class=
"form-control m-b"
size=
"12"
multiple
style=
"display: none"
>
#}
{# {% for asset in eposts %}#
}
{#
<option
value=
"{{ asset.id }}"
>
{{ asset.ip }}
</option>
#}
{# {% endfor %}#
}
{#
</select>
#}
<div
class=
"ibox-content"
>
{% if e
mg
%}
<div
class=
"alert alert-warning text-center"
>
{{ e
mg
}}
</div>
{% if e
rror
%}
<div
class=
"alert alert-warning text-center"
>
{{ e
rror
}}
</div>
{% endif %}
{% if
sm
g %}
<div
class=
"alert alert-success text-center"
>
{{
sm
g }}
</div>
{% if
ms
g %}
<div
class=
"alert alert-success text-center"
>
{{
ms
g }}
</div>
{% endif %}
<form
id=
"assetForm"
method=
"post"
class=
"form-horizontal"
>
<div
class=
"form-group"
><label
class=
"col-sm-2 control-label"
>
主机组名
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"col-sm-8"
name=
"group_id"
value=
"{{ post.id }}"
><input
type=
"text"
value=
"{{ group.name }}"
placeholder=
"网站"
name=
"j_group"
class=
"form-control"
></div>
</div>
{% ifequal session_role_id 2 %}
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<label
for=
"j_dept"
class=
"col-lg-2 control-label"
>
所属部门
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"col-sm-8"
>
<select
id=
"j_dept"
name=
"j_dept"
class=
"form-control m-b"
onchange=
"change_dept(this.value)"
>
{% for d in edept %}
<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
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=
"Name"
name=
"name"
class=
"form-control"
>
</div>
{% endifequal %}
</div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
...
...
@@ -108,8 +82,8 @@
<div
class=
"col-sm-4"
>
<div>
<select
id=
"assets"
name=
"assets"
class=
"form-control m-b"
size=
"12"
multiple
>
{% for
post in posts
%}
<option
value=
"{{
post.id }}"
>
{{ pos
t.ip }}
</option>
{% for
asset in asset_all
%}
<option
value=
"{{
asset.id }}"
>
{{ asse
t.ip }}
</option>
{% endfor %}
</select>
</div>
...
...
@@ -118,27 +92,30 @@
<div
class=
"col-sm-1"
>
<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
_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
class=
"col-sm-3"
>
<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
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=
"{{ j_comment }}"
placeholder=
包括web组所有主机
name=
"j_comment"
class=
"form-control"
></div>
<div
class=
"form-group"
>
<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
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"col-sm-4 col-sm-offset-
5
"
>
<button
class=
"btn btn-white"
type=
"
submi
t"
>
重置
</button>
<button
class=
"btn btn-primary"
id=
"submit_button"
type=
"submit"
onclick=
"on_submit('groups_selected') "
>
提交
</button>
<div
class=
"col-sm-4 col-sm-offset-
2
"
>
<button
class=
"btn btn-white"
type=
"
rese
t"
>
重置
</button>
<button
class=
"btn btn-primary"
type=
"submit"
onclick=
"on_submit('groups_selected') "
>
提交
</button>
</div>
</div>
</form>
...
...
This diff is collapsed.
Click to expand it.
templates/jasset/group_list.html
View file @
8bf9103f
...
...
@@ -16,12 +16,6 @@
<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>
...
...
@@ -29,14 +23,14 @@
</div>
<div
class=
"ibox-content"
>
<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"
>
<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>
...
...
@@ -47,26 +41,24 @@
<table
class=
"table table-striped table-bordered table-hover "
id=
"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"
>
<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>
</tr>
</thead>
<tbody>
{% for
post in contact
s.object_list %}
{% for
asset_group in asset_group
s.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"
>
{{ post.name }}
</td>
<td
class=
"text-center"
>
{{ post.dept.name }}
</td>
{% ifequal session_role_id 2 %}
<td
class=
"text-center"
>
<a
href=
"/jasset/group_detail/?id={{ post.id }}"
>
{{ post.asset_set.count }}
</a>
</td>
{% else %}
<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"
name=
"id"
value=
"{{ asset_group.id }}"
data-editable=
'false'
>
<input
name=
"id"
value=
"{{ post.id }}"
type=
"checkbox"
class=
"i-checks"
>
</td>
<td
class=
"text-center"
>
{{ asset_group.name }}
</td>
<td
class=
"text-center"
>
<a
href=
"/jasset/group_detail/?id={{ post.id }}"
>
{{ asset_group.asset_set.count }}
</a>
</td>
<td
class=
"text-center"
>
{{ asset_group.comment }}
</td>
<td
class=
"text-center"
>
<a
href=
"/jasset/group_detail/?id={{ post.id }}"
class=
"btn btn-xs btn-info"
>
详情
</a>
<a
href=
"/jasset/group_edit/?id={{ post.id }}"
class=
"btn btn-xs btn-info"
>
编辑
</a>
...
...
This diff is collapsed.
Click to expand it.
templates/jasset/host_edit.html
deleted
100644 → 0
View file @
4eb78e15
{% 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
This diff is collapsed.
Click to expand it.
templates/jasset/idc_add.html
deleted
100644 → 0
View file @
4eb78e15
{% 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
This diff is collapsed.
Click to expand it.
templates/jasset/idc_detail.html
deleted
100644 → 0
View file @
4eb78e15
{% 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
This diff is collapsed.
Click to expand it.
templates/jasset/idc_edit.html
deleted
100644 → 0
View file @
4eb78e15
{% 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
This diff is collapsed.
Click to expand it.
templates/jasset/idc_list.html
deleted
100644 → 0
View file @
4eb78e15
{% 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
This diff is collapsed.
Click to expand it.
templates/juser/group_list.html
View file @
8bf9103f
...
...
@@ -52,7 +52,7 @@
</tr>
</thead>
<tbody>
{% for group in
contact
s.object_list %}
{% for group in
user_group
s.object_list %}
<tr
class=
"gradeX"
>
<td
class=
"text-center"
>
<input
type=
"checkbox"
name=
"selected"
value=
"{{ group.id }}"
>
...
...
This diff is collapsed.
Click to expand it.
templates/juser/user_detail.html
View file @
8bf9103f
...
...
@@ -109,30 +109,30 @@
<small><i
class=
"fa fa-map-marker"
></i>
这里包含了用户所有的主机组和组下的主机.
</small>
</div>
<div
class=
"ibox-content inspinia-timeline"
>
{% for group in user|get_user_asset_group %
}
<div
class=
"timeline-item"
>
<div
class=
"row"
>
<div
class=
"col-xs-3 date"
>
<i
class=
"fa fa-repeat"
></i>
<b><a
href=
"/jperm/perm_list/?uid={{ user.id }}&agid={{ group.id }}"
>
{{ group.name }}
</a></b>
<br>
<small
class=
"text-navy"
>
共: {{ group | group_asset_list_count }}台
</small>
</div>
<div
class=
"col-xs-7 content no-top-border"
>
<p
class=
"m-b-xs"
><strong>
{{ group.comment }}
</strong></p>
<p>
{% for asset in group|group_asset_list %
}
{{ asset.ip }}
<br>
{% endfor %
}
</p>
<p></p>
</div>
</div>
</div>
{% endfor %
}
{% if not user|get_user_asset_group %
}
(无)
{% endif %
}
{# {% for group in user|get_user_asset_group %}#
}
{#
<div
class=
"timeline-item"
>
#}
{#
<div
class=
"row"
>
#}
{#
<div
class=
"col-xs-3 date"
>
#}
{#
<i
class=
"fa fa-repeat"
></i>
#}
{#
<b><a
href=
"/jperm/perm_list/?uid={{ user.id }}&agid={{ group.id }}"
>
{{ group.name }}
</a></b>
#}
{#
<br>
#}
{#
<small
class=
"text-navy"
>
共: {{ group | group_asset_list_count }}台
</small>
#}
{#
</div>
#}
{#
<div
class=
"col-xs-7 content no-top-border"
>
#}
{#
<p
class=
"m-b-xs"
><strong>
{{ group.comment }}
</strong></p>
#}
{#
<p>
#}
{# {% for asset in group|group_asset_list %}#
}
{# {{ asset.ip }}
<br>
#}
{# {% endfor %}#
}
{#
</p>
#}
{#
<p></p>
#}
{#
</div>
#}
{#
</div>
#}
{#
</div>
#}
{# {% endfor %}#
}
{# {% if not user|get_user_asset_group %}#
}
{# (无)#}
{# {% endif %}#
}
</div>
</div>
</div>
...
...
@@ -154,7 +154,8 @@
<img
alt=
"image"
class=
"img-circle"
src=
"/static/img/{{ session_role_id | to_avatar }}.png"
>
</a>
<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>
<small
class=
"text-muted"
>
{{ log.start_time|date:"Y-m-d H:i:s" }}
</small>
</div>
...
...
@@ -177,21 +178,18 @@
<img
alt=
"image"
class=
"img-circle"
src=
"/static/img/{{ session_role_id | to_avatar }}.png"
>
</a>
<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>
<small
class=
"text-muted"
>
{{ log.start_time|date:"Y-m-d H:i:s" }}
</small>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
...
...
This diff is collapsed.
Click to expand it.
templates/juser/user_list.html
View file @
8bf9103f
...
...
@@ -54,7 +54,7 @@
</tr>
</thead>
<tbody>
{% for user in
contact
s.object_list %}
{% for user in
user
s.object_list %}
<tr
class=
"gradeX"
>
<td
class=
"text-center"
>
<input
type=
"checkbox"
name=
"selected"
value=
"{{ user.id }}"
>
...
...
@@ -63,7 +63,7 @@
<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"
>
{{ 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=
"../user_detail/?id={{ user.id }}"
class=
"btn btn-xs btn-primary"
>
详情
</a>
...
...
@@ -78,7 +78,7 @@
<div
class=
"row"
>
<div
class=
"col-sm-6"
>
<div
class=
"dataTables_info"
id=
"editable_info"
role=
"status"
aria-live=
"polite"
>
Showing {{
contacts.start_index }} to {{ contact
s.end_index }} of {{ p.count }} entries
Showing {{
users.start_index }} to {{ user
s.end_index }} of {{ p.count }} entries
</div>
</div>
{% include 'paginator.html' %}
...
...
@@ -93,25 +93,27 @@
{% block self_head_css_js %}
<script>
$
(
document
).
ready
(
function
(){
$
(
".iframe"
).
on
(
'click'
,
function
()
{
var
url
=
$
(
this
).
attr
(
"value"
);
$
.
layer
({
type
:
2
,
title
:
'用户详情'
,
maxmin
:
true
,
shift
:
'top'
,
border
:
[
2
,
0.3
,
'#1AB394'
],
shade
:
[
0.5
,
'#000000'
],
shadeClose
:
true
,
area
:
[
'800px'
,
'600px'
],
iframe
:
{
src
:
url
}
})
});
{
#
$
(
".iframe"
).
on
(
'click'
,
function
()
{
#
}
{
#
var
url
=
$
(
this
).
attr
(
"value"
);
#
}
{
#
$
.
layer
({
#
}
{
#
type
:
2
,
#
}
{
#
title
:
'用户详情'
,
#
}
{
#
maxmin
:
true
,
#
}
{
#
shift
:
'top'
,
#
}
{
#
border
:
[
2
,
0.3
,
'#1AB394'
],
#
}
{
#
shade
:
[
0.5
,
'#000000'
],
#
}
{
#
shadeClose
:
true
,
#
}
{
#
area
:
[
'800px'
,
'600px'
],
#
}
{
#
iframe
:
{
src
:
url
}
#
}
{
#
})
#
}
{
#
});
#
}
var
check_array
=
[];
$
(
'#del_btn'
).
click
(
function
(){
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/"
,
{
ids
:
check_array
.
join
(
","
)},
function
(
data
){
...
...
This diff is collapsed.
Click to expand it.
templates/nav.html
View file @
8bf9103f
...
...
@@ -18,12 +18,10 @@
<li
id=
"jasset"
>
<a><i
class=
"fa fa-cube"
></i>
<span
class=
"nav-label"
>
资产管理
</span><span
class=
"fa arrow"
></span></a>
<ul
class=
"nav nav-second-level"
>
<li
class=
"host_add host_add_multi"
><a
href=
"/jasset/host_add/"
>
添加资产
</a></li>
<li
class=
"host_list host_detail host_edit"
><a
href=
"/jasset/host_list/"
>
查看资产
<span
class=
"label label-info pull-right"
>
{{ host_active_num }}/{{ host_total_num}}
</span></a></li>
<li
class=
"idc_add"
><a
href=
"/jasset/idc_add/"
>
添加IDC
</a></li>
<li
class=
"idc_list idc_detail idc_edit"
><a
href=
"/jasset/idc_list/"
>
查看IDC
</a></li>
<li
class=
"group_add"
><a
href=
"/jasset/group_add/"
>
添加主机组
</a></li>
<li
class=
"group_list group_detail group_edit"
><a
href=
"/jasset/group_list/"
>
查看主机组
</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>
<li
class=
"asset_add asset_add_multi"
><a
href=
"/jasset/asset_add/"
>
添加资产
</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>
</ul>
</li>
<li
id=
"jperm"
>
...
...
This diff is collapsed.
Click to expand it.
templates/nav_bar_header.html
View file @
8bf9103f
...
...
@@ -26,11 +26,11 @@
<img
alt=
"image"
class=
"img-circle"
src=
"/static/img/a4.jpg"
>
</a>
<div
class=
"media-body"
>
<small
class=
"pull-right text-navy"
>
{{ apply.date_add|naturaltime }}
</small>
<strong>
{{ apply.applyer }}
</strong><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.date_add|date:"Y-m-d H:i:s" }}
</small>
{#
<small
class=
"pull-right text-navy"
>
{{ apply.date_add|naturaltime }}
</small>
#}
{#
<strong>
{{ apply.applyer }}
</strong><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.date_add|date:"Y-m-d H:i:s" }}
</small>
#}
</div>
</div>
</li>
...
...
This diff is collapsed.
Click to expand it.
templates/nav_li_profile.html
View file @
8bf9103f
...
...
@@ -10,7 +10,7 @@
<strong
class=
"font-bold"
>
{{ session_user_id | to_name}}
<span
style=
"color: #8095a8"
></span></strong>
</span>
<span
class=
"text-muted text-xs block"
>
{{ session_
role_id | to_role_nam
e }}
<b
class=
"caret"
></b>
{{ session_
user_id | get_rol
e }}
<b
class=
"caret"
></b>
</span>
</span>
</a>
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment