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
39b7a729
Commit
39b7a729
authored
9 years ago
by
ibuler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
merge with dev
parent
7b792907
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
0 additions
and
568 deletions
+0
-568
connect.py
connect.py
+0
-18
views.py
jlog/views.py
+0
-7
views.py
jperm/views.py
+0
-163
jumpserver.conf
jumpserver.conf
+0
-6
api.py
jumpserver/api.py
+0
-86
mytags.py
jumpserver/templatetags/mytags.py
+0
-12
views.py
juser/views.py
+0
-0
log_handler.py
log_handler.py
+0
-105
layer.min.js
static/js/layer/layer.min.js
+0
-0
sudo_detail.html
templates/jperm/sudo_detail.html
+0
-171
No files found.
connect.py
View file @
39b7a729
...
...
@@ -239,24 +239,6 @@ class Tty(object):
today_connect_log_dir
=
os
.
path
.
join
(
tty_log_dir
,
date_start
)
log_file_path
=
os
.
path
.
join
(
today_connect_log_dir
,
'
%
s_
%
s_
%
s'
%
(
self
.
username
,
self
.
asset_name
,
time_start
))
<<<<<<<
HEAD
def
log_record
(
username
,
host
):
"""Logging user command and output."""
connect_log_dir
=
os
.
path
.
join
(
LOG_DIR
,
'connect'
)
timestamp_start
=
int
(
time
.
time
())
today
=
time
.
strftime
(
'
%
Y
%
m
%
d'
,
time
.
localtime
(
timestamp_start
))
time_now
=
time
.
strftime
(
'
%
H
%
M
%
S'
,
time
.
localtime
(
timestamp_start
))
today_connect_log_dir
=
os
.
path
.
join
(
connect_log_dir
,
today
)
log_filename
=
'
%
s_
%
s_
%
s.log'
%
(
username
,
host
,
time_now
)
log_file_path
=
os
.
path
.
join
(
today_connect_log_dir
,
log_filename
)
dept_name
=
User
.
objects
.
get
(
username
=
username
)
.
dept
.
name
pid
=
os
.
getpid
()
pts
=
os
.
popen
(
"ps axu | grep
%
s | grep -v grep | awk '{ print $7 }'"
%
pid
)
.
read
()
.
strip
()
ip_list
=
os
.
popen
(
"who | grep
%
s | awk '{ print $5 }'"
%
pts
)
.
read
()
.
strip
(
'()
\n
'
)
if
not
os
.
path
.
isdir
(
today_connect_log_dir
):
=======
>>>>>>>
dev
try
:
mkdir
(
os
.
path
.
dirname
(
today_connect_log_dir
),
mode
=
0777
)
mkdir
(
today_connect_log_dir
,
mode
=
0777
)
...
...
This diff is collapsed.
Click to expand it.
jlog/views.py
View file @
39b7a729
...
...
@@ -84,13 +84,6 @@ def log_kill(request):
log
=
Log
.
objects
.
filter
(
pid
=
pid
)
if
log
:
log
=
log
[
0
]
<<<<<<<
HEAD
dept_name
=
log
.
dept_name
deptname
=
get_session_user_info
(
request
)[
4
]
if
is_group_admin
(
request
)
and
dept_name
!=
deptname
:
return
httperror
(
request
,
u'Kill失败, 您无权操作!'
)
=======
>>>>>>>
dev
try
:
os
.
kill
(
int
(
pid
),
9
)
except
OSError
:
...
...
This diff is collapsed.
Click to expand it.
jperm/views.py
View file @
39b7a729
...
...
@@ -182,107 +182,6 @@ def perm_rule_edit(request):
asset_groups_select
=
request
.
POST
.
getlist
(
'asset_group'
,
[])
roles_select
=
request
.
POST
.
getlist
(
'role'
,
[])
<<<<<<<
HEAD
@require_super_user
def
perm_edit
(
request
):
if
request
.
method
==
'GET'
:
header_title
,
path1
,
path2
=
u'编辑授权'
,
u'授权管理'
,
u'授权编辑'
user_group_id
=
request
.
GET
.
get
(
'id'
,
''
)
user_group
=
UserGroup
.
objects
.
filter
(
id
=
user_group_id
)
if
user_group
:
user_group
=
user_group
[
0
]
asset_groups_all
=
BisGroup
.
objects
.
all
()
asset_groups_select
=
[
perm
.
asset_group
for
perm
in
user_group
.
perm_set
.
all
()]
asset_groups
=
[
asset_group
for
asset_group
in
asset_groups_all
if
asset_group
not
in
asset_groups_select
]
else
:
user_group_id
=
request
.
POST
.
get
(
'user_group_id'
)
asset_group_id_list
=
request
.
POST
.
getlist
(
'asset_groups_select'
)
perm_group_update
(
user_group_id
,
asset_group_id_list
)
return
HttpResponseRedirect
(
'/jperm/perm_list/'
)
return
render_to_response
(
'jperm/perm_edit.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
perm_edit_adm
(
request
):
if
request
.
method
==
'GET'
:
header_title
,
path1
,
path2
=
u'编辑授权'
,
u'授权管理'
,
u'授权编辑'
user_group_id
=
request
.
GET
.
get
(
'id'
,
''
)
user_group
=
UserGroup
.
objects
.
filter
(
id
=
user_group_id
)
user
,
dept
=
get_session_user_dept
(
request
)
if
user_group
:
user_group
=
user_group
[
0
]
asset_groups_all
=
dept
.
bisgroup_set
.
all
()
asset_groups_select
=
[
perm
.
asset_group
for
perm
in
user_group
.
perm_set
.
all
()]
asset_groups
=
[
asset_group
for
asset_group
in
asset_groups_all
if
asset_group
not
in
asset_groups_select
]
else
:
user_group_id
=
request
.
POST
.
get
(
'user_group_id'
)
asset_group_id_list
=
request
.
POST
.
getlist
(
'asset_groups_select'
)
print
user_group_id
,
asset_group_id_list
if
not
validate
(
request
,
user_group
=
[
user_group_id
],
asset_group
=
asset_group_id_list
):
return
HttpResponseRedirect
(
'/'
)
perm_group_update
(
user_group_id
,
asset_group_id_list
)
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'授权详情'
group_id
=
request
.
GET
.
get
(
'id'
)
user_group
=
UserGroup
.
objects
.
filter
(
id
=
group_id
)
if
user_group
:
user_group
=
user_group
[
0
]
users
=
user_group
.
user_set
.
all
()
group_user_num
=
len
(
users
)
perms
=
user_group
.
perm_set
.
all
()
asset_groups
=
[
perm
.
asset_group
for
perm
in
perms
]
return
render_to_response
(
'jperm/perm_detail.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
perm_del
(
request
):
perm_id
=
request
.
GET
.
get
(
'id'
)
perm
=
Perm
.
objects
.
filter
(
id
=
perm_id
)
if
perm
:
perm
=
perm
[
0
]
perm
.
delete
()
return
HttpResponseRedirect
(
'/jperm/perm_list/'
)
@require_admin
def
perm_asset_detail
(
request
):
header_title
,
path1
,
path2
=
u'用户授权主机'
,
u'权限管理'
,
u'用户主机详情'
user_id
=
request
.
GET
.
get
(
'id'
)
user
=
User
.
objects
.
filter
(
id
=
user_id
)
if
user
:
user
=
user
[
0
]
assets_list
=
user_perm_asset_api
(
user
.
username
)
return
render_to_response
(
'jperm/perm_asset_detail.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
def
unicode2str
(
unicode_list
):
return
[
str
(
i
)
for
i
in
unicode_list
]
def
sudo_ldap_add
(
user_group
,
user_runas
,
asset_groups_select
,
cmd_groups_select
):
if
LDAP_ENABLE
:
ldap_conn
=
LDAPMgmt
(
LDAP_HOST_URL
,
LDAP_BASE_DN
,
LDAP_ROOT_DN
,
LDAP_ROOT_PW
)
else
:
return
assets
=
[]
cmds
=
[]
user_runas
=
user_runas
.
split
(
','
)
if
len
(
asset_groups_select
)
==
1
and
asset_groups_select
[
0
]
.
name
==
'ALL'
:
asset_all
=
True
else
:
asset_all
=
False
for
asset_group
in
asset_groups_select
:
assets
.
extend
(
asset_group
.
asset_set
.
all
())
=======
try
:
if
not
rule_name
or
not
roles_select
:
raise
ServerError
(
u'系统用户和关联系统用户不能为空'
)
...
...
@@ -318,7 +217,6 @@ def sudo_ldap_add(user_group, user_runas, asset_groups_select,
rule
.
comment
=
rule_comment
rule
.
save
()
msg
=
u"更新授权规则:
%
s成功"
%
rule
.
name
>>>>>>>
dev
except
ServerError
,
e
:
error
=
e
...
...
@@ -389,66 +287,6 @@ def perm_role_add(request):
raise
ServerError
(
'已经存在该用户
%
s'
%
name
)
default
=
get_object
(
Setting
,
name
=
'default'
)
<<<<<<<
HEAD
@require_admin
def
cmd_add_adm
(
request
):
header_title
,
path1
,
path2
=
u'sudo命令添加'
,
u'授权管理'
,
u'命令组添加'
user
,
dept
=
get_session_user_dept
(
request
)
if
request
.
method
==
'POST'
:
name
=
request
.
POST
.
get
(
'name'
)
cmd
=
','
.
join
(
request
.
POST
.
get
(
'cmd'
)
.
split
(
'
\n
'
))
comment
=
request
.
POST
.
get
(
'comment'
)
try
:
if
CmdGroup
.
objects
.
filter
(
name
=
name
):
error
=
'
%
s 命令组已存在'
raise
ServerError
(
error
)
except
ServerError
,
e
:
pass
else
:
CmdGroup
.
objects
.
create
(
name
=
name
,
dept
=
dept
,
cmd
=
cmd
,
comment
=
comment
)
return
HttpResponseRedirect
(
'/jperm/cmd_list/'
)
return
HttpResponseRedirect
(
'/jperm/cmd_list/'
)
return
render_to_response
(
'jperm/sudo_cmd_add.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_admin
def
cmd_edit
(
request
):
header_title
,
path1
,
path2
=
u'sudo命令修改'
,
u'授权管理管理'
,
u'命令组修改'
cmd_group_id
=
request
.
GET
.
get
(
'id'
)
cmd_group
=
CmdGroup
.
objects
.
filter
(
id
=
cmd_group_id
)
dept_all
=
DEPT
.
objects
.
all
()
if
cmd_group
:
cmd_group
=
cmd_group
[
0
]
cmd_group_id
=
cmd_group
.
id
dept_id
=
cmd_group
.
dept
.
id
name
=
cmd_group
.
name
cmd
=
'
\n
'
.
join
(
cmd_group
.
cmd
.
split
(
','
))
comment
=
cmd_group
.
comment
if
request
.
method
==
'POST'
:
cmd_group_id
=
request
.
POST
.
get
(
'cmd_group_id'
)
name
=
request
.
POST
.
get
(
'name'
)
dept_id
=
request
.
POST
.
get
(
'dept_id'
)
cmd
=
','
.
join
(
request
.
POST
.
get
(
'cmd'
)
.
split
(
'
\n
'
))
comment
=
request
.
POST
.
get
(
'comment'
)
cmd_group
=
CmdGroup
.
objects
.
filter
(
id
=
cmd_group_id
)
dept
=
DEPT
.
objects
.
filter
(
id
=
dept_id
)
try
:
if
not
dept
:
error
=
'没有该部门'
raise
ServerError
(
error
)
if
not
cmd_group
:
error
=
'没有该命令组'
=======
if
password
:
encrypt_pass
=
CRYPTOR
.
encrypt
(
password
)
else
:
...
...
@@ -465,7 +303,6 @@ def cmd_edit(request):
role
.
sudo
=
sudos_obj
msg
=
u"添加系统用户:
%
s"
%
name
return
HttpResponseRedirect
(
reverse
(
'role_list'
))
>>>>>>>
dev
except
ServerError
,
e
:
error
=
e
...
...
This diff is collapsed.
Click to expand it.
jumpserver.conf
View file @
39b7a729
...
...
@@ -17,13 +17,7 @@ web_socket_host = 192.168.244.129:3000
mail_enable
=
1
email_host
=
smtp
.
qq
.
com
email_port
=
25
<<<<<<<
HEAD
email_host_user
=
1152704203
@
qq
.
com
email_host_password
=
Hudie117
...
email_use_tls
=
False
=======
email_host_user
=
ibuler
@
qq
.
com
email_host_password
=
Hudie117
...
qq
email_use_tls
=
True
>>>>>>>
dev
This diff is collapsed.
Click to expand it.
jumpserver/api.py
View file @
39b7a729
...
...
@@ -25,91 +25,6 @@ from jumpserver.models import Setting
from
django.http
import
HttpResponseRedirect
from
django.shortcuts
import
render_to_response
from
django.core.mail
import
send_mail
<<<<<<<
HEAD
import
json
BASE_DIR
=
os
.
path
.
abspath
(
os
.
path
.
dirname
(
os
.
path
.
dirname
(
__file__
)))
CONF
=
ConfigParser
()
CONF
.
read
(
os
.
path
.
join
(
BASE_DIR
,
'jumpserver.conf'
))
LOG_DIR
=
os
.
path
.
join
(
BASE_DIR
,
'logs'
)
SSH_KEY_DIR
=
os
.
path
.
join
(
BASE_DIR
,
'keys'
)
SERVER_KEY_DIR
=
os
.
path
.
join
(
SSH_KEY_DIR
,
'server'
)
KEY
=
CONF
.
get
(
'base'
,
'key'
)
LOGIN_NAME
=
getpass
.
getuser
()
LDAP_ENABLE
=
CONF
.
getint
(
'ldap'
,
'ldap_enable'
)
SEND_IP
=
CONF
.
get
(
'base'
,
'ip'
)
SEND_PORT
=
CONF
.
get
(
'base'
,
'port'
)
MAIL_FROM
=
CONF
.
get
(
'mail'
,
'email_host_user'
)
class
LDAPMgmt
():
def
__init__
(
self
,
host_url
,
base_dn
,
root_cn
,
root_pw
):
self
.
ldap_host
=
host_url
self
.
ldap_base_dn
=
base_dn
self
.
conn
=
ldap
.
initialize
(
host_url
)
self
.
conn
.
set_option
(
ldap
.
OPT_REFERRALS
,
0
)
self
.
conn
.
protocol_version
=
ldap
.
VERSION3
self
.
conn
.
simple_bind_s
(
root_cn
,
root_pw
)
def
list
(
self
,
filter
,
scope
=
ldap
.
SCOPE_SUBTREE
,
attr
=
None
):
result
=
{}
try
:
ldap_result
=
self
.
conn
.
search_s
(
self
.
ldap_base_dn
,
scope
,
filter
,
attr
)
for
entry
in
ldap_result
:
name
,
data
=
entry
for
k
,
v
in
data
.
items
():
print
'
%
s:
%
s'
%
(
k
,
v
)
result
[
k
]
=
v
return
result
except
ldap
.
LDAPError
,
e
:
print
e
def
add
(
self
,
dn
,
attrs
):
try
:
ldif
=
modlist
.
addModlist
(
attrs
)
self
.
conn
.
add_s
(
dn
,
ldif
)
except
ldap
.
LDAPError
,
e
:
print
e
def
modify
(
self
,
dn
,
attrs
):
try
:
attr_s
=
[]
for
k
,
v
in
attrs
.
items
():
attr_s
.
append
((
2
,
k
,
v
))
self
.
conn
.
modify_s
(
dn
,
attr_s
)
except
ldap
.
LDAPError
,
e
:
print
e
def
delete
(
self
,
dn
):
try
:
self
.
conn
.
delete_s
(
dn
)
except
ldap
.
LDAPError
,
e
:
print
e
def
decrypt
(
self
,
text
):
cryptor
=
AES
.
new
(
self
.
key
,
self
.
mode
,
b
'0000000000000000'
)
try
:
plain_text
=
cryptor
.
decrypt
(
a2b_hex
(
text
))
except
TypeError
:
raise
ServerError
(
'Decrypt password error, TYpe error.'
)
return
plain_text
.
rstrip
(
'
\0
'
)
if
LDAP_ENABLE
:
LDAP_HOST_URL
=
CONF
.
get
(
'ldap'
,
'host_url'
)
LDAP_BASE_DN
=
CONF
.
get
(
'ldap'
,
'base_dn'
)
LDAP_ROOT_DN
=
CONF
.
get
(
'ldap'
,
'root_dn'
)
LDAP_ROOT_PW
=
CONF
.
get
(
'ldap'
,
'root_pw'
)
def
md5_crypt
(
string
):
return
hashlib
.
new
(
"md5"
,
string
)
.
hexdigest
()
=======
from
django.core.urlresolvers
import
reverse
...
...
@@ -194,7 +109,6 @@ def chown(path, user, group=''):
os
.
chown
(
path
,
uid
,
gid
)
except
KeyError
:
pass
>>>>>>>
dev
def
page_list_return
(
total
,
current
=
1
):
...
...
This diff is collapsed.
Click to expand it.
jumpserver/templatetags/mytags.py
View file @
39b7a729
...
...
@@ -273,23 +273,11 @@ def get_push_info(push_id, arg):
else
:
return
[]
<<<<<<<
HEAD
@register.filter
(
name
=
'sudo_cmd_count'
)
def
sudo_cmd_count
(
cmd_group_id
):
cmd_group
=
CmdGroup
.
objects
.
filter
(
id
=
cmd_group_id
)
cmds
=
[]
if
cmd_group
:
cmd_group
=
cmd_group
[
0
]
return
len
(
set
(
cmd_group
.
cmd
.
split
(
','
)))
else
:
return
0
=======
@register.filter
(
name
=
'get_cpu_core'
)
def
get_cpu_core
(
cpu_info
):
cpu_core
=
cpu_info
.
split
(
'* '
)[
1
]
if
cpu_info
and
'*'
in
cpu_info
else
cpu_info
return
cpu_core
>>>>>>>
dev
@register.filter
(
name
=
'get_disk_info'
)
...
...
This diff is collapsed.
Click to expand it.
juser/views.py
View file @
39b7a729
This diff is collapsed.
Click to expand it.
log_handler.py
deleted
100644 → 0
View file @
7b792907
#!/usr/bin/python
# coding: utf-8
import
os
import
re
import
time
import
psutil
from
datetime
import
datetime
os
.
environ
[
'DJANGO_SETTINGS_MODULE'
]
=
'jumpserver.settings'
import
django
#django.setup()
from
jlog.models
import
Log
def
log_hanler
(
id
):
log
=
Log
.
objects
.
get
(
id
=
id
)
pattern
=
re
.
compile
(
r'([\[.*@.*\][\$#].*)|(.*mysql>.*)'
)
if
log
:
filename
=
log
.
log_path
if
os
.
path
.
isfile
(
filename
):
f_his
=
filename
+
'.his'
f1
=
open
(
filename
)
f2
=
open
(
f_his
,
'a'
)
lines
=
f1
.
readlines
()
for
line
in
lines
[
7
:]:
match
=
pattern
.
match
(
line
)
if
match
:
newline
=
re
.
sub
(
'
\
[[A-Z]'
,
''
,
line
)
f2
.
write
(
newline
)
f1
.
close
()
f2
.
close
()
log
.
log_finished
=
True
log
.
save
()
def
set_finish
(
id
):
log
=
Log
.
objects
.
filter
(
id
=
id
)
if
log
:
log
.
update
(
is_finished
=
1
,
end_time
=
datetime
.
now
())
def
kill_pid
(
pid
):
try
:
os
.
kill
(
pid
,
9
)
except
OSError
:
pass
def
get_pids
():
pids1
,
pids2
=
[],
[]
pids1_obj
=
Log
.
objects
.
filter
(
is_finished
=
0
)
pids2_obj
=
Log
.
objects
.
filter
(
is_finished
=
1
,
log_finished
=
0
)
for
pid_obj
in
pids1_obj
:
pids1
.
append
((
pid_obj
.
id
,
pid_obj
.
pid
,
pid_obj
.
log_path
,
pid_obj
.
is_finished
,
pid_obj
.
log_finished
,
pid_obj
.
start_time
))
for
pid_obj
in
pids2_obj
:
pids2
.
append
(
pid_obj
.
id
)
return
pids1
,
pids2
def
run
():
pids1
,
pids2
=
get_pids
()
for
pid_id
in
pids2
:
log_hanler
(
pid_id
)
for
pid_id
,
pid
,
log_path
,
is_finished
,
log_finished
,
start_time
in
pids1
:
try
:
file_time
=
int
(
os
.
stat
(
log_path
)
.
st_ctime
)
now_time
=
int
(
time
.
time
())
if
now_time
-
file_time
>
10800
:
if
psutil
.
pid_exists
(
pid
):
kill_pid
(
pid
)
set_finish
(
pid_id
)
log_hanler
(
pid_id
)
except
OSError
:
pass
#function erorcheck is added by Lin to resolve CPU filled issue 2015.08.24
def
errorcheck
():
f
=
os
.
popen
(
"ps auxr | grep -v auxr|sed -n 2p"
)
a
=
f
.
read
()
.
strip
()
f
.
close
()
pid
=
0
try
:
if
a
is
not
None
:
b
=
a
.
split
(
" "
)
if
b
[
-
1
]
==
'/opt/jumpserver/connect.py'
and
b
[
-
2
]
==
'python'
and
b
[
-
8
]
==
'R'
and
int
(
b
[
-
3
]
.
split
(
':'
)[
0
])
>
100
:
for
i
,
j
in
enumerate
(
b
):
if
i
==
0
or
j
==
''
:
continue
else
:
pid
=
int
(
j
)
break
kill_pid
(
pid
)
except
:
pass
if
__name__
==
'__main__'
:
while
True
:
run
()
time
.
sleep
(
5
)
errorcheck
()
This diff is collapsed.
Click to expand it.
static/js/layer/layer.min.js
deleted
100644 → 0
View file @
7b792907
This diff is collapsed.
Click to expand it.
templates/jperm/sudo_detail.html
deleted
100644 → 0
View file @
7b792907
{% 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-4"
>
<div
class=
"ibox float-e-margins"
>
<div
class=
"ibox-title"
>
<h5>
授权主机/组
</h5>
<div
class=
"ibox-tools"
>
<a
class=
"collapse-link"
>
<i
class=
"fa fa-chevron-up"
></i>
</a>
<a
class=
"dropdown-toggle"
data-toggle=
"dropdown"
href=
"#"
>
<i
class=
"fa fa-wrench"
></i>
</a>
<ul
class=
"dropdown-menu dropdown-user"
>
<li><a
href=
"#"
>
Config option 1
</a>
</li>
<li><a
href=
"#"
>
Config option 2
</a>
</li>
</ul>
<a
class=
"close-link"
>
<i
class=
"fa fa-times"
></i>
</a>
</div>
</div>
<div
class=
"ibox-content ibox-heading"
>
<h3>
用户
</h3>
<small><i
class=
"fa fa-map-marker"
></i>
组下用户.
</small>
</div>
<div
class=
"ibox-content inspinia-timeline"
>
<div
class=
"timeline-item"
>
<div
class=
"row"
>
<div
class=
"col-xs-3 date"
>
<i
class=
"fa fa-users"
></i>
<b>
{{ user_group.name }}
</b>
<br>
<small
class=
"text-navy"
>
共: {{ group_user_num }} 用户
</small>
</div>
<div
class=
"col-xs-7 content no-top-border"
>
<p
class=
"m-b-xs"
><strong>
{{ user_group.comment }}
</strong></p>
<p>
{% for user in users %}
{{ user.name }}
<br>
{% endfor %}
</p>
<p></p>
</div>
</div>
</div>
{% if not users %}
(暂无)
{% endif %}
</div>
</div>
</div>
<div
class=
"col-lg-4"
>
<div
class=
"ibox float-e-margins"
>
<div
class=
"ibox-title"
>
<h5>
授权主机/组
</h5>
<div
class=
"ibox-tools"
>
<a
class=
"collapse-link"
>
<i
class=
"fa fa-chevron-up"
></i>
</a>
<a
class=
"dropdown-toggle"
data-toggle=
"dropdown"
href=
"#"
>
<i
class=
"fa fa-wrench"
></i>
</a>
<ul
class=
"dropdown-menu dropdown-user"
>
<li><a
href=
"#"
>
Config option 1
</a>
</li>
<li><a
href=
"#"
>
Config option 2
</a>
</li>
</ul>
<a
class=
"close-link"
>
<i
class=
"fa fa-times"
></i>
</a>
</div>
</div>
<div
class=
"ibox-content ibox-heading"
>
<h3>
授权主机/组
</h3>
<small><i
class=
"fa fa-map-marker"
></i>
这里包含了sudo授权所有的主机组和组下的主机.
</small>
</div>
<div
class=
"ibox-content inspinia-timeline"
>
{% for group in asset_groups %}
<div
class=
"timeline-item"
>
<div
class=
"row"
>
<div
class=
"col-xs-3 date"
>
<i
class=
"fa fa-repeat"
></i>
<b>
{{ group.name }}
</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 asset_groups %}
(暂无)
{% endif %}
</div>
</div>
</div>
<div
class=
"col-lg-4"
>
<div
class=
"ibox float-e-margins"
>
<div
class=
"ibox-title"
>
<h5>
授权命令/组
</h5>
<div
class=
"ibox-tools"
>
<a
class=
"collapse-link"
>
<i
class=
"fa fa-chevron-up"
></i>
</a>
<a
class=
"dropdown-toggle"
data-toggle=
"dropdown"
href=
"#"
>
<i
class=
"fa fa-wrench"
></i>
</a>
<ul
class=
"dropdown-menu dropdown-user"
>
<li><a
href=
"#"
>
Config option 1
</a>
</li>
<li><a
href=
"#"
>
Config option 2
</a>
</li>
</ul>
<a
class=
"close-link"
>
<i
class=
"fa fa-times"
></i>
</a>
</div>
</div>
<div
class=
"ibox-content inspinia-timeline"
>
{% for cmd_group in cmd_groups %}
<div
class=
"timeline-item"
>
<div
class=
"row"
>
<div
class=
"col-xs-3 date"
>
<i
class=
"fa fa-linux"
></i>
<b>
{{ cmd_group.name }}
</b>
<br>
<small
class=
"text-navy"
>
共: {{ cmd_group.id | sudo_cmd_count }} 个
</small>
</div>
<div
class=
"col-xs-7 content no-top-border"
>
<p
class=
"m-b-xs"
><strong>
{{ group.comment }}
</strong></p>
<p>
{% for cmd in cmd_group|cmd_group_split %}
{{ cmd }}
<br>
{% endfor %}
</p>
<p></p>
</div>
</div>
</div>
{% endfor %}
{% if not cmd_groups %}
(暂无)
{% endif %}
</div>
</div>
</div>
</div>
</div>
{% endblock %}
\ No newline at end of file
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