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
ebd92547
Commit
ebd92547
authored
Aug 01, 2019
by
ibuler
Browse files
Options
Browse Files
Download
Plain Diff
[Update] merged
parents
f6f8d13b
ba288396
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
94 additions
and
64 deletions
+94
-64
tasks.py
apps/assets/tasks.py
+46
-38
utils.py
apps/assets/utils.py
+2
-2
middleware.py
apps/jumpserver/middleware.py
+4
-2
settings.py
apps/jumpserver/settings.py
+4
-4
__init__.py
apps/ops/celery/__init__.py
+9
-0
tasks.py
apps/ops/tasks.py
+2
-2
apps.py
apps/perms/apps.py
+3
-0
asset_permission_list.html
apps/perms/templates/perms/asset_permission_list.html
+2
-1
asset_permission.py
apps/perms/utils/asset_permission.py
+8
-5
terminal_list.html
apps/terminal/templates/terminal/terminal_list.html
+3
-2
user.py
apps/users/models/user.py
+1
-1
tasks.py
apps/users/tasks.py
+4
-4
user_group_list.html
apps/users/templates/users/user_group_list.html
+2
-1
user_list.html
apps/users/templates/users/user_list.html
+3
-2
jms
jms
+0
-0
requirements.txt
requirements/requirements.txt
+1
-0
No files found.
apps/assets/tasks.py
View file @
ebd92547
...
...
@@ -62,7 +62,7 @@ def clean_hosts_by_protocol(system_user, assets):
return
hosts
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
set_assets_hardware_info
(
assets
,
result
,
**
kwargs
):
"""
Using ops task run result, to update asset info
...
...
@@ -148,7 +148,7 @@ def update_assets_hardware_info_util(assets, task_name=None):
return
result
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
update_asset_hardware_info_manual
(
asset
):
task_name
=
_
(
"Update asset hardware info: {}"
)
.
format
(
asset
.
hostname
)
update_assets_hardware_info_util
(
...
...
@@ -156,7 +156,7 @@ def update_asset_hardware_info_manual(asset):
)
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
update_assets_hardware_info_period
():
"""
Update asset hardware period task
...
...
@@ -170,7 +170,7 @@ def update_assets_hardware_info_period():
## ADMIN USER CONNECTIVE ##
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
test_asset_connectivity_util
(
assets
,
task_name
=
None
):
from
ops.utils
import
update_or_create_ansible_task
...
...
@@ -227,7 +227,7 @@ def test_asset_connectivity_util(assets, task_name=None):
return
results_summary
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
test_asset_connectivity_manual
(
asset
):
task_name
=
_
(
"Test assets connectivity: {}"
)
.
format
(
asset
)
summary
=
test_asset_connectivity_util
([
asset
],
task_name
=
task_name
)
...
...
@@ -238,7 +238,7 @@ def test_asset_connectivity_manual(asset):
return
True
,
""
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
test_admin_user_connectivity_util
(
admin_user
,
task_name
):
"""
Test asset admin user can connect or not. Using ansible api do that
...
...
@@ -254,7 +254,7 @@ def test_admin_user_connectivity_util(admin_user, task_name):
return
summary
@shared_task
@shared_task
(
queue
=
"ansible"
)
@register_as_period_task
(
interval
=
3600
)
def
test_admin_user_connectivity_period
():
"""
...
...
@@ -276,7 +276,7 @@ def test_admin_user_connectivity_period():
cache
.
set
(
key
,
1
,
60
*
40
)
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
test_admin_user_connectivity_manual
(
admin_user
):
task_name
=
_
(
"Test admin user connectivity: {}"
)
.
format
(
admin_user
.
name
)
test_admin_user_connectivity_util
(
admin_user
,
task_name
)
...
...
@@ -286,7 +286,7 @@ def test_admin_user_connectivity_manual(admin_user):
## System user connective ##
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
test_system_user_connectivity_util
(
system_user
,
assets
,
task_name
):
"""
Test system cant connect his assets or not.
...
...
@@ -344,14 +344,14 @@ def test_system_user_connectivity_util(system_user, assets, task_name):
return
results_summary
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
test_system_user_connectivity_manual
(
system_user
):
task_name
=
_
(
"Test system user connectivity: {}"
)
.
format
(
system_user
)
assets
=
system_user
.
get_all_assets
()
return
test_system_user_connectivity_util
(
system_user
,
assets
,
task_name
)
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
test_system_user_connectivity_a_asset
(
system_user
,
asset
):
task_name
=
_
(
"Test system user connectivity: {} => {}"
)
.
format
(
system_user
,
asset
...
...
@@ -359,7 +359,7 @@ def test_system_user_connectivity_a_asset(system_user, asset):
return
test_system_user_connectivity_util
(
system_user
,
[
asset
],
task_name
)
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
test_system_user_connectivity_period
():
if
PERIOD_TASK
!=
"on"
:
logger
.
debug
(
"Period task disabled, test system user connectivity pass"
)
...
...
@@ -374,10 +374,36 @@ def test_system_user_connectivity_period():
#### Push system user tasks ####
def
get_push_linux_system_user_tasks
(
system_user
):
tasks
=
[]
tasks
=
[
{
'name'
:
'Add user {}'
.
format
(
system_user
.
username
),
'action'
:
{
'module'
:
'user'
,
'args'
:
'name={} shell={} state=present'
.
format
(
system_user
.
username
,
system_user
.
shell
,
),
}
},
{
'name'
:
'Check home dir exists'
,
'action'
:
{
'module'
:
'stat'
,
'args'
:
'path=/home/{}'
.
format
(
system_user
.
username
)
},
'register'
:
'home_existed'
},
{
'name'
:
"Set home dir permission"
,
'action'
:
{
'module'
:
'file'
,
'args'
:
"path=/home/{0} owner={0} group={0} mode=700"
.
format
(
system_user
.
username
)
},
'when'
:
'home_existed.stat.exists == true'
}
]
if
system_user
.
password
:
tasks
.
append
({
'name'
:
'
Add user {}
'
.
format
(
system_user
.
username
),
'name'
:
'
Set {} password
'
.
format
(
system_user
.
username
),
'action'
:
{
'module'
:
'user'
,
'args'
:
'name={} shell={} state=present password={}'
.
format
(
...
...
@@ -386,24 +412,6 @@ def get_push_linux_system_user_tasks(system_user):
),
}
})
tasks
.
extend
([
{
'name'
:
'Check home dir exists'
,
'action'
:
{
'module'
:
'stat'
,
'args'
:
'path=/home/{}'
.
format
(
system_user
.
username
)
},
'register'
:
'home_existed'
},
{
'name'
:
"Set home dir permission"
,
'action'
:
{
'module'
:
'file'
,
'args'
:
"path=/home/{0} owner={0} group={0} mode=700"
.
format
(
system_user
.
username
)
},
'when'
:
'home_existed.stat.exists == true'
}
])
if
system_user
.
public_key
:
tasks
.
append
({
'name'
:
'Set {} authorized key'
.
format
(
system_user
.
username
),
...
...
@@ -475,7 +483,7 @@ def get_push_system_user_tasks(host, system_user):
return
tasks
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
push_system_user_util
(
system_user
,
assets
,
task_name
):
from
ops.utils
import
update_or_create_ansible_task
if
not
system_user
.
is_need_push
():
...
...
@@ -511,14 +519,14 @@ def push_system_user_util(system_user, assets, task_name):
task
.
run
()
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
push_system_user_to_assets_manual
(
system_user
):
assets
=
system_user
.
get_all_assets
()
task_name
=
_
(
"Push system users to assets: {}"
)
.
format
(
system_user
.
name
)
return
push_system_user_util
(
system_user
,
assets
,
task_name
=
task_name
)
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
push_system_user_a_asset_manual
(
system_user
,
asset
):
task_name
=
_
(
"Push system users to asset: {} => {}"
)
.
format
(
system_user
.
name
,
asset
...
...
@@ -526,7 +534,7 @@ def push_system_user_a_asset_manual(system_user, asset):
return
push_system_user_util
(
system_user
,
[
asset
],
task_name
=
task_name
)
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
push_system_user_to_assets
(
system_user
,
assets
):
task_name
=
_
(
"Push system users to assets: {}"
)
.
format
(
system_user
.
name
)
return
push_system_user_util
(
system_user
,
assets
,
task_name
)
...
...
@@ -561,7 +569,7 @@ def get_test_asset_user_connectivity_tasks(asset):
return
tasks
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
test_asset_user_connectivity_util
(
asset_user
,
task_name
,
run_as_admin
=
False
):
"""
:param asset_user: <AuthBook>对象
...
...
@@ -594,7 +602,7 @@ def test_asset_user_connectivity_util(asset_user, task_name, run_as_admin=False)
asset_user
.
set_connectivity
(
summary
)
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
test_asset_users_connectivity_manual
(
asset_users
,
run_as_admin
=
False
):
"""
:param asset_users: <AuthBook>对象
...
...
apps/assets/utils.py
View file @
ebd92547
...
...
@@ -213,10 +213,10 @@ class NodeUtil:
children
.
add
(
node
)
return
list
(
children
)
def
get_children
(
self
,
node
,
with_self
=
True
):
def
get_
all_
children
(
self
,
node
,
with_self
=
True
):
return
self
.
get_all_children_by_key
(
node
.
key
,
with_self
=
with_self
)
def
get_children_keys_by_key
(
self
,
key
,
with_self
=
True
):
def
get_
all_
children_keys_by_key
(
self
,
key
,
with_self
=
True
):
nodes
=
self
.
get_all_children_by_key
(
key
,
with_self
=
with_self
)
return
[
n
.
key
for
n
in
nodes
]
...
...
apps/jumpserver/middleware.py
View file @
ebd92547
...
...
@@ -5,6 +5,7 @@ import re
import
pytz
from
django.utils
import
timezone
from
django.shortcuts
import
HttpResponse
from
django.conf
import
settings
from
.utils
import
set_current_request
...
...
@@ -56,6 +57,7 @@ class RequestMiddleware:
def
__call__
(
self
,
request
):
set_current_request
(
request
)
response
=
self
.
get_response
(
request
)
age
=
request
.
session
.
get_expiry_age
()
request
.
session
.
set_expiry
(
age
)
if
not
settings
.
SESSION_EXPIRE_AT_BROWSER_CLOSE
:
age
=
request
.
session
.
get_expiry_age
()
request
.
session
.
set_expiry
(
age
)
return
response
apps/jumpserver/settings.py
View file @
ebd92547
...
...
@@ -297,10 +297,10 @@ LOGGING = {
'handlers'
:
[
'console'
,
'file'
],
'level'
:
"INFO"
,
},
'gunicorn'
:
{
'handlers'
:
[
'gunicorn_console'
,
'gunicorn_file'
],
'level'
:
'INFO'
,
},
#
'gunicorn': {
#
'handlers': ['gunicorn_console', 'gunicorn_file'],
#
'level': 'INFO',
#
},
# 'django.db': {
# 'handlers': ['console', 'file'],
# 'level': 'DEBUG'
...
...
apps/ops/celery/__init__.py
View file @
ebd92547
...
...
@@ -2,6 +2,7 @@
import
os
from
kombu
import
Exchange
,
Queue
from
celery
import
Celery
# set the default Django settings module for the 'celery' program.
...
...
@@ -15,6 +16,14 @@ configs = {k: v for k, v in settings.__dict__.items() if k.startswith('CELERY')}
# Using a string here means the worker will not have to
# pickle the object when using Windows.
# app.config_from_object('django.conf:settings', namespace='CELERY')
configs
[
"CELERY_QUEUES"
]
=
[
Queue
(
"celery"
,
Exchange
(
"celery"
),
routing_key
=
"celery"
),
Queue
(
"ansible"
,
Exchange
(
"ansible"
),
routing_key
=
"ansible"
),
]
configs
[
"CELERY_ROUTES"
]
=
{
"ops.tasks.run_ansible_task"
:
{
'exchange'
:
'ansible'
,
'routing_key'
:
'ansible'
},
}
app
.
namespace
=
'CELERY'
app
.
conf
.
update
(
configs
)
app
.
autodiscover_tasks
(
lambda
:
[
app_config
.
split
(
'.'
)[
0
]
for
app_config
in
settings
.
INSTALLED_APPS
])
apps/ops/tasks.py
View file @
ebd92547
...
...
@@ -23,7 +23,7 @@ def rerun_task():
pass
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
run_ansible_task
(
tid
,
callback
=
None
,
**
kwargs
):
"""
:param tid: is the tasks serialized data
...
...
@@ -98,7 +98,7 @@ def create_or_update_registered_periodic_tasks():
create_or_update_celery_periodic_tasks
(
task
)
@shared_task
@shared_task
(
queue
=
"ansible"
)
def
hello
(
name
,
callback
=
None
):
import
time
time
.
sleep
(
10
)
...
...
apps/perms/apps.py
View file @
ebd92547
from
__future__
import
unicode_literals
from
django.conf
import
settings
from
django.apps
import
AppConfig
...
...
@@ -8,4 +9,6 @@ class PermsConfig(AppConfig):
def
ready
(
self
):
from
.
import
signals_handler
if
not
settings
.
XPACK_ENABLED
:
settings
.
ASSETS_PERM_CACHE_ENABLE
=
False
return
super
()
.
ready
()
apps/perms/templates/perms/asset_permission_list.html
View file @
ebd92547
...
...
@@ -174,10 +174,11 @@ function initTable() {
}
}},
{
targets
:
8
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
name
=
htmlEscape
(
rowData
.
name
);
var
update_btn
=
'<a href="{% url "perms:asset-permission-update" pk=DEFAULT_PK %}" class="btn btn-xs m-l-xs btn-info">{% trans "Update" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
);
var
del_btn
=
'<a class="btn btn-xs btn-danger m-l-xs btn-del" data-uid="{{ DEFAULT_PK }}" mark=1 data-name="99991938">{% trans "Delete" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
)
.
replace
(
'99991938'
,
rowData
.
name
);
.
replace
(
'99991938'
,
name
);
if
(
rowData
.
inherit
)
{
del_btn
=
del_btn
.
replace
(
"mark"
,
"disabled"
)
}
...
...
apps/perms/utils/asset_permission.py
View file @
ebd92547
...
...
@@ -449,6 +449,8 @@ class AssetPermissionUtil(AssetPermissionCacheMixin):
self
.
_nodes
=
None
self
.
_assets_direct
=
None
self
.
_nodes_direct
=
None
self
.
node_util
=
NodeUtil
()
self
.
tree
.
_node_util
=
self
.
node_util
@staticmethod
def
change_org_if_need
():
...
...
@@ -491,13 +493,14 @@ class AssetPermissionUtil(AssetPermissionCacheMixin):
self
.
tree
.
add_nodes
(
nodes_keys
)
pattern
=
set
()
all_nodes_keys
=
set
()
for
key
in
nodes_keys
:
pattern
.
add
(
r'^{0}$|^{0}:'
.
format
(
key
))
pattern
=
'|'
.
join
(
list
(
pattern
))
if
pattern
:
children_keys
=
self
.
node_util
.
get_all_children_keys_by_key
(
key
)
all_nodes_keys
.
update
(
set
(
children_keys
))
if
all_nodes_keys
:
assets_ids
=
Asset
.
objects
.
filter
(
nodes__key__
regex
=
pattern
nodes__key__
in
=
all_nodes_keys
)
.
valid
()
.
values_list
(
"id"
,
flat
=
True
)
.
distinct
()
else
:
assets_ids
=
[]
...
...
apps/terminal/templates/terminal/terminal_list.html
View file @
ebd92547
...
...
@@ -69,16 +69,17 @@ function initTable() {
}
}},
{
targets
:
6
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
name
=
htmlEscape
(
rowData
.
name
);
var
update_btn
=
'<a href="{% url "terminal:terminal-update" pk=DEFAULT_PK %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
);
var
delete_btn
=
'<a class="btn btn-xs btn-danger m-l-xs btn-del" data-id="{{ DEFAULT_PK }}" data-name="99991938">{% trans "Delete" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
)
.
replace
(
'99991938'
,
rowData
.
name
);
.
replace
(
'99991938'
,
name
);
var
accept_btn
=
'<a class="btn btn-xs btn-primary btn-accept" data-id="{{ DEFAULT_PK }}">{% trans "Accept" %}</a> '
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
);
var
reject_btn
=
'<a class="btn btn-xs btn-danger m-l-xs btn-del" data-id="{{ DEFAULT_PK }}" data-name="99991938">{% trans "Reject" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
)
.
replace
(
'99991938'
,
rowData
.
name
);
.
replace
(
'99991938'
,
name
);
if
(
rowData
.
is_accepted
)
{
$
(
td
).
html
(
update_btn
+
delete_btn
);
}
else
{
...
...
apps/users/models/user.py
View file @
ebd92547
...
...
@@ -111,7 +111,7 @@ class AuthMixin:
@property
def
password_will_expired
(
self
):
if
self
.
is_local
and
self
.
password_expired_remain_days
<
5
:
if
self
.
is_local
and
0
<=
self
.
password_expired_remain_days
<
5
:
return
True
return
False
...
...
apps/users/tasks.py
View file @
ebd92547
...
...
@@ -20,13 +20,13 @@ logger = get_logger(__file__)
def
check_password_expired
():
users
=
User
.
objects
.
exclude
(
role
=
User
.
ROLE_APP
)
for
user
in
users
:
if
not
user
.
is_valid
:
continue
if
not
user
.
password_will_expired
:
continue
send_password_expiration_reminder_mail
(
user
)
logger
.
info
(
"The user {} password expires in {} days"
.
format
(
user
,
user
.
password_expired_remain_days
)
)
msg
=
"The user {} password expires in {} days"
logger
.
info
(
msg
.
format
(
user
,
user
.
password_expired_remain_days
))
@shared_task
...
...
apps/users/templates/users/user_group_list.html
View file @
ebd92547
...
...
@@ -67,11 +67,12 @@ function initTable() {
$
(
td
).
html
(
'<span href="javascript:void(0);" data-toggle="tooltip" title="'
+
cellData
+
'">'
+
innerHtml
+
'</span>'
);
}},
{
targets
:
4
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
name
=
htmlEscape
(
rowData
.
name
);
var
update_btn
=
'<a href="{% url "users:user-group-update" pk=DEFAULT_PK %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
);
var
del_btn
=
'<a class="btn btn-xs btn-danger m-l-xs btn_delete_user_group" data-gid="{{ DEFAULT_PK }}" data-name="99991938">{% trans "Delete" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
)
.
replace
(
'99991938'
,
rowData
.
name
);
.
replace
(
'99991938'
,
name
);
if
(
rowData
.
id
===
1
)
{
$
(
td
).
html
(
update_btn
)
}
else
{
...
...
apps/users/templates/users/user_list.html
View file @
ebd92547
...
...
@@ -97,6 +97,7 @@ function initTable() {
}
}},
{
targets
:
7
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
name
=
htmlEscape
(
rowData
.
name
);
var
update_btn
=
""
;
if
(
rowData
.
role
===
'Admin'
&&
(
'{{ request.user.role }}'
!==
'Admin'
))
{
update_btn
=
'<a class="btn btn-xs disabled btn-info">{% trans "Update" %}</a>'
;
...
...
@@ -109,11 +110,11 @@ function initTable() {
if
(
rowData
.
id
===
1
||
rowData
.
username
===
"admin"
||
rowData
.
username
===
"{{ request.user.username }}"
||
(
rowData
.
role
===
'Admin'
&&
(
'{{ request.user.role }}'
!==
'Admin'
)))
{
del_btn
=
'<a class="btn btn-xs btn-danger m-l-xs" disabled>{% trans "Delete" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
)
.
replace
(
'99991938'
,
rowData
.
name
);
.
replace
(
'99991938'
,
name
);
}
else
{
del_btn
=
'<a class="btn btn-xs btn-danger m-l-xs btn_user_delete" data-uid="{{ DEFAULT_PK }}" data-name="99991938">{% trans "Delete" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
)
.
replace
(
'99991938'
,
rowData
.
name
);
.
replace
(
'99991938'
,
name
);
}
$
(
td
).
html
(
update_btn
+
del_btn
)
}}],
...
...
jms
View file @
ebd92547
This diff is collapsed.
Click to expand it.
requirements/requirements.txt
View file @
ebd92547
...
...
@@ -81,4 +81,5 @@ django-radius==1.3.3
ipip-ipdb==1.2.1
django-redis-sessions==0.6.1
unicodecsv==0.14.1
python-daemon==2.2.3
httpsig==1.3.0
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