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
d6171f7f
Commit
d6171f7f
authored
Apr 18, 2015
by
ibuler
Browse files
Options
Browse Files
Download
Plain Diff
merge
parents
9acba2dd
75e1ea7f
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
487 additions
and
242 deletions
+487
-242
views.py
jasset/views.py
+0
-0
views.py
jlog/views.py
+18
-9
views.py
jperm/views.py
+35
-25
views.py
jumpserver/views.py
+24
-83
base.js
static/js/base.js
+4
-1
group_add.html
templates/jasset/group_add.html
+78
-34
group_detail.html
templates/jasset/group_detail.html
+72
-1
group_edit.html
templates/jasset/group_edit.html
+100
-37
idc_detail.html
templates/jasset/idc_detail.html
+72
-1
perm_apply.html
templates/jperm/perm_apply.html
+84
-32
nav.html
templates/nav.html
+0
-19
No files found.
jasset/views.py
View file @
d6171f7f
This diff is collapsed.
Click to expand it.
jlog/views.py
View file @
d6171f7f
...
...
@@ -21,6 +21,7 @@ CONF.read('%s/jumpserver.conf' % BASE_DIR)
def
get_user_info
(
request
,
offset
):
""" 获取用户信息及环境 """
env_dic
=
{
'online'
:
0
,
'offline'
:
1
}
env
=
env_dic
[
offset
]
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
...
...
@@ -33,32 +34,37 @@ def get_user_info(request, offset):
def
get_user_log
(
ret_list
):
""" 获取不同类型用户日志记录 """
request
,
keyword
,
env
,
username
,
dept_name
=
ret_list
post_all
=
Log
.
objects
.
filter
(
is_finished
=
env
)
.
order_by
(
'-start_time'
)
post_keyword_all
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
env
)
.
order_by
(
'-start_time'
)
if
is_super_user
(
request
):
if
keyword
:
posts
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
env
)
.
order_by
(
'-start_time'
)
posts
=
post_keyword_all
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
env
)
.
order_by
(
'-start_time'
)
posts
=
post_all
elif
is_group_admin
(
request
):
if
keyword
:
posts
=
Log
.
objects
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
env
)
.
filter
(
dept_name
=
dept_name
)
.
order_by
(
'-start_time'
)
posts
=
post_keyword_all
.
filter
(
dept_name
=
dept_name
)
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
env
)
.
filter
(
dept_name
=
dept_name
)
.
order_by
(
'-start_time'
)
posts
=
post_all
.
filter
(
dept_name
=
dept_name
)
elif
is_common_user
(
request
):
if
keyword
:
posts
=
Log
.
objects
.
filter
(
user
=
username
)
.
filter
(
Q
(
user__contains
=
keyword
)
|
Q
(
host__contains
=
keyword
))
\
.
filter
(
is_finished
=
env
)
.
order_by
(
'-start_time'
)
posts
=
post_keyword_all
.
filter
(
user
=
username
)
else
:
posts
=
Log
.
objects
.
filter
(
is_finished
=
env
)
.
filter
(
user
=
username
)
.
order_by
(
'-start_time'
)
posts
=
post_all
.
filter
(
user
=
username
)
return
posts
@require_login
def
log_list
(
request
,
offset
):
""" 显示日志 """
header_title
,
path1
,
path2
=
u'查看日志'
,
u'查看日志'
,
u'在线用户'
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
web_socket_host
=
CONF
.
get
(
'websocket'
,
'web_socket_host'
)
...
...
@@ -70,6 +76,7 @@ def log_list(request, offset):
@require_admin
def
log_kill
(
request
):
""" 杀掉connect进程 """
pid
=
request
.
GET
.
get
(
'id'
,
''
)
log
=
Log
.
objects
.
filter
(
pid
=
pid
)
if
log
:
...
...
@@ -85,6 +92,7 @@ def log_kill(request):
@require_login
def
log_history
(
request
):
""" 命令历史记录 """
log_id
=
request
.
GET
.
get
(
'id'
,
0
)
log
=
Log
.
objects
.
filter
(
id
=
int
(
log_id
))
if
log
:
...
...
@@ -108,6 +116,7 @@ def log_history(request):
@require_login
def
log_search
(
request
):
""" 日志搜索 """
offset
=
request
.
GET
.
get
(
'env'
,
''
)
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
posts
=
get_user_log
(
get_user_info
(
request
,
offset
))
...
...
jperm/views.py
View file @
d6171f7f
# coding: utf-8
import
sys
reload
(
sys
)
sys
.
setdefaultencoding
(
'utf8'
)
...
...
@@ -182,6 +183,7 @@ def perm_edit_adm(request):
return
HttpResponseRedirect
(
'/jperm/perm_list/'
)
return
render_to_response
(
'jperm/perm_edit.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
perm_detail
(
request
):
header_title
,
path1
,
path2
=
u'编辑授权'
,
u'授权管理'
,
u'授权详情'
...
...
@@ -225,7 +227,7 @@ def perm_asset_detail(request):
# def sudo_db_add(name, user_runas, user_groups_select, asset_groups_select, cmd_groups_select, comment):
#
user_groups_select_list, asset_groups_select_list, cmd_groups_select_list = \
# user_groups_select_list, asset_groups_select_list, cmd_groups_select_list = \
# user_asset_cmd_groups_get(user_groups_select, asset_groups_select, cmd_groups_select)
#
# sudo_perm = SudoPerm(name=name, user_runas=user_runas, comment=comment)
...
...
@@ -241,7 +243,6 @@ def unicode2str(unicode_list):
def
sudo_ldap_add
(
user_group
,
user_runas
,
asset_groups_select
,
cmd_groups_select
):
if
not
LDAP_ENABLE
:
return
True
...
...
@@ -479,6 +480,7 @@ def sudo_refresh(request):
sudo_ldap_add
(
user_group
,
user_runas
,
asset_groups_select
,
cmd_groups_select
)
return
HttpResponse
(
'ok'
)
# @require_admin
# def sudo_detail(request):
# header_title, path1, path2 = u'Sudo授权详情', u'授权管理', u'授权详情'
...
...
@@ -669,15 +671,19 @@ def cmd_detail(request):
@require_login
def
perm_apply
(
request
):
""" 权限申请 """
header_title
,
path1
,
path2
=
u'主机权限申请'
,
u'权限管理'
,
u'申请主机'
user_id
,
username
=
get_session_user_info
(
request
)[
0
:
2
]
dept_id
,
deptname
,
dept
=
get_session_user_info
(
request
)[
3
:
6
]
perm_host
=
user_perm_asset_api
(
username
)
all_host
=
Asset
.
objects
.
filter
(
dept
=
dept
)
perm_group
=
user_perm_group_api
(
username
)
all_group
=
dept
.
bisgroup_set
.
all
()
posts
=
[
g
for
g
in
all_host
if
g
not
in
perm_host
]
egroup
=
[
d
for
d
in
all_group
if
d
not
in
perm_group
]
dept_da
=
User
.
objects
.
filter
(
dept_id
=
dept_id
,
role
=
'DA'
)
if
request
.
method
==
'POST'
:
...
...
@@ -693,7 +699,8 @@ def perm_apply(request):
group_lis
=
', '
.
join
(
group
)
hosts_lis
=
', '
.
join
(
hosts
)
time_now
=
datetime
.
datetime
.
now
()
.
strftime
(
'
%
Y-
%
m-
%
d
%
H:
%
M:
%
S'
)
a
=
Apply
.
objects
.
create
(
applyer
=
applyer
,
dept
=
dept
,
bisgroup
=
group
,
date_add
=
datetime
.
datetime
.
now
(),
asset
=
hosts
,
status
=
0
,
comment
=
comment
)
a
=
Apply
.
objects
.
create
(
applyer
=
applyer
,
dept
=
dept
,
bisgroup
=
group
,
date_add
=
datetime
.
datetime
.
now
(),
asset
=
hosts
,
status
=
0
,
comment
=
comment
)
uuid
=
a
.
uuid
url
=
"http://
%
s:
%
s/jperm/apply_exec/?uuid=
%
s"
%
(
SEND_IP
,
SEND_PORT
,
uuid
)
mail_msg
=
"""
...
...
@@ -710,13 +717,14 @@ def perm_apply(request):
"""
%
(
da
.
username
,
applyer
,
group_lis
,
hosts_lis
,
time_now
,
comment
,
url
)
send_mail
(
mail_title
,
mail_msg
,
MAIL_FROM
,
[
mail_address
],
fail_silently
=
False
)
smg
=
"提交成功,已发邮件
通知部门管理员。"
smg
=
"提交成功,已发邮件
至
%
s 通知部门管理员。"
%
mail_address
return
render_to_response
(
'jperm/perm_apply.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
return
render_to_response
(
'jperm/perm_apply.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
perm_apply_exec
(
request
):
""" 确认权限 """
header_title
,
path1
,
path2
=
u'主机权限申请'
,
u'权限管理'
,
u'审批完成'
uuid
=
request
.
GET
.
get
(
'uuid'
)
user_id
=
request
.
session
.
get
(
'user_id'
)
...
...
@@ -737,7 +745,7 @@ def perm_apply_exec(request):
Hi,
%
s:
您所申请的权限已由
%
s 在
%
s 审批完成, 请登录验证。
"""
%
(
q_apply
.
applyer
,
q_apply
.
approver
,
time_now
)
send_mail
(
mail_title
,
mail_msg
,
'jkfunshion@fun.tv'
,
[
mail_address
],
fail_silently
=
False
)
send_mail
(
mail_title
,
mail_msg
,
MAIL_FROM
,
[
mail_address
],
fail_silently
=
False
)
smg
=
'授权完成, 已邮件通知申请人, 十秒钟后返回首页'
return
render_to_response
(
'jperm/perm_apply_exec.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
else
:
...
...
@@ -746,37 +754,38 @@ def perm_apply_exec(request):
def
get_apply_posts
(
request
,
status
,
username
,
dept_name
,
keyword
=
None
):
""" 获取申请记录 """
post_all
=
Apply
.
objects
.
filter
(
status
=
status
)
.
order_by
(
'-date_add'
)
post_keyword_all
=
Apply
.
objects
.
filter
(
Q
(
applyer__contains
=
keyword
)
|
Q
(
approver__contains
=
keyword
))
\
.
filter
(
status
=
status
)
.
order_by
(
'-date_add'
)
if
is_super_user
(
request
):
if
keyword
:
posts
=
Apply
.
objects
.
filter
(
Q
(
applyer__contains
=
keyword
)
|
Q
(
approver__contains
=
keyword
))
\
.
filter
(
status
=
status
)
.
order_by
(
'-date_add'
)
posts
=
post_keyword_all
else
:
posts
=
Apply
.
objects
.
filter
(
status
=
status
)
.
order_by
(
'-date_add'
)
posts
=
post_all
elif
is_group_admin
(
request
):
if
keyword
:
posts
=
Apply
.
objects
.
filter
(
Q
(
applyer__contains
=
keyword
)
|
Q
(
approver__contains
=
keyword
))
\
.
filter
(
status
=
status
)
.
filter
(
dept
=
dept_name
)
.
order_by
(
'-date_add'
)
posts
=
post_keyword_all
.
filter
(
dept
=
dept_name
)
else
:
posts
=
Apply
.
objects
.
filter
(
status
=
status
)
.
filter
(
dept
=
dept_name
)
.
order_by
(
'-date_add'
)
posts
=
post_all
.
filter
(
dept
=
dept_name
)
elif
is_common_user
(
request
):
if
keyword
:
posts
=
Apply
.
objects
.
filter
(
applyer
=
username
)
.
filter
(
status
=
status
)
.
filter
(
Q
(
applyer__contains
=
keyword
)
|
Q
(
asset__contains
=
keyword
))
.
order_by
(
'-date_add'
)
posts
=
post_keyword_all
.
filter
(
user
=
username
)
else
:
posts
=
Apply
.
objects
.
filter
(
applyer
=
username
)
.
filter
(
status
=
status
)
.
order_by
(
'-date_add'
)
posts
=
post_all
.
filter
(
user
=
username
)
return
posts
@require_login
def
perm_apply_log
(
request
,
offset
):
""" 申请记录 """
header_title
,
path1
,
path2
=
u'权限申请记录'
,
u'权限管理'
,
u'申请记录'
keyword
=
request
.
GET
.
get
(
'keyword'
)
dept_id
=
get_user_dept
(
request
)
dept_name
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
.
name
user_id
=
request
.
session
.
get
(
'user_id'
)
username
=
User
.
objects
.
get
(
id
=
user_id
)
.
username
keyword
=
request
.
GET
.
get
(
'keyword'
,
''
)
username
=
get_session_user_info
(
request
)[
1
]
dept_name
=
get_session_user_info
(
request
)[
4
]
status_dic
=
{
'online'
:
0
,
'offline'
:
1
}
status
=
status_dic
[
offset
]
posts
=
get_apply_posts
(
request
,
status
,
username
,
dept_name
,
keyword
)
...
...
@@ -786,6 +795,7 @@ def perm_apply_log(request, offset):
@require_login
def
perm_apply_info
(
request
):
""" 申请信息详情 """
uuid
=
request
.
GET
.
get
(
'uuid'
)
post
=
Apply
.
objects
.
get
(
uuid
=
uuid
)
return
render_to_response
(
'jperm/perm_apply_info.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
...
...
@@ -793,6 +803,7 @@ def perm_apply_info(request):
@require_admin
def
perm_apply_del
(
request
):
""" 删除日志记录 """
uuid
=
request
.
GET
.
get
(
'uuid'
)
u_apply
=
Apply
.
objects
.
filter
(
uuid
=
uuid
)
if
u_apply
:
...
...
@@ -802,12 +813,11 @@ def perm_apply_del(request):
@require_login
def
perm_apply_search
(
request
):
""" 申请搜索 """
keyword
=
request
.
GET
.
get
(
'keyword'
)
offset
=
request
.
GET
.
get
(
'env'
)
dept_id
=
get_user_dept
(
request
)
dept_name
=
DEPT
.
objects
.
get
(
id
=
dept_id
)
.
name
user_id
=
request
.
session
.
get
(
'user_id'
)
username
=
User
.
objects
.
get
(
id
=
user_id
)
.
username
username
=
get_session_user_info
(
request
)[
1
]
dept_name
=
get_session_user_info
(
request
)[
3
]
status_dic
=
{
'online'
:
0
,
'offline'
:
1
}
status
=
status_dic
[
offset
]
posts
=
get_apply_posts
(
request
,
status
,
username
,
dept_name
,
keyword
)
...
...
jumpserver/views.py
View file @
d6171f7f
...
...
@@ -66,90 +66,36 @@ def index_cu(request):
return
render_to_response
(
'index_cu.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
admin_index
(
request
):
user_id
=
request
.
session
.
get
(
'user_id'
,
''
)
user
=
User
.
objects
.
get
(
id
=
user_id
)
dept
=
user
.
dept
dept_name
=
user
.
dept
.
name
users
=
User
.
objects
.
filter
(
dept
=
dept
)
hosts
=
Asset
.
objects
.
filter
(
dept
=
dept
)
online
=
Log
.
objects
.
filter
(
dept_name
=
dept_name
,
is_finished
=
0
)
online_host
=
online
.
values
(
'host'
)
.
distinct
()
online_user
=
online
.
values
(
'user'
)
.
distinct
()
active_users
=
users
.
filter
(
is_active
=
1
)
active_hosts
=
hosts
.
filter
(
is_active
=
1
)
# percent of dashboard
if
users
.
count
()
==
0
:
percent_user
,
percent_online_user
=
'0
%
'
,
'0
%
'
else
:
percent_user
=
format
(
active_users
.
count
()
/
users
.
count
(),
'.0
%
'
)
percent_online_user
=
format
(
online_user
.
count
()
/
users
.
count
(),
'.0
%
'
)
if
hosts
.
count
()
==
0
:
percent_host
,
percent_online_host
=
'0
%
'
,
'0
%
'
else
:
percent_host
=
format
(
active_hosts
.
count
()
/
hosts
.
count
(),
'.0
%
'
)
percent_online_host
=
format
(
online_host
.
count
()
/
hosts
.
count
(),
'.0
%
'
)
@require_login
def
index
(
request
):
li_date
,
li_str
=
getDaysByNum
(
7
)
today
=
datetime
.
datetime
.
now
()
.
day
from_week
=
datetime
.
datetime
.
now
()
-
datetime
.
timedelta
(
days
=
7
)
week_data
=
Log
.
objects
.
filter
(
dept_name
=
dept_name
,
start_time__range
=
[
from_week
,
datetime
.
datetime
.
now
()])
user_top_ten
=
week_data
.
values
(
'user'
)
.
annotate
(
times
=
Count
(
'user'
))
.
order_by
(
'-times'
)[:
10
]
host_top_ten
=
week_data
.
values
(
'host'
)
.
annotate
(
times
=
Count
(
'host'
))
.
order_by
(
'-times'
)[:
10
]
user_dic
,
host_dic
=
get_data
(
week_data
,
user_top_ten
,
'user'
),
get_data
(
week_data
,
host_top_ten
,
'host'
)
# a week data
week_users
=
week_data
.
values
(
'user'
)
.
distinct
()
.
count
()
week_hosts
=
week_data
.
count
()
user_top_five
=
week_data
.
values
(
'user'
)
.
annotate
(
times
=
Count
(
'user'
))
.
order_by
(
'-times'
)[:
5
]
color
=
[
'label-success'
,
'label-info'
,
'label-primary'
,
'label-default'
,
'label-warnning'
]
# perm apply latest 10
perm_apply_10
=
Apply
.
objects
.
order_by
(
'-date_add'
)[:
10
]
# latest 10 login
login_10
=
Log
.
objects
.
order_by
(
'-start_time'
)[:
10
]
login_more_10
=
Log
.
objects
.
order_by
(
'-start_time'
)[
10
:
21
]
# a week top 10
for
user_info
in
user_top_ten
:
username
=
user_info
.
get
(
'user'
)
last
=
Log
.
objects
.
filter
(
user
=
username
)
.
latest
(
'start_time'
)
user_info
[
'last'
]
=
last
print
user_top_ten
top
=
{
'user'
:
'活跃用户数'
,
'host'
:
'活跃主机数'
,
'times'
:
'登录次数'
}
top_dic
=
{}
for
key
,
value
in
top
.
items
():
li
=
[]
for
t
in
li_date
:
year
,
month
,
day
=
t
.
year
,
t
.
month
,
t
.
day
if
key
!=
'times'
:
times
=
week_data
.
filter
(
start_time__year
=
year
,
start_time__month
=
month
,
start_time__day
=
day
)
.
values
(
key
)
.
distinct
()
.
count
()
else
:
times
=
week_data
.
filter
(
start_time__year
=
year
,
start_time__month
=
month
,
start_time__day
=
day
)
.
count
()
li
.
append
(
times
)
top_dic
[
value
]
=
li
return
render_to_response
(
'index.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_login
def
index
(
request
):
if
is_common_user
(
request
):
return
index_cu
(
request
)
if
is_group_admin
(
request
):
return
admin_index
(
request
)
users
=
User
.
objects
.
all
()
hosts
=
Asset
.
objects
.
all
()
online
=
Log
.
objects
.
filter
(
is_finished
=
0
)
online_host
=
online
.
values
(
'host'
)
.
distinct
()
online_user
=
online
.
values
(
'user'
)
.
distinct
()
active_users
=
User
.
objects
.
filter
(
is_active
=
1
)
active_hosts
=
Asset
.
objects
.
filter
(
is_active
=
1
)
elif
is_super_user
(
request
):
users
=
User
.
objects
.
all
()
hosts
=
Asset
.
objects
.
all
()
online
=
Log
.
objects
.
filter
(
is_finished
=
0
)
online_host
=
online
.
values
(
'host'
)
.
distinct
()
online_user
=
online
.
values
(
'user'
)
.
distinct
()
active_users
=
User
.
objects
.
filter
(
is_active
=
1
)
active_hosts
=
Asset
.
objects
.
filter
(
is_active
=
1
)
week_data
=
Log
.
objects
.
filter
(
start_time__range
=
[
from_week
,
datetime
.
datetime
.
now
()])
elif
is_group_admin
(
request
):
user
=
get_session_user_info
(
request
)[
2
]
dept_name
,
dept
=
get_session_user_info
(
request
)[
4
:]
users
=
User
.
objects
.
filter
(
dept
=
dept
)
hosts
=
Asset
.
objects
.
filter
(
dept
=
dept
)
online
=
Log
.
objects
.
filter
(
dept_name
=
dept_name
,
is_finished
=
0
)
online_host
=
online
.
values
(
'host'
)
.
distinct
()
online_user
=
online
.
values
(
'user'
)
.
distinct
()
active_users
=
users
.
filter
(
is_active
=
1
)
active_hosts
=
hosts
.
filter
(
is_active
=
1
)
week_data
=
Log
.
objects
.
filter
(
dept_name
=
dept_name
,
start_time__range
=
[
from_week
,
datetime
.
datetime
.
now
()])
# percent of dashboard
if
users
.
count
()
==
0
:
...
...
@@ -163,10 +109,6 @@ def index(request):
percent_host
=
format
(
active_hosts
.
count
()
/
hosts
.
count
(),
'.0
%
'
)
percent_online_host
=
format
(
online_host
.
count
()
/
hosts
.
count
(),
'.0
%
'
)
li_date
,
li_str
=
getDaysByNum
(
7
)
today
=
datetime
.
datetime
.
now
()
.
day
from_week
=
datetime
.
datetime
.
now
()
-
datetime
.
timedelta
(
days
=
7
)
week_data
=
Log
.
objects
.
filter
(
start_time__range
=
[
from_week
,
datetime
.
datetime
.
now
()])
user_top_ten
=
week_data
.
values
(
'user'
)
.
annotate
(
times
=
Count
(
'user'
))
.
order_by
(
'-times'
)[:
10
]
host_top_ten
=
week_data
.
values
(
'host'
)
.
annotate
(
times
=
Count
(
'host'
))
.
order_by
(
'-times'
)[:
10
]
user_dic
,
host_dic
=
get_data
(
week_data
,
user_top_ten
,
'user'
),
get_data
(
week_data
,
host_top_ten
,
'host'
)
...
...
@@ -180,17 +122,16 @@ def index(request):
# perm apply latest 10
perm_apply_10
=
Apply
.
objects
.
order_by
(
'-date_add'
)[:
10
]
login_more_10
=
Log
.
objects
.
order_by
(
'-start_time'
)[
10
:
20
]
# latest 10 login
login_10
=
Log
.
objects
.
order_by
(
'-start_time'
)[:
10
]
login_more_10
=
Log
.
objects
.
order_by
(
'-start_time'
)[
10
:
21
]
# a week top 10
for
user_info
in
user_top_ten
:
username
=
user_info
.
get
(
'user'
)
last
=
Log
.
objects
.
filter
(
user
=
username
)
.
latest
(
'start_time'
)
user_info
[
'last'
]
=
last
print
user_top_ten
top
=
{
'user'
:
'活跃用户数'
,
'host'
:
'活跃主机数'
,
'times'
:
'登录次数'
}
top_dic
=
{}
...
...
static/js/base.js
View file @
d6171f7f
...
...
@@ -70,10 +70,13 @@ function move(from, to, from_o, to_o) {
});
}
function
move_left
(
from
,
to
)
{
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'
);
});
...
...
templates/jasset/group_add.html
View file @
d6171f7f
...
...
@@ -2,6 +2,21 @@
{% load mytags %}
{% block content %}
{% include 'nav_cat_bar.html' %}
<script
type=
"text/javascript"
>
function
search_ip
(
text
,
noselect
,
total
){
$
(
"#"
+
noselect
).
children
().
each
(
function
(){
$
(
this
).
remove
();
});
$
(
"#"
+
total
).
children
().
each
(
function
(){
if
(
$
(
this
).
text
().
search
(
text
)
!=
-
1
){
$
(
"#"
+
noselect
).
append
(
$
(
this
).
clone
())
}
})
}
</script>
<div
class=
"wrapper wrapper-content animated fadeInRight"
>
<div
class=
"row"
>
<div
class=
"col-lg-10"
>
...
...
@@ -26,6 +41,19 @@
</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>
<div
class=
"ibox-content"
>
{% if emg %}
<div
class=
"alert alert-warning text-center"
>
{{ emg }}
</div>
...
...
@@ -63,35 +91,40 @@
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div>
<label
for=
"hosts"
class=
"col-lg-2 control-label"
>
主机
</label>
<div
class=
"col-sm-3"
>
<select
multiple=
"multiple"
id=
"id_domains_filter"
name=
"domains_filter"
style=
"display: none;"
>
</select>
<div
class=
"input-group"
style=
"padding-bottom: 5px"
>
<input
type=
"text"
size=
"19"
class=
"form-control input-sm"
id=
"search"
name=
"keyword"
placeholder=
"过滤"
>
</div>
<select
id=
"hosts"
size=
"12"
class=
"form-control m-b"
multiple
>
<label
for=
"group_name"
class=
"col-sm-2 control-label"
>
过滤
</label>
<div
class=
"col-sm-4"
>
<input
id=
"noselect"
class=
"form-control"
oninput=
"search_ip(this.value, 'assets', 'assets_total')"
>
</div>
<div
class=
"col-sm-1"
>
</div>
<div
id=
"select"
class=
"col-sm-3"
>
<input
class=
"form-control"
oninput=
"search_ip(this.value, 'asset_select', 'asset_select_total')"
>
</div>
</div>
<div
class=
"form-group"
>
<label
for=
""
class=
"col-sm-2 control-label"
>
主机
<span
class=
"red-fonts"
>
*
</span></label>
<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 }}"
>
{{ post.ip }}
</option>
<option
value=
"{{ post.id }}"
>
{{ post.ip }}
</option>
{% endfor %}
</select>
</div>
<div
class=
"col-sm-1"
>
<div
class=
"btn-group"
style=
"margin-top: 50px;"
>
<button
type=
"button"
class=
"btn btn-xm btn-white"
onclick=
"move('hosts', 'hosts_selected')"
><i
class=
"fa fa-chevron-right"
></i></button>
<button
type=
"button"
class=
"btn btn-xm btn-white"
onclick=
"move_left('hosts_selected', 'hosts')"
><i
class=
"fa fa-chevron-left"
></i></button>
</div>
</div>
<div
class=
"col-sm-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>
</div>
<div
class=
"col-sm-3"
>
<h4
style=
"padding-bottom: 5px"
>
已选中主机
</h4>
<div>
<select
id=
"hosts_selected"
name=
"j_hosts"
class=
"form-control m-b"
size=
"12"
multiple
>
{% for post in eposts %}
<option
value=
"{{ post.id }}"
>
{{ post.ip }}
</option>
{% endfor %}
</select>
</div>
</div>
<div
class=
"col-sm-3"
>
<div>
<select
id=
"asset_select"
name=
"j_hosts"
class=
"form-control m-b"
size=
"12"
multiple
></select>
</div>
</div>
</div>
...
...
@@ -105,7 +138,7 @@
<div
class=
"form-group"
>
<div
class=
"col-sm-4 col-sm-offset-5"
>
<button
class=
"btn btn-white"
type=
"submit"
>
重置
</button>
<button
class=
"btn btn-primary"
type=
"submit"
onclick=
"on_submit('groups_selected') "
>
提交
</button>
<button
class=
"btn btn-primary"
id=
"submit_button"
type=
"submit"
onclick=
"on_submit('groups_selected') "
>
提交
</button>
</div>
</div>
</form>
...
...
@@ -116,6 +149,15 @@
</div>
<script>
$
(
document
).
ready
(
function
(){
$
(
"#submit_button"
).
click
(
function
(){
$
(
'#assetForm option'
).
each
(
function
(){
$
(
this
).
prop
(
'selected'
,
true
)
})
});
})
$
(
'#assetForm'
).
validator
({
timely
:
2
,
theme
:
"yellow_right_effect"
,
...
...
@@ -140,15 +182,15 @@
})
}
$
(
'#search'
).
keyup
(
function
()
{
var
$rows
=
$
(
'#hosts option'
);
var
val
=
$
.
trim
(
$
(
this
).
val
()).
replace
(
/ +/g
,
' '
).
toLowerCase
();
$rows
.
show
().
filter
(
function
()
{
var
text
=
$
(
this
).
text
().
replace
(
/
\s
+/g
,
' '
).
toLowerCase
();
return
!~
text
.
indexOf
(
val
);
}).
hide
();
});
//
$('#search').keyup(function() {
//
var $rows = $('#hosts option');
//
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
//
//
$rows.show().filter(function() {
//
var text = $(this).text().replace(/\s+/g, ' ').toLowerCase();
//
return !~text.indexOf(val);
//
}).hide();
//
});
function
change_dept
(
dept_id
){
$
.
get
(
'/jasset/dept_host_ajax/'
,
...
...
@@ -157,6 +199,7 @@
$
(
'#hosts'
).
html
(
data
)
})
}
</script>
{% endblock %}
\ No newline at end of file
templates/jasset/group_detail.html
View file @
d6171f7f
...
...
@@ -75,7 +75,78 @@
<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>
{% include 'paginator.html' %}
<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={{ group.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={{ group.id }}"
title=
"第{{ page }}页"
>
{{ page }}
</a></li>
{% else %}
<li
class=
"paginate_button"
aria-controls=
"editable"
tabindex=
"0"
><a
href=
"?keyword={{ keyword }}&page={{ page }}&id={{ group.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={{ group.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={{ group.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={{ group.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={{ group.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={{ group.id }}"
title=
"第{{ page }}页"
>
{{ page }}
</a></li>
{% else %}
<li
class=
"paginate_button"
aria-controls=
"editable"
tabindex=
"0"
><a
href=
"?page={{ page }}&id={{ group.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={{ group.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={{ group.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>
...
...
templates/jasset/group_edit.html
View file @
d6171f7f
...
...
@@ -2,13 +2,58 @@
{% load mytags %}
{% block content %}
{% include 'nav_cat_bar.html' %}
<script
type=
"text/javascript"
>
function
search_ip
(
text
,
noselect
,
total
){
$
(
"#"
+
noselect
).
children
().
each
(
function
(){
$
(
this
).
remove
();
});
$
(
"#"
+
total
).
children
().
each
(
function
(){
if
(
$
(
this
).
text
().
search
(
text
)
!=
-
1
){
$
(
"#"
+
noselect
).
append
(
$
(
this
).
clone
())
}
})
}
</script>
<div
class=
"wrapper wrapper-content animated fadeInRight"
>
<div
class=
"row"
>
<div
class=
"col-lg-10"
>
<div
class=
"ibox float-e-margins"
>
<div
id=
"ibox-content"
class=
"ibox-title"
>
<h5>
填写主机组基本信息
</h5>
</div>
<div
class=
"ibox-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>
<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>
<div
class=
"ibox-content"
>
{% if emg %}
<div
class=
"alert alert-warning text-center"
>
{{ emg }}
</div>
...
...
@@ -48,37 +93,46 @@
</div>
{% endifequal %}
<div
class=
"hr-line-dashed"
></div>
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div>
<label
for=
"hosts"
class=
"col-lg-2 control-label"
>
主机
</label>
<div
class=
"col-sm-3"
>
<select
multiple=
"multiple"
id=
"id_domains_filter"
name=
"domains_filter"
style=
"display: none;"
>
</select>
<div
class=
"input-group"
style=
"padding-bottom: 5px"
>
<input
type=
"text"
size=
"19"
class=
"form-control input-sm"
id=
"search"
name=
"keyword"
placeholder=
"过滤"
>
</div>
<select
id=
"hosts"
size=
"12"
class=
"form-control m-b"
multiple
>
<label
for=
"group_name"
class=
"col-sm-2 control-label"
>
过滤
</label>
<div
class=
"col-sm-4"
>
<input
id=
"noselect"
class=
"form-control"
oninput=
"search_ip(this.value, 'assets', 'assets_total')"
>
</div>
<div
class=
"col-sm-1"
>
</div>
<div
id=
"select"
class=
"col-sm-3"
>
<input
class=
"form-control"
oninput=
"search_ip(this.value, 'asset_select', 'asset_select_total')"
>
</div>
</div>
<div
class=
"form-group"
>
<label
for=
""
class=
"col-sm-2 control-label"
>
主机
<span
class=
"red-fonts"
>
*
</span></label>
<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 }}"
>
{{ post.ip }}
</option>
<option
value=
"{{ post.id }}"
>
{{ post.ip }}
</option>
{% endfor %}
</select>
</div>
<div
class=
"col-sm-1"
>
<div
class=
"btn-group"
style=
"margin-top: 50px;"
>
<button
type=
"button"
class=
"btn btn-xm btn-white"
onclick=
"move('hosts', 'hosts_selected')"
><i
class=
"fa fa-chevron-right"
></i></button>
<button
type=
"button"
class=
"btn btn-xm btn-white"
onclick=
"move_left('hosts_selected', 'hosts')"
><i
class=
"fa fa-chevron-left"
></i></button>
</div>
</div>
<div
class=
"col-sm-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>
</div>
<div
class=
"col-sm-3"
>
<h4
style=
"padding-bottom: 5px"
>
已选中主机
</h4>
<div
>
<select
id=
"hosts_selected"
name=
"j_hosts"
class=
"form-control m-b"
size=
"12"
multiple
>
{% for post in eposts %}
<option
value=
"{{ post.id }}"
>
{{ post.ip }}
</option>
{% endfor %}
</select>
</
div
>
</div
>
<div
class=
"col-sm-3"
>
<div
>
<select
id=
"asset_select"
name=
"j_hosts"
class=
"form-control m-b"
size=
"12"
multiple
>
{% for asset in eposts %}
<option
value=
"{{ asset.id }}"
>
{{ asset.ip }}
</option>
{% endfor %}
</
select
>
</div>
</div>
</div>
...
...
@@ -92,7 +146,7 @@
<div
class=
"form-group"
>
<div
class=
"col-sm-4 col-sm-offset-5"
>
<button
class=
"btn btn-white"
type=
"submit"
>
重置
</button>
<button
class=
"btn btn-primary"
type=
"submit"
onclick=
"on_submit('groups_selected') "
>
提交
</button>
<button
class=
"btn btn-primary"
id=
"submit_button"
type=
"submit"
onclick=
"on_submit('groups_selected') "
>
提交
</button>
</div>
</div>
</form>
...
...
@@ -103,6 +157,15 @@
</div>
<script>
$
(
document
).
ready
(
function
(){
$
(
"#submit_button"
).
click
(
function
(){
$
(
'#assetForm option'
).
each
(
function
(){
$
(
this
).
prop
(
'selected'
,
true
)
})
});
})
$
(
'#assetForm'
).
validator
({
timely
:
2
,
theme
:
"yellow_right_effect"
,
...
...
@@ -127,16 +190,16 @@
})
}
$
(
'#search'
).
keyup
(
function
()
{
var
$rows
=
$
(
'#hosts option'
);
console
.
log
(
$rows
);
var
val
=
$
.
trim
(
$
(
this
).
val
()).
replace
(
/ +/g
,
' '
).
toLowerCase
();
$rows
.
show
().
filter
(
function
()
{
var
text
=
$
(
this
).
text
().
replace
(
/
\s
+/g
,
' '
).
toLowerCase
();
return
!~
text
.
indexOf
(
val
);
}).
hide
();
});
//
$('#search').keyup(function() {
//
var $rows = $('#hosts option');
//
console.log($rows);
//
var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();
//
//
$rows.show().filter(function() {
//
var text = $(this).text().replace(/\s+/g, ' ').toLowerCase();
//
return !~text.indexOf(val);
//
}).hide();
//
});
function
change_dept
(
dept_id
){
$
.
get
(
'/jasset/dept_host_ajax/'
,
...
...
templates/jasset/idc_detail.html
View file @
d6171f7f
...
...
@@ -83,7 +83,78 @@
<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>
{% include 'paginator.html' %}
<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>
...
...
templates/jperm/perm_apply.html
View file @
d6171f7f
{% extends 'base.html' %}
{% block content %}
{% include 'nav_cat_bar.html' %}
<!--<h3 class="text-center">项目发布申请</h3>-->
<script
type=
"text/javascript"
>
function
search_ip
(
text
,
noselect
,
total
){
$
(
"#"
+
noselect
).
children
().
each
(
function
(){
$
(
this
).
remove
();
});
$
(
"#"
+
total
).
children
().
each
(
function
(){
if
(
$
(
this
).
text
().
search
(
text
)
!=
-
1
){
$
(
"#"
+
noselect
).
append
(
$
(
this
).
clone
())
}
})
}
</script>
<div
class=
"wrapper wrapper-content animated fadeInRight"
>
<div
class=
"row"
>
<div
class=
"col-lg-10"
>
...
...
@@ -16,10 +29,6 @@
<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>
...
...
@@ -27,6 +36,18 @@
</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.ip }}"
>
{{ 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.ip }}"
>
{{ asset.ip }}
</option>
{% endfor %}
</select>
<div
class=
"ibox-content"
>
{% if emg %}
<div
class=
"alert alert-warning text-center"
>
{{ emg }}
</div>
...
...
@@ -46,10 +67,10 @@
</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"
id=
"j_da"
><label
class=
"col-sm-2 control-label"
>
部门管理员
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"radio"
>
{% for da in dept_da %}
<label><input
type=
"radio"
value=
"{{ da.id }}"
id=
"da"
name=
"da"
>
{{ da }}
</label>
<label><input
type=
"radio"
value=
"{{ da.id }}"
name=
"da"
>
{{ da }}
</label>
{% endfor %}
</div>
</div>
...
...
@@ -68,35 +89,40 @@
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div>
<label
for=
"groups"
class=
"col-lg-2 control-label"
>
主机
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"col-sm-3"
>
<select
multiple=
"multiple"
id=
"id_domains_filter"
name=
"domains_filter"
style=
"display: none;"
>
</select>
<div
class=
"input-group"
style=
"padding-bottom: 5px"
>
<input
type=
"text"
size=
"19"
class=
"form-control input-sm"
id=
"search"
name=
"keyword"
placeholder=
"过滤"
>
</div>
<select
id=
"groups"
size=
"12"
class=
"form-control m-b"
multiple
>
<label
for=
"group_name"
class=
"col-sm-2 control-label"
>
过滤
</label>
<div
class=
"col-sm-4"
>
<input
id=
"noselect"
class=
"form-control"
oninput=
"search_ip(this.value, 'assets', 'assets_total')"
>
</div>
<div
class=
"col-sm-1"
>
</div>
<div
id=
"select"
class=
"col-sm-3"
>
<input
class=
"form-control"
oninput=
"search_ip(this.value, 'asset_select', 'asset_select_total')"
>
</div>
</div>
<div
class=
"form-group"
>
<label
for=
""
class=
"col-sm-2 control-label"
>
主机
<span
class=
"red-fonts"
>
*
</span></label>
<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.ip }}"
>
{{ post.ip }}
</option>
<option
value=
"{{ post.ip }}"
>
{{ post.ip }}
</option>
{% endfor %}
</select>
</div>
<div
class=
"col-sm-1"
>
<div
class=
"btn-group"
style=
"margin-top: 50px;"
>
<button
type=
"button"
class=
"btn btn-xm btn-white"
onclick=
"move('groups', 'groups_selected')"
><i
class=
"fa fa-chevron-right"
></i></button>
<button
type=
"button"
class=
"btn btn-xm btn-white"
onclick=
"move_left('groups_selected', 'groups')"
><i
class=
"fa fa-chevron-left"
></i></button>
</div>
</div>
<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>
</div>
<div
class=
"col-sm-3"
>
<h4
style=
"padding-bottom: 5px"
>
已选中主机
</h4>
<div>
<select
id=
"groups_selected"
name=
"hosts"
class=
"form-control m-b"
size=
"12"
multiple
>
{% for post in eposts %}
<option
value=
"{{ post.ip }}"
>
{{ post.ip }}
</option>
{% endfor %}
</select>
</div>
</div>
<div
class=
"col-sm-3"
>
<div>
<select
id=
"asset_select"
name=
"hosts"
class=
"form-control m-b"
size=
"12"
multiple
></select>
</div>
</div>
</div>
...
...
@@ -110,7 +136,7 @@
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<div
class=
"col-sm-4 col-sm-offset-5"
>
<button
class=
"btn btn-primary"
type=
"submit"
>
提交
</button>
<button
class=
"btn btn-primary"
id=
"submit_button"
type=
"submit"
>
提交
</button>
</div>
</div>
</form>
...
...
@@ -121,6 +147,32 @@
</div>
<script>
$
(
document
).
ready
(
function
(){
$
(
"#submit_button"
).
click
(
function
(){
$
(
'#assetForm option'
).
each
(
function
(){
$
(
this
).
prop
(
'selected'
,
true
)
})
});
})
$
(
'#assetForm'
).
validator
({
timely
:
2
,
theme
:
"yellow_right_effect"
,
fields
:
{
"j_da"
:
{
rule
:
"required"
,
tip
:
"选择管理员"
,
ok
:
""
,
msg
:
{
required
:
"管理员必须选择!"
},
data
:
{
'data-ok'
:
"ok"
}
}
},
valid
:
function
(
form
)
{
form
.
submit
();
}
});
var
$rows
=
$
(
'#groups option'
);
$
(
'#search'
).
keyup
(
function
()
{
var
val
=
$
.
trim
(
$
(
this
).
val
()).
replace
(
/ +/g
,
' '
).
toLowerCase
();
...
...
templates/nav.html
View file @
d6171f7f
...
...
@@ -5,12 +5,6 @@
{% include 'nav_li_profile.html' %}
<li
id=
"index"
>
<a
href=
"/"
><i
class=
"fa fa-th-large"
></i>
<span
class=
"nav-label"
>
仪表盘
</span><span
class=
"label label-info pull-right"
></span></a>
<!--<a href="index.html"><i class="fa fa-th-large"></i> <span class="nav-label">仪表盘</span> <span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
<li><a href="index.html">Dashboard v.1</a></li>
<li ><a href="dashboard_2.html">Dashboard v.2</a></li>
<li ><a href="dashboard_3.html">Dashboard v.3</a></li>
</ul>-->
</li>
<li
id=
"juser"
>
<a
href=
"#"
><i
class=
"fa fa-rebel"
></i>
<span
class=
"nav-label"
>
用户管理
</span><span
class=
"fa arrow"
></span></a>
...
...
@@ -51,13 +45,6 @@
<li
class=
"apply_show online"
><a
href=
"/jperm/apply_show/online/"
>
权限审批
</a></li>
</ul>
</li>
{#
<li
id=
"jlog"
>
#}
{#
<a
href=
"#"
><i
class=
"fa fa-files-o"
></i>
<span
class=
"nav-label"
>
日志审计
</span><span
class=
"fa arrow"
></span></a>
#}
{#
<ul
class=
"nav nav-second-level"
>
#}
{#
<li
id=
"log_list"
><a
href=
"/jlog/log_list/online/"
>
查看日志
</a></li>
#}
{#
<li
id=
"log_detail"
><a
href=
"/jlog/log_detail/"
>
日志分析
</a></li>
#}
{#
</ul>
#}
{#
</li>
#}
<li
id=
"jlog"
>
<a
href=
"/jlog/log_list/online/"
><i
class=
"fa fa-files-o"
></i>
<span
class=
"nav-label"
>
日志审计
</span><span
class=
"label label-info pull-right"
></span></a>
</li>
...
...
@@ -76,12 +63,6 @@
{% include 'nav_li_profile.html' %}
<li
id=
"index"
>
<a
href=
"/"
><i
class=
"fa fa-th-large"
></i>
<span
class=
"nav-label"
>
仪表盘
</span><span
class=
"label label-info pull-right"
></span></a>
<!--<a href="index.html"><i class="fa fa-th-large"></i> <span class="nav-label">仪表盘</span> <span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
<li><a href="index.html">Dashboard v.1</a></li>
<li ><a href="dashboard_2.html">Dashboard v.2</a></li>
<li ><a href="dashboard_3.html">Dashboard v.3</a></li>
</ul>-->
</li>
<li
id=
"juser"
>
<a
href=
"#"
><i
class=
"fa fa-rebel"
></i>
<span
class=
"nav-label"
>
用户管理
</span><span
class=
"fa arrow"
></span></a>
...
...
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