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
0f8d4f5b
Commit
0f8d4f5b
authored
Jun 24, 2019
by
ibuler
Browse files
Options
Browse Files
Download
Plain Diff
[Update] 统一可连接性,添加sql debug
parents
63216add
ed8ae300
Show whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
287 additions
and
197 deletions
+287
-197
asset_user.py
apps/assets/api/asset_user.py
+3
-3
manager.py
apps/assets/backends/manager.py
+3
-0
0031_auto_20190621_1332.py
apps/assets/migrations/0031_auto_20190621_1332.py
+53
-0
asset.py
apps/assets/models/asset.py
+6
-2
base.py
apps/assets/models/base.py
+9
-9
utils.py
apps/assets/models/utils.py
+11
-8
asset.py
apps/assets/serializers/asset.py
+2
-1
asset_user.py
apps/assets/serializers/asset_user.py
+4
-3
base.py
apps/assets/serializers/base.py
+6
-0
system_user.py
apps/assets/serializers/system_user.py
+5
-33
tasks.py
apps/assets/tasks.py
+4
-18
_asset_user_list.html
apps/assets/templates/assets/_asset_user_list.html
+13
-6
admin_user_assets.html
apps/assets/templates/assets/admin_user_assets.html
+2
-29
admin_user_list.html
apps/assets/templates/assets/admin_user_list.html
+2
-2
asset_list.html
apps/assets/templates/assets/asset_list.html
+13
-7
system_user_assets.html
apps/assets/templates/assets/system_user_assets.html
+36
-36
system_user_list.html
apps/assets/templates/assets/system_user_list.html
+12
-11
system_user.py
apps/assets/views/system_user.py
+1
-1
apps.py
apps/common/apps.py
+3
-0
signals_handlers.py
apps/common/signals_handlers.py
+60
-0
encode.py
apps/common/utils/encode.py
+2
-2
settings.py
apps/jumpserver/settings.py
+1
-0
urls.py
apps/jumpserver/urls.py
+1
-0
context_processor.py
apps/orgs/context_processor.py
+2
-2
middleware.py
apps/orgs/middleware.py
+1
-1
mixins.py
apps/orgs/mixins.py
+3
-6
user_permission.py
apps/perms/api/user_permission.py
+4
-14
asset_permission.py
apps/perms/utils/asset_permission.py
+6
-0
remote_app_permission.py
apps/perms/utils/remote_app_permission.py
+6
-0
signals_handler.py
apps/settings/signals_handler.py
+2
-2
jumpserver.js
apps/static/js/jumpserver.js
+11
-1
No files found.
apps/assets/api/asset_user.py
View file @
0f8d4f5b
...
@@ -78,7 +78,7 @@ class AssetUserViewSet(IDInCacheFilterMixin, BulkModelViewSet):
...
@@ -78,7 +78,7 @@ class AssetUserViewSet(IDInCacheFilterMixin, BulkModelViewSet):
system_user_id
=
self
.
request
.
GET
.
get
(
"system_user_id"
)
system_user_id
=
self
.
request
.
GET
.
get
(
"system_user_id"
)
kwargs
=
{}
kwargs
=
{}
assets
=
[]
assets
=
None
manager
=
AssetUserManager
()
manager
=
AssetUserManager
()
if
system_user_id
:
if
system_user_id
:
...
@@ -92,7 +92,7 @@ class AssetUserViewSet(IDInCacheFilterMixin, BulkModelViewSet):
...
@@ -92,7 +92,7 @@ class AssetUserViewSet(IDInCacheFilterMixin, BulkModelViewSet):
manager
.
prefer
(
'admin_user'
)
manager
.
prefer
(
'admin_user'
)
if
asset_id
:
if
asset_id
:
asset
=
get_object_or_
none
(
Asset
,
pk
=
asset_id
)
asset
=
get_object_or_
404
(
Asset
,
id
=
asset_id
)
assets
=
[
asset
]
assets
=
[
asset
]
elif
node_id
:
elif
node_id
:
node
=
get_object_or_404
(
Node
,
id
=
node_id
)
node
=
get_object_or_404
(
Node
,
id
=
node_id
)
...
@@ -100,7 +100,7 @@ class AssetUserViewSet(IDInCacheFilterMixin, BulkModelViewSet):
...
@@ -100,7 +100,7 @@ class AssetUserViewSet(IDInCacheFilterMixin, BulkModelViewSet):
if
username
:
if
username
:
kwargs
[
'username'
]
=
username
kwargs
[
'username'
]
=
username
if
assets
:
if
assets
is
not
None
:
kwargs
[
'assets'
]
=
assets
kwargs
[
'assets'
]
=
assets
queryset
=
manager
.
filter
(
**
kwargs
)
queryset
=
manager
.
filter
(
**
kwargs
)
...
...
apps/assets/backends/manager.py
View file @
0f8d4f5b
...
@@ -33,6 +33,9 @@ class AssetUserManager:
...
@@ -33,6 +33,9 @@ class AssetUserManager:
_using
=
None
_using
=
None
def
filter
(
self
,
username
=
None
,
assets
=
None
,
latest
=
True
):
def
filter
(
self
,
username
=
None
,
assets
=
None
,
latest
=
True
):
if
assets
is
not
None
and
not
assets
:
return
AssetUserQuerySet
([])
if
self
.
_using
:
if
self
.
_using
:
backend
=
dict
(
self
.
backends
)
.
get
(
self
.
_using
)
backend
=
dict
(
self
.
backends
)
.
get
(
self
.
_using
)
if
not
backend
:
if
not
backend
:
...
...
apps/assets/migrations/0031_auto_20190621_1332.py
0 → 100644
View file @
0f8d4f5b
# Generated by Django 2.1.7 on 2019-06-21 05:32
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'assets'
,
'0030_auto_20190619_1135'
),
]
operations
=
[
migrations
.
AlterField
(
model_name
=
'adminuser'
,
name
=
'date_created'
,
field
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
'Date created'
),
),
migrations
.
AlterField
(
model_name
=
'adminuser'
,
name
=
'date_updated'
,
field
=
models
.
DateTimeField
(
auto_now
=
True
,
verbose_name
=
'Date updated'
),
),
migrations
.
AlterField
(
model_name
=
'authbook'
,
name
=
'date_created'
,
field
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
'Date created'
),
),
migrations
.
AlterField
(
model_name
=
'authbook'
,
name
=
'date_updated'
,
field
=
models
.
DateTimeField
(
auto_now
=
True
,
verbose_name
=
'Date updated'
),
),
migrations
.
AlterField
(
model_name
=
'gateway'
,
name
=
'date_created'
,
field
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
'Date created'
),
),
migrations
.
AlterField
(
model_name
=
'gateway'
,
name
=
'date_updated'
,
field
=
models
.
DateTimeField
(
auto_now
=
True
,
verbose_name
=
'Date updated'
),
),
migrations
.
AlterField
(
model_name
=
'systemuser'
,
name
=
'date_created'
,
field
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
'Date created'
),
),
migrations
.
AlterField
(
model_name
=
'systemuser'
,
name
=
'date_updated'
,
field
=
models
.
DateTimeField
(
auto_now
=
True
,
verbose_name
=
'Date updated'
),
),
]
apps/assets/models/asset.py
View file @
0f8d4f5b
...
@@ -229,11 +229,15 @@ class Asset(OrgModelMixin):
...
@@ -229,11 +229,15 @@ class Asset(OrgModelMixin):
def
connectivity
(
self
):
def
connectivity
(
self
):
if
not
self
.
admin_user
:
if
not
self
.
admin_user
:
return
Connectivity
.
unknown
()
return
Connectivity
.
unknown
()
return
self
.
admin_user
.
get_asset_connectivity
(
self
)
instance
=
self
.
admin_user
.
get_asset_user
(
self
)
return
instance
.
connectivity
@connectivity.setter
@connectivity.setter
def
connectivity
(
self
,
value
):
def
connectivity
(
self
,
value
):
self
.
admin_user
.
set_asset_connectivity
(
self
,
value
)
if
not
self
.
admin_user
:
return
instance
=
self
.
admin_user
.
get_asset_user
(
self
)
instance
.
set_asset_connectivity
(
self
,
value
)
def
get_auth_info
(
self
):
def
get_auth_info
(
self
):
if
not
self
.
admin_user
:
if
not
self
.
admin_user
:
...
...
apps/assets/models/base.py
View file @
0f8d4f5b
...
@@ -169,26 +169,26 @@ class AssetUser(OrgModelMixin):
...
@@ -169,26 +169,26 @@ class AssetUser(OrgModelMixin):
def
set_asset_connectivity
(
self
,
asset
,
c
):
def
set_asset_connectivity
(
self
,
asset
,
c
):
i
=
self
.
generate_id_with_asset
(
asset
)
i
=
self
.
generate_id_with_asset
(
asset
)
key
=
self
.
CONNECTIVITY_ASSET_CACHE_KEY
.
format
(
i
)
key
=
self
.
CONNECTIVITY_ASSET_CACHE_KEY
.
format
(
i
)
Connectivity
.
set
(
key
,
c
,
3600
)
Connectivity
.
set
(
key
,
c
)
def
load_specific_asset_auth
(
self
,
asset
):
def
get_asset_user
(
self
,
asset
):
from
..backends
import
AssetUserManager
from
..backends
import
AssetUserManager
try
:
try
:
manager
=
AssetUserManager
()
.
prefer
(
self
.
_prefer
)
manager
=
AssetUserManager
()
.
prefer
(
self
.
_prefer
)
other
=
manager
.
get
(
username
=
self
.
username
,
asset
=
asset
)
other
=
manager
.
get
(
username
=
self
.
username
,
asset
=
asset
)
return
other
except
Exception
as
e
:
except
Exception
as
e
:
logger
.
error
(
e
,
exc_info
=
True
)
logger
.
error
(
e
,
exc_info
=
True
)
else
:
return
None
self
.
_merge_auth
(
other
)
def
load_specific_asset_auth
(
self
,
asset
):
instance
=
self
.
get_asset_user
(
asset
)
if
instance
:
self
.
_merge_auth
(
instance
)
def
_merge_auth
(
self
,
other
):
def
_merge_auth
(
self
,
other
):
if
not
other
:
return
if
other
.
password
:
self
.
password
=
other
.
password
self
.
password
=
other
.
password
if
other
.
public_key
:
self
.
public_key
=
other
.
public_key
self
.
public_key
=
other
.
public_key
if
other
.
private_key
:
self
.
private_key
=
other
.
private_key
self
.
private_key
=
other
.
private_key
def
clear_auth
(
self
):
def
clear_auth
(
self
):
...
...
apps/assets/models/utils.py
View file @
0f8d4f5b
...
@@ -45,24 +45,24 @@ class Connectivity:
...
@@ -45,24 +45,24 @@ class Connectivity:
(
UNKNOWN
,
_
(
"Unknown"
)),
(
UNKNOWN
,
_
(
"Unknown"
)),
)
)
value
=
UNKNOWN
status
=
UNKNOWN
datetime
=
timezone
.
now
()
datetime
=
timezone
.
now
()
def
__init__
(
self
,
value
,
datetime
):
def
__init__
(
self
,
status
,
datetime
):
self
.
value
=
value
self
.
status
=
status
self
.
datetime
=
datetime
self
.
datetime
=
datetime
def
display
(
self
):
def
display
(
self
):
return
dict
(
self
.
__class__
.
CONNECTIVITY_CHOICES
)
.
get
(
self
.
value
)
return
dict
(
self
.
__class__
.
CONNECTIVITY_CHOICES
)
.
get
(
self
.
status
)
def
is_reachable
(
self
):
def
is_reachable
(
self
):
return
self
.
value
==
self
.
REACHABLE
return
self
.
status
==
self
.
REACHABLE
def
is_unreachable
(
self
):
def
is_unreachable
(
self
):
return
self
.
value
==
self
.
UNREACHABLE
return
self
.
status
==
self
.
UNREACHABLE
def
is_unknown
(
self
):
def
is_unknown
(
self
):
return
self
.
value
==
self
.
UNKNOWN
return
self
.
status
==
self
.
UNKNOWN
@classmethod
@classmethod
def
unreachable
(
cls
):
def
unreachable
(
cls
):
...
@@ -96,4 +96,7 @@ class Connectivity:
...
@@ -96,4 +96,7 @@ class Connectivity:
cls
.
set
(
key
,
cls
.
reachable
(),
ttl
)
cls
.
set
(
key
,
cls
.
reachable
(),
ttl
)
def
__eq__
(
self
,
other
):
def
__eq__
(
self
,
other
):
return
self
.
value
==
other
.
value
return
self
.
status
==
other
.
status
def
__str__
(
self
):
return
self
.
display
()
apps/assets/serializers/asset.py
View file @
0f8d4f5b
...
@@ -9,6 +9,7 @@ from orgs.mixins import BulkOrgResourceModelSerializer
...
@@ -9,6 +9,7 @@ from orgs.mixins import BulkOrgResourceModelSerializer
from
common.serializers
import
AdaptedBulkListSerializer
from
common.serializers
import
AdaptedBulkListSerializer
from
..models
import
Asset
,
Protocol
from
..models
import
Asset
,
Protocol
from
.system_user
import
AssetSystemUserSerializer
from
.system_user
import
AssetSystemUserSerializer
from
.base
import
ConnectivitySerializer
__all__
=
[
__all__
=
[
'AssetSerializer'
,
'AssetGrantedSerializer'
,
'AssetSimpleSerializer'
,
'AssetSerializer'
,
'AssetGrantedSerializer'
,
'AssetSimpleSerializer'
,
...
@@ -43,6 +44,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
...
@@ -43,6 +44,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
protocols
=
ProtocolsRelatedField
(
protocols
=
ProtocolsRelatedField
(
many
=
True
,
queryset
=
Protocol
.
objects
.
all
(),
label
=
_
(
"Protocols"
)
many
=
True
,
queryset
=
Protocol
.
objects
.
all
(),
label
=
_
(
"Protocols"
)
)
)
connectivity
=
ConnectivitySerializer
(
read_only
=
True
,
label
=
_
(
"Connectivity"
))
"""
"""
资产的数据结构
资产的数据结构
...
@@ -69,7 +71,6 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
...
@@ -69,7 +71,6 @@ class AssetSerializer(BulkOrgResourceModelSerializer):
'protocol'
:
{
'write_only'
:
True
},
'protocol'
:
{
'write_only'
:
True
},
'port'
:
{
'write_only'
:
True
},
'port'
:
{
'write_only'
:
True
},
'hardware_info'
:
{
'label'
:
_
(
'Hardware info'
)},
'hardware_info'
:
{
'label'
:
_
(
'Hardware info'
)},
'connectivity'
:
{
'label'
:
_
(
'Connectivity'
)},
'org_name'
:
{
'label'
:
_
(
'Org name'
)}
'org_name'
:
{
'label'
:
_
(
'Org name'
)}
}
}
...
...
apps/assets/serializers/asset_user.py
View file @
0f8d4f5b
...
@@ -4,11 +4,12 @@
...
@@ -4,11 +4,12 @@
from
django.utils.translation
import
ugettext
as
_
from
django.utils.translation
import
ugettext
as
_
from
rest_framework
import
serializers
from
rest_framework
import
serializers
from
..models
import
AuthBook
,
Asset
from
..backends
import
AssetUserManager
from
common.utils
import
validate_ssh_private_key
from
common.utils
import
validate_ssh_private_key
from
common.serializers
import
AdaptedBulkListSerializer
from
common.serializers
import
AdaptedBulkListSerializer
from
orgs.mixins
import
BulkOrgResourceModelSerializer
from
orgs.mixins
import
BulkOrgResourceModelSerializer
from
..models
import
AuthBook
,
Asset
from
..backends
import
AssetUserManager
from
.base
import
ConnectivitySerializer
__all__
=
[
__all__
=
[
...
@@ -26,7 +27,7 @@ class BasicAssetSerializer(serializers.ModelSerializer):
...
@@ -26,7 +27,7 @@ class BasicAssetSerializer(serializers.ModelSerializer):
class
AssetUserSerializer
(
BulkOrgResourceModelSerializer
):
class
AssetUserSerializer
(
BulkOrgResourceModelSerializer
):
hostname
=
serializers
.
CharField
(
read_only
=
True
,
label
=
_
(
"Hostname"
))
hostname
=
serializers
.
CharField
(
read_only
=
True
,
label
=
_
(
"Hostname"
))
ip
=
serializers
.
CharField
(
read_only
=
True
,
label
=
_
(
"IP"
))
ip
=
serializers
.
CharField
(
read_only
=
True
,
label
=
_
(
"IP"
))
connectivity
=
serializers
.
CharField
(
read_only
=
True
,
label
=
_
(
"Connectivity"
))
connectivity
=
ConnectivitySerializer
(
read_only
=
True
,
label
=
_
(
"Connectivity"
))
password
=
serializers
.
CharField
(
password
=
serializers
.
CharField
(
max_length
=
256
,
allow_blank
=
True
,
allow_null
=
True
,
write_only
=
True
,
max_length
=
256
,
allow_blank
=
True
,
allow_null
=
True
,
write_only
=
True
,
...
...
apps/assets/serializers/base.py
View file @
0f8d4f5b
...
@@ -24,3 +24,8 @@ class AuthSerializer(serializers.ModelSerializer):
...
@@ -24,3 +24,8 @@ class AuthSerializer(serializers.ModelSerializer):
self
.
instance
.
set_auth
(
password
=
password
,
private_key
=
private_key
,
self
.
instance
.
set_auth
(
password
=
password
,
private_key
=
private_key
,
public_key
=
public_key
)
public_key
=
public_key
)
return
self
.
instance
return
self
.
instance
class
ConnectivitySerializer
(
serializers
.
Serializer
):
status
=
serializers
.
IntegerField
()
datetime
=
serializers
.
DateTimeField
()
\ No newline at end of file
apps/assets/serializers/system_user.py
View file @
0f8d4f5b
...
@@ -15,51 +15,23 @@ class SystemUserSerializer(BulkOrgResourceModelSerializer):
...
@@ -15,51 +15,23 @@ class SystemUserSerializer(BulkOrgResourceModelSerializer):
password
=
serializers
.
CharField
(
password
=
serializers
.
CharField
(
required
=
False
,
write_only
=
True
,
label
=
_
(
'Password'
)
required
=
False
,
write_only
=
True
,
label
=
_
(
'Password'
)
)
)
unreachable_amount
=
serializers
.
SerializerMethodField
(
label
=
_
(
'Unreachable'
)
)
unreachable_assets
=
serializers
.
SerializerMethodField
(
label
=
_
(
'Unreachable assets'
)
)
reachable_assets
=
serializers
.
SerializerMethodField
(
label
=
_
(
'Reachable assets'
)
)
reachable_amount
=
serializers
.
SerializerMethodField
(
label
=
_
(
'Reachable'
))
assets_amount
=
serializers
.
SerializerMethodField
(
label
=
_
(
'Asset'
))
class
Meta
:
class
Meta
:
model
=
SystemUser
model
=
SystemUser
list_serializer_class
=
AdaptedBulkListSerializer
list_serializer_class
=
AdaptedBulkListSerializer
fields
=
[
fields
=
[
'id'
,
'name'
,
'username'
,
'login_mode'
,
'login_mode_display'
,
'id'
,
'name'
,
'username'
,
'login_mode'
,
'login_mode_display'
,
'login_mode_display'
,
'priority'
,
'protocol'
,
'auto_push'
,
'priority'
,
'protocol'
,
'auto_push'
,
'password'
,
'password'
,
'assets_amount'
,
'reachable_amount'
,
'reachable_assets'
,
'cmd_filters'
,
'sudo'
,
'shell'
,
'comment'
,
'nodes'
,
'assets'
,
'unreachable_amount'
,
'unreachable_assets'
,
'cmd_filters'
,
'sudo'
,
'assets_amount'
,
'connectivity_amount'
'shell'
,
'comment'
,
'nodes'
,
'assets'
]
]
extra_kwargs
=
{
extra_kwargs
=
{
'assets_amount'
:
{
'label'
:
_
(
'Asset'
)},
'connectivity_amount'
:
{
'label'
:
_
(
'Connectivity'
)},
'login_mode_display'
:
{
'label'
:
_
(
'Login mode display'
)},
'login_mode_display'
:
{
'label'
:
_
(
'Login mode display'
)},
'created_by'
:
{
'read_only'
:
True
},
'created_by'
:
{
'read_only'
:
True
},
}
}
@staticmethod
def
get_unreachable_assets
(
obj
):
return
obj
.
assets_unreachable
@staticmethod
def
get_reachable_assets
(
obj
):
return
obj
.
assets_reachable
def
get_unreachable_amount
(
self
,
obj
):
return
len
(
self
.
get_unreachable_assets
(
obj
))
def
get_reachable_amount
(
self
,
obj
):
return
len
(
self
.
get_reachable_assets
(
obj
))
@staticmethod
def
get_assets_amount
(
obj
):
return
len
(
obj
.
get_related_assets
())
class
SystemUserAuthSerializer
(
AuthSerializer
):
class
SystemUserAuthSerializer
(
AuthSerializer
):
"""
"""
...
...
apps/assets/tasks.py
View file @
0f8d4f5b
...
@@ -208,8 +208,7 @@ def test_asset_connectivity_util(assets, task_name=None):
...
@@ -208,8 +208,7 @@ def test_asset_connectivity_util(assets, task_name=None):
pattern
=
'all'
,
options
=
const
.
TASK_OPTIONS
,
run_as_admin
=
True
,
pattern
=
'all'
,
options
=
const
.
TASK_OPTIONS
,
run_as_admin
=
True
,
created_by
=
created_by
,
created_by
=
created_by
,
)
)
result
=
task
.
run
()
raw
,
summary
=
task
.
run
()
summary
=
result
.
get
(
"summary"
,
{})
success
=
summary
.
get
(
'success'
,
False
)
success
=
summary
.
get
(
'success'
,
False
)
contacted
=
summary
.
get
(
'contacted'
,
{})
contacted
=
summary
.
get
(
'contacted'
,
{})
dark
=
summary
.
get
(
'dark'
,
{})
dark
=
summary
.
get
(
'dark'
,
{})
...
@@ -332,8 +331,7 @@ def test_system_user_connectivity_util(system_user, assets, task_name):
...
@@ -332,8 +331,7 @@ def test_system_user_connectivity_util(system_user, assets, task_name):
pattern
=
'all'
,
options
=
const
.
TASK_OPTIONS
,
pattern
=
'all'
,
options
=
const
.
TASK_OPTIONS
,
run_as
=
system_user
.
username
,
created_by
=
system_user
.
org_id
,
run_as
=
system_user
.
username
,
created_by
=
system_user
.
org_id
,
)
)
result
=
task
.
run
()
raw
,
summary
=
task
.
run
()
summary
=
result
[
1
]
success
=
summary
.
get
(
'success'
,
False
)
success
=
summary
.
get
(
'success'
,
False
)
contacted
=
summary
.
get
(
'contacted'
,
{})
contacted
=
summary
.
get
(
'contacted'
,
{})
dark
=
summary
.
get
(
'dark'
,
{})
dark
=
summary
.
get
(
'dark'
,
{})
...
@@ -563,18 +561,6 @@ def get_test_asset_user_connectivity_tasks(asset):
...
@@ -563,18 +561,6 @@ def get_test_asset_user_connectivity_tasks(asset):
return
tasks
return
tasks
@shared_task
def
set_asset_user_connectivity_info
(
asset_user
,
result
):
summary
=
result
[
1
]
if
summary
.
get
(
'contacted'
):
connectivity
=
1
elif
summary
.
get
(
"dark"
):
connectivity
=
0
else
:
connectivity
=
3
asset_user
.
connectivity
=
connectivity
@shared_task
@shared_task
def
test_asset_user_connectivity_util
(
asset_user
,
task_name
,
run_as_admin
=
False
):
def
test_asset_user_connectivity_util
(
asset_user
,
task_name
,
run_as_admin
=
False
):
"""
"""
...
@@ -603,8 +589,8 @@ def test_asset_user_connectivity_util(asset_user, task_name, run_as_admin=False)
...
@@ -603,8 +589,8 @@ def test_asset_user_connectivity_util(asset_user, task_name, run_as_admin=False)
else
:
else
:
kwargs
[
"run_as"
]
=
asset_user
.
username
kwargs
[
"run_as"
]
=
asset_user
.
username
task
,
created
=
update_or_create_ansible_task
(
*
args
,
**
kwargs
)
task
,
created
=
update_or_create_ansible_task
(
*
args
,
**
kwargs
)
r
esult
=
task
.
run
()
r
aw
,
summary
=
task
.
run
()
asset_user
.
set_connectivity
(
result
.
get
(
"summary"
,
{})
)
asset_user
.
set_connectivity
(
summary
)
@shared_task
@shared_task
...
...
apps/assets/templates/assets/_asset_user_list.html
View file @
0f8d4f5b
...
@@ -33,6 +33,7 @@ var assetUserTable;
...
@@ -33,6 +33,7 @@ var assetUserTable;
var
needPush
=
false
;
var
needPush
=
false
;
var
prefer
=
null
;
var
prefer
=
null
;
var
lastMFATime
=
"{{ request.session.OTP_LAST_VERIFY_TIME }}"
;
var
lastMFATime
=
"{{ request.session.OTP_LAST_VERIFY_TIME }}"
;
var
testDatetime
=
"{% trans 'Test datetime: ' %}"
;
function
initAssetUserTable
()
{
function
initAssetUserTable
()
{
var
options
=
{
var
options
=
{
...
@@ -41,13 +42,19 @@ function initAssetUserTable() {
...
@@ -41,13 +42,19 @@ function initAssetUserTable() {
columnDefs
:
[
columnDefs
:
[
{
{
targets
:
5
,
createdCell
:
function
(
td
,
cellData
)
{
targets
:
5
,
createdCell
:
function
(
td
,
cellData
)
{
if
(
cellData
==
1
)
{
var
innerHtml
=
""
;
$
(
td
).
html
(
'<i class="fa fa-circle text-navy"></i>'
)
if
(
cellData
.
status
==
1
)
{
}
else
if
(
cellData
==
0
)
{
innerHtml
=
'<i class="fa fa-circle text-navy"></i>'
$
(
td
).
html
(
'<i class="fa fa-circle text-danger"></i>'
)
}
else
if
(
cellData
.
status
==
0
)
{
innerHtml
=
'<i class="fa fa-circle text-danger"></i>'
}
else
{
}
else
{
$
(
td
).
html
(
'<i class="fa fa-circle text-warning"></i>'
)
innerHtml
=
'<i class="fa fa-circle text-warning"></i>'
}
}
var
date
=
new
Date
(
cellData
.
datetime
);
var
dateManual
=
date
.
toLocaleString
();
var
dataContent
=
testDatetime
+
dateManual
;
innerHtml
=
"<a data-toggle='popover' data-content='"
+
dataContent
+
"'"
+
'data-placement="auto bottom"'
+
">"
+
innerHtml
+
"</a>"
;
$
(
td
).
html
(
innerHtml
);
}
}
},
},
{
{
...
@@ -102,7 +109,7 @@ $(document).ready(function(){
...
@@ -102,7 +109,7 @@ $(document).ready(function(){
authUsername
=
$
(
this
).
data
(
'user'
);
authUsername
=
$
(
this
).
data
(
'user'
);
var
now
=
new
Date
();
var
now
=
new
Date
();
var
nowTime
=
now
.
getTime
()
/
1000
;
var
nowTime
=
now
.
getTime
()
/
1000
;
if
(
nowTime
-
lastMFATime
>
60
*
10
)
{
if
(
!
lastMFATime
||
nowTime
-
lastMFATime
>
60
*
10
)
{
mfaFor
=
"viewAuth"
;
mfaFor
=
"viewAuth"
;
$
(
"#mfa_auth_confirm"
).
modal
(
"show"
);
$
(
"#mfa_auth_confirm"
).
modal
(
"show"
);
}
else
{
}
else
{
...
...
apps/assets/templates/assets/admin_user_assets.html
View file @
0f8d4f5b
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
</ul>
</ul>
</div>
</div>
<div
class=
"tab-content"
>
<div
class=
"tab-content"
>
<div
class=
"col-sm-
9
"
style=
"padding-left: 0;"
>
<div
class=
"col-sm-
8
"
style=
"padding-left: 0;"
>
<div
class=
"ibox float-e-margins"
>
<div
class=
"ibox float-e-margins"
>
<div
class=
"ibox-title"
>
<div
class=
"ibox-title"
>
<span
style=
"float: left"
>
{% trans 'Asset list of ' %}
<b>
{{ admin_user.name }}
</b></span>
<span
style=
"float: left"
>
{% trans 'Asset list of ' %}
<b>
{{ admin_user.name }}
</b></span>
...
@@ -46,7 +46,7 @@
...
@@ -46,7 +46,7 @@
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"col-sm-
3
"
style=
"padding-left: 0;padding-right: 0"
>
<div
class=
"col-sm-
4
"
style=
"padding-left: 0;padding-right: 0"
>
<div
class=
"panel panel-primary"
>
<div
class=
"panel panel-primary"
>
<div
class=
"panel-heading"
>
<div
class=
"panel-heading"
>
<i
class=
"fa fa-info-circle"
></i>
{% trans 'Quick update' %}
<i
class=
"fa fa-info-circle"
></i>
{% trans 'Quick update' %}
...
@@ -81,21 +81,6 @@ $(document).ready(function () {
...
@@ -81,21 +81,6 @@ $(document).ready(function () {
prefer
=
"admin_user"
;
prefer
=
"admin_user"
;
initAssetUserTable
();
initAssetUserTable
();
})
})
.
on
(
'click'
,
'.btn-test-asset'
,
function
()
{
var
asset_id
=
$
(
this
).
data
(
'uid'
);
var
the_url
=
"{% url 'api-assets:asset-alive-test' pk=DEFAULT_PK %}"
.
replace
(
'{{ DEFAULT_PK }}'
,
asset_id
);
var
success
=
function
(
data
)
{
var
task_id
=
data
.
task
;
var
url
=
'{% url "ops:celery-task-log" pk=DEFAULT_PK %}'
.
replace
(
"{{ DEFAULT_PK }}"
,
task_id
);
window
.
open
(
url
,
''
,
'width=800,height=600,left=400,top=400'
)
};
APIUpdateAttr
({
url
:
the_url
,
method
:
'GET'
,
success
:
success
,
flash_message
:
false
});
})
.
on
(
'click'
,
'.btn-test-connective'
,
function
()
{
.
on
(
'click'
,
'.btn-test-connective'
,
function
()
{
var
the_url
=
"{% url 'api-assets:admin-user-connective' pk=admin_user.id %}"
;
var
the_url
=
"{% url 'api-assets:admin-user-connective' pk=admin_user.id %}"
;
var
success
=
function
(
data
)
{
var
success
=
function
(
data
)
{
...
@@ -110,17 +95,5 @@ $(document).ready(function () {
...
@@ -110,17 +95,5 @@ $(document).ready(function () {
flash_message
:
false
flash_message
:
false
});
});
})
})
.
on
(
'click'
,
'.btn-update-asset-user-auth'
,
function
()
{
asset_id
=
$
(
this
).
data
(
'aid'
);
hostname
=
$
(
this
).
data
(
'hostname'
);
username
=
'{{ admin_user.username }}'
;
$
(
"#asset_user_auth_update_modal"
).
modal
();
})
.
on
(
"click"
,
".btn-view-auth"
,
function
(
evt
)
{
asset_id
=
$
(
this
).
data
(
"aid"
)
;
host
=
$
(
this
).
data
(
"hostname"
);
username
=
"{{ admin_user.username }}"
;
$
(
"#asset_user_auth_view"
).
modal
();
})
</script>
</script>
{% endblock %}
{% endblock %}
apps/assets/templates/assets/admin_user_list.html
View file @
0f8d4f5b
...
@@ -81,7 +81,7 @@ function initTable() {
...
@@ -81,7 +81,7 @@ function initTable() {
}
else
{
}
else
{
innerHtml
=
"<span>"
+
data
+
"</span>"
;
innerHtml
=
"<span>"
+
data
+
"</span>"
;
}
}
$
(
td
).
html
(
'<span href="javascript:void(0);" data-toggle="tooltip" title="'
+
data
+
'">'
+
innerHtml
+
'</span>'
);
$
(
td
).
html
(
innerHtml
)
}},
}},
{
targets
:
5
,
createdCell
:
function
(
td
,
cellData
)
{
{
targets
:
5
,
createdCell
:
function
(
td
,
cellData
)
{
var
data
=
cellData
[
'unreachable'
];
var
data
=
cellData
[
'unreachable'
];
...
@@ -127,7 +127,7 @@ function initTable() {
...
@@ -127,7 +127,7 @@ function initTable() {
}
}
$
(
document
).
ready
(
function
(){
$
(
document
).
ready
(
function
(){
initTable
()
initTable
()
;
})
})
.
on
(
'click'
,
'.btn_admin_user_delete'
,
function
()
{
.
on
(
'click'
,
'.btn_admin_user_delete'
,
function
()
{
...
...
apps/assets/templates/assets/asset_list.html
View file @
0f8d4f5b
...
@@ -163,6 +163,7 @@ var zTree, rMenu, asset_table, show = 0;
...
@@ -163,6 +163,7 @@ var zTree, rMenu, asset_table, show = 0;
var
update_node_action
=
""
;
var
update_node_action
=
""
;
var
current_node_id
=
null
;
var
current_node_id
=
null
;
var
current_node
=
null
;
var
current_node
=
null
;
var
testDatetime
=
"{% trans 'Test datetime: ' %}"
;
function
initTable
()
{
function
initTable
()
{
var
options
=
{
var
options
=
{
ele
:
$
(
'#asset_list_table'
),
ele
:
$
(
'#asset_list_table'
),
...
@@ -176,16 +177,21 @@ function initTable() {
...
@@ -176,16 +177,21 @@ function initTable() {
{
targets
:
3
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
{
targets
:
3
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
$
(
td
).
html
(
rowData
.
hardware_info
)
$
(
td
).
html
(
rowData
.
hardware_info
)
}},
}},
{
targets
:
4
,
createdCell
:
function
(
td
,
cellData
)
{
{
targets
:
4
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
if
(
cellData
===
1
){
var
innerHtml
=
""
;
$
(
td
).
html
(
'<i class="fa fa-circle text-navy"></i>'
)
if
(
cellData
.
status
==
1
)
{
}
else
if
(
cellData
===
0
)
{
innerHtml
=
'<i class="fa fa-circle text-navy"></i>'
$
(
td
).
html
(
'<i class="fa fa-circle text-danger"></i>'
)
}
else
if
(
cellData
.
status
==
0
)
{
innerHtml
=
'<i class="fa fa-circle text-danger"></i>'
}
else
{
}
else
{
$
(
td
).
html
(
'<i class="fa fa-circle text-warning"></i>'
)
innerHtml
=
'<i class="fa fa-circle text-warning"></i>'
}
}
var
date
=
new
Date
(
cellData
.
datetime
);
var
dateManual
=
date
.
toLocaleString
();
var
dataContent
=
testDatetime
+
dateManual
;
innerHtml
=
"<a data-toggle='popover' data-content='"
+
dataContent
+
"'"
+
'data-placement="auto bottom"'
+
">"
+
innerHtml
+
"</a>"
;
$
(
td
).
html
(
innerHtml
);
}},
}},
{
targets
:
5
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
{
targets
:
5
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
update_btn
=
'<a href="{% url "assets:asset-update" pk=DEFAULT_PK %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'
.
replace
(
"{{ DEFAULT_PK }}"
,
cellData
);
var
update_btn
=
'<a href="{% url "assets:asset-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_asset_delete" data-uid="{{ DEFAULT_PK }}">{% trans "Delete" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
);
var
del_btn
=
'<a class="btn btn-xs btn-danger m-l-xs btn_asset_delete" data-uid="{{ DEFAULT_PK }}">{% trans "Delete" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
);
...
...
apps/assets/templates/assets/system_user_asset.html
→
apps/assets/templates/assets/system_user_asset
s
.html
View file @
0f8d4f5b
...
@@ -25,7 +25,7 @@
...
@@ -25,7 +25,7 @@
</ul>
</ul>
</div>
</div>
<div
class=
"tab-content"
>
<div
class=
"tab-content"
>
<div
class=
"col-sm-
9
"
style=
"padding-left: 0;"
>
<div
class=
"col-sm-
8
"
style=
"padding-left: 0;"
>
<div
class=
"ibox float-e-margins"
>
<div
class=
"ibox float-e-margins"
>
<div
class=
"ibox-title"
>
<div
class=
"ibox-title"
>
<span
style=
"float: left"
>
{% trans 'Assets of ' %}
<b>
{{ system_user.name }}
</b><span
class=
"badge"
>
{{ paginator.count }}
</span></span>
<span
style=
"float: left"
>
{% trans 'Assets of ' %}
<b>
{{ system_user.name }}
</b><span
class=
"badge"
>
{{ paginator.count }}
</span></span>
...
@@ -48,7 +48,7 @@
...
@@ -48,7 +48,7 @@
</div>
</div>
</div>
</div>
</div>
</div>
<div
class=
"col-sm-
3
"
style=
"padding-left: 0;padding-right: 0"
>
<div
class=
"col-sm-
4
"
style=
"padding-left: 0;padding-right: 0"
>
<div
class=
"panel panel-primary"
>
<div
class=
"panel panel-primary"
>
<div
class=
"panel-heading"
>
<div
class=
"panel-heading"
>
<i
class=
"fa fa-info-circle"
></i>
{% trans 'Quick update' %}
<i
class=
"fa fa-info-circle"
></i>
{% trans 'Quick update' %}
...
@@ -169,40 +169,6 @@ $(document).ready(function () {
...
@@ -169,40 +169,6 @@ $(document).ready(function () {
initAssetUserTable
();
initAssetUserTable
();
})
})
.
on
(
'click'
,
'.btn-push'
,
function
()
{
var
the_url
=
"{% url 'api-assets:system-user-push' pk=system_user.id %}"
;
var
error
=
function
(
data
)
{
alert
(
data
)
};
var
success
=
function
(
data
)
{
var
task_id
=
data
.
task
;
var
url
=
'{% url "ops:celery-task-log" pk=DEFAULT_PK %}'
.
replace
(
"{{ DEFAULT_PK }}"
,
task_id
);
window
.
open
(
url
,
''
,
'width=800,height=600,left=400,top=400'
)
};
APIUpdateAttr
({
url
:
the_url
,
error
:
error
,
method
:
'GET'
,
success
:
success
});
})
.
on
(
'click'
,
'.btn-test-connective'
,
function
()
{
var
the_url
=
"{% url 'api-assets:system-user-connective' pk=system_user.id %}"
;
var
error
=
function
(
data
)
{
alert
(
data
)
};
var
success
=
function
(
data
)
{
var
task_id
=
data
.
task
;
var
url
=
'{% url "ops:celery-task-log" pk=DEFAULT_PK %}'
.
replace
(
"{{ DEFAULT_PK }}"
,
task_id
);
window
.
open
(
url
,
''
,
'width=800,height=600,left=400,top=400'
)
};
APIUpdateAttr
({
url
:
the_url
,
error
:
error
,
method
:
'GET'
,
success
:
success
});
})
.
on
(
'click'
,
'.btn-remove-from-node'
,
function
()
{
.
on
(
'click'
,
'.btn-remove-from-node'
,
function
()
{
var
$this
=
$
(
this
);
var
$this
=
$
(
this
);
var
$tr
=
$this
.
closest
(
'tr'
);
var
$tr
=
$this
.
closest
(
'tr'
);
...
@@ -230,6 +196,23 @@ $(document).ready(function () {
...
@@ -230,6 +196,23 @@ $(document).ready(function () {
});
});
updateSystemUserNode
(
nodes
);
updateSystemUserNode
(
nodes
);
})
})
.
on
(
'click'
,
'.btn-push'
,
function
()
{
var
the_url
=
"{% url 'api-assets:system-user-push' pk=system_user.id %}"
;
var
error
=
function
(
data
)
{
alert
(
data
)
};
var
success
=
function
(
data
)
{
var
task_id
=
data
.
task
;
var
url
=
'{% url "ops:celery-task-log" pk=DEFAULT_PK %}'
.
replace
(
"{{ DEFAULT_PK }}"
,
task_id
);
window
.
open
(
url
,
''
,
'width=800,height=600,left=400,top=400'
)
};
APIUpdateAttr
({
url
:
the_url
,
error
:
error
,
method
:
'GET'
,
success
:
success
});
})
.
on
(
'click'
,
'.btn-push-auth'
,
function
()
{
.
on
(
'click'
,
'.btn-push-auth'
,
function
()
{
var
$this
=
$
(
this
);
var
$this
=
$
(
this
);
var
asset_id
=
$this
.
data
(
'asset'
);
var
asset_id
=
$this
.
data
(
'asset'
);
...
@@ -250,6 +233,23 @@ $(document).ready(function () {
...
@@ -250,6 +233,23 @@ $(document).ready(function () {
error
:
error
error
:
error
})
})
})
})
.
on
(
'click'
,
'.btn-test-connective'
,
function
()
{
var
the_url
=
"{% url 'api-assets:system-user-connective' pk=system_user.id %}"
;
var
error
=
function
(
data
)
{
alert
(
data
)
};
var
success
=
function
(
data
)
{
var
task_id
=
data
.
task
;
var
url
=
'{% url "ops:celery-task-log" pk=DEFAULT_PK %}'
.
replace
(
"{{ DEFAULT_PK }}"
,
task_id
);
window
.
open
(
url
,
''
,
'width=800,height=600,left=400,top=400'
)
};
APIUpdateAttr
({
url
:
the_url
,
error
:
error
,
method
:
'GET'
,
success
:
success
});
})
</script>
</script>
...
...
apps/assets/templates/assets/system_user_list.html
View file @
0f8d4f5b
...
@@ -80,27 +80,29 @@ function initTable() {
...
@@ -80,27 +80,29 @@ function initTable() {
}},
}},
{
targets
:
6
,
createdCell
:
function
(
td
,
cellData
)
{
{
targets
:
6
,
createdCell
:
function
(
td
,
cellData
)
{
var
innerHtml
=
""
;
var
innerHtml
=
""
;
if
(
cellData
!==
0
)
{
var
data
=
cellData
[
'reachable'
];
innerHtml
=
"<span class='text-navy'>"
+
cellData
+
"</span>"
;
if
(
data
!==
0
)
{
innerHtml
=
"<span class='text-navy'>"
+
data
+
"</span>"
;
}
else
{
}
else
{
innerHtml
=
"<span>"
+
cellD
ata
+
"</span>"
;
innerHtml
=
"<span>"
+
d
ata
+
"</span>"
;
}
}
$
(
td
).
html
(
'<span href="javascript:void(0);" data-toggle="tooltip" title="'
+
cellData
+
'">'
+
innerHtml
+
'</span>'
);
$
(
td
).
html
(
innerHtml
)
}},
}},
{
targets
:
7
,
createdCell
:
function
(
td
,
cellData
)
{
{
targets
:
7
,
createdCell
:
function
(
td
,
cellData
)
{
var
data
=
cellData
[
'unreachable'
];
var
innerHtml
=
""
;
var
innerHtml
=
""
;
if
(
cellD
ata
!==
0
)
{
if
(
d
ata
!==
0
)
{
innerHtml
=
"<span class='text-danger'>"
+
cellD
ata
+
"</span>"
;
innerHtml
=
"<span class='text-danger'>"
+
d
ata
+
"</span>"
;
}
else
{
}
else
{
innerHtml
=
"<span>"
+
cellD
ata
+
"</span>"
;
innerHtml
=
"<span>"
+
d
ata
+
"</span>"
;
}
}
$
(
td
).
html
(
'<span href="javascript:void(0);" data-toggle="tooltip" title="'
+
cellD
ata
+
'">'
+
innerHtml
+
'</span>'
);
$
(
td
).
html
(
'<span href="javascript:void(0);" data-toggle="tooltip" title="'
+
d
ata
+
'">'
+
innerHtml
+
'</span>'
);
}},
}},
{
targets
:
8
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
{
targets
:
8
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
val
=
0
;
var
val
=
0
;
var
innerHtml
=
""
;
var
innerHtml
=
""
;
var
total
=
rowData
.
assets_amount
;
var
total
=
rowData
.
assets_amount
;
var
reachable
=
rowData
.
reachable_amount
;
var
reachable
=
cellData
.
reachable
;
if
(
total
!==
0
)
{
if
(
total
!==
0
)
{
val
=
reachable
/
total
*
100
;
val
=
reachable
/
total
*
100
;
}
}
...
@@ -112,7 +114,6 @@ function initTable() {
...
@@ -112,7 +114,6 @@ function initTable() {
innerHtml
=
"<span class='text-danger'>"
+
num
.
toFixed
(
1
)
+
"% </span>"
;
innerHtml
=
"<span class='text-danger'>"
+
num
.
toFixed
(
1
)
+
"% </span>"
;
}
}
$
(
td
).
html
(
'<span href="javascript:void(0);" data-toggle="tooltip" title="'
+
cellData
+
'">'
+
innerHtml
+
'</span>'
);
$
(
td
).
html
(
'<span href="javascript:void(0);" data-toggle="tooltip" title="'
+
cellData
+
'">'
+
innerHtml
+
'</span>'
);
}},
}},
{
targets
:
10
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
{
targets
:
10
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
update_btn
=
'<a href="{% url "assets:system-user-update" pk=DEFAULT_PK %}" class="btn btn-xs m-l-xs btn-info">{% trans "Update" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
);
var
update_btn
=
'<a href="{% url "assets:system-user-update" pk=DEFAULT_PK %}" class="btn btn-xs m-l-xs btn-info">{% trans "Update" %}</a>'
.
replace
(
'{{ DEFAULT_PK }}'
,
cellData
);
...
@@ -122,7 +123,7 @@ function initTable() {
...
@@ -122,7 +123,7 @@ function initTable() {
ajax_url
:
'{% url "api-assets:system-user-list" %}'
,
ajax_url
:
'{% url "api-assets:system-user-list" %}'
,
columns
:
[
columns
:
[
{
data
:
"id"
},
{
data
:
"name"
},
{
data
:
"username"
},
{
data
:
"protocol"
},
{
data
:
"login_mode_display"
},
{
data
:
"assets_amount"
},
{
data
:
"id"
},
{
data
:
"name"
},
{
data
:
"username"
},
{
data
:
"protocol"
},
{
data
:
"login_mode_display"
},
{
data
:
"assets_amount"
},
{
data
:
"
reachable_amount"
},
{
data
:
"unreachable_amount"
},
{
data
:
"id
"
},
{
data
:
"comment"
},
{
data
:
"id"
}
{
data
:
"
connectivity_amount"
},
{
data
:
"connectivity_amount"
},
{
data
:
"connectivity_amount
"
},
{
data
:
"comment"
},
{
data
:
"id"
}
],
],
op_html
:
$
(
'#actions'
).
html
()
op_html
:
$
(
'#actions'
).
html
()
};
};
...
...
apps/assets/views/system_user.py
View file @
0f8d4f5b
...
@@ -92,7 +92,7 @@ class SystemUserDeleteView(PermissionsMixin, DeleteView):
...
@@ -92,7 +92,7 @@ class SystemUserDeleteView(PermissionsMixin, DeleteView):
class
SystemUserAssetView
(
PermissionsMixin
,
DetailView
):
class
SystemUserAssetView
(
PermissionsMixin
,
DetailView
):
model
=
SystemUser
model
=
SystemUser
template_name
=
'assets/system_user_asset.html'
template_name
=
'assets/system_user_asset
s
.html'
context_object_name
=
'system_user'
context_object_name
=
'system_user'
permission_classes
=
[
IsOrgAdmin
]
permission_classes
=
[
IsOrgAdmin
]
...
...
apps/common/apps.py
View file @
0f8d4f5b
...
@@ -15,3 +15,6 @@ def on_db_connection_ready(sender, **kwargs):
...
@@ -15,3 +15,6 @@ def on_db_connection_ready(sender, **kwargs):
class
CommonConfig
(
AppConfig
):
class
CommonConfig
(
AppConfig
):
name
=
'common'
name
=
'common'
def
ready
(
self
):
from
.
import
signals_handlers
apps/common/signals_handlers.py
0 → 100644
View file @
0f8d4f5b
# -*- coding: utf-8 -*-
#
import
re
from
collections
import
defaultdict
from
django.conf
import
settings
from
django.core.signals
import
request_finished
from
django.db
import
connection
from
.utils
import
get_logger
logger
=
get_logger
(
__file__
)
pattern
=
re
.
compile
(
r'FROM `(\w+)`'
)
class
Counter
:
def
__init__
(
self
):
self
.
counter
=
0
self
.
time
=
0
def
__gt__
(
self
,
other
):
return
self
.
counter
>
other
.
counter
def
__lt__
(
self
,
other
):
return
self
.
counter
<
other
.
counter
def
__eq__
(
self
,
other
):
return
self
.
counter
==
other
.
counter
def
on_request_finished_logging_db_query
(
sender
,
**
kwargs
):
queries
=
connection
.
queries
counters
=
defaultdict
(
Counter
)
for
query
in
queries
:
if
not
query
[
'sql'
]
.
startswith
(
'SELECT'
):
continue
tables
=
pattern
.
findall
(
query
[
'sql'
])
table_name
=
''
.
join
(
tables
)
time
=
query
[
'time'
]
counters
[
table_name
]
.
counter
+=
1
counters
[
table_name
]
.
time
+=
float
(
time
)
counters
[
'total'
]
.
counter
+=
1
counters
[
'total'
]
.
time
+=
float
(
time
)
counters
=
sorted
(
counters
.
items
(),
key
=
lambda
x
:
x
[
1
])
for
name
,
counter
in
counters
:
logger
.
debug
(
"Query {:3} times using {:.2f}s {}"
.
format
(
counter
.
counter
,
counter
.
time
,
name
)
)
if
settings
.
DEBUG
:
request_finished
.
connect
(
on_request_finished_logging_db_query
)
apps/common/utils/encode.py
View file @
0f8d4f5b
...
@@ -51,7 +51,7 @@ class Signer(metaclass=Singleton):
...
@@ -51,7 +51,7 @@ class Signer(metaclass=Singleton):
try
:
try
:
return
s
.
loads
(
value
)
return
s
.
loads
(
value
)
except
BadSignature
:
except
BadSignature
:
return
{}
return
None
def
sign_t
(
self
,
value
,
expires_in
=
3600
):
def
sign_t
(
self
,
value
,
expires_in
=
3600
):
s
=
TimedJSONWebSignatureSerializer
(
self
.
secret_key
,
expires_in
=
expires_in
)
s
=
TimedJSONWebSignatureSerializer
(
self
.
secret_key
,
expires_in
=
expires_in
)
...
@@ -62,7 +62,7 @@ class Signer(metaclass=Singleton):
...
@@ -62,7 +62,7 @@ class Signer(metaclass=Singleton):
try
:
try
:
return
s
.
loads
(
value
)
return
s
.
loads
(
value
)
except
(
BadSignature
,
SignatureExpired
):
except
(
BadSignature
,
SignatureExpired
):
return
{}
return
None
def
ssh_key_string_to_obj
(
text
,
password
=
None
):
def
ssh_key_string_to_obj
(
text
,
password
=
None
):
...
...
apps/jumpserver/settings.py
View file @
0f8d4f5b
...
@@ -111,6 +111,7 @@ MIDDLEWARE = [
...
@@ -111,6 +111,7 @@ MIDDLEWARE = [
'orgs.middleware.OrgMiddleware'
,
'orgs.middleware.OrgMiddleware'
,
]
]
ROOT_URLCONF
=
'jumpserver.urls'
ROOT_URLCONF
=
'jumpserver.urls'
TEMPLATES
=
[
TEMPLATES
=
[
...
...
apps/jumpserver/urls.py
View file @
0f8d4f5b
...
@@ -92,3 +92,4 @@ if settings.DEBUG:
...
@@ -92,3 +92,4 @@ if settings.DEBUG:
path
(
'docs/v2/'
,
get_swagger_view
(
"v2"
)
.
with_ui
(
'swagger'
,
cache_timeout
=
1
),
name
=
"docs"
),
path
(
'docs/v2/'
,
get_swagger_view
(
"v2"
)
.
with_ui
(
'swagger'
,
cache_timeout
=
1
),
name
=
"docs"
),
path
(
'redoc/v2/'
,
get_swagger_view
(
"v2"
)
.
with_ui
(
'redoc'
,
cache_timeout
=
1
),
name
=
'redoc'
),
path
(
'redoc/v2/'
,
get_swagger_view
(
"v2"
)
.
with_ui
(
'redoc'
,
cache_timeout
=
1
),
name
=
'redoc'
),
]
]
apps/orgs/context_processor.py
View file @
0f8d4f5b
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
#
#
from
.utils
import
current_org
,
get_
current_org
from
.utils
import
current_org
,
get_
org_from_request
from
.models
import
Organization
from
.models
import
Organization
def
org_processor
(
request
):
def
org_processor
(
request
):
context
=
{
context
=
{
'ADMIN_ORGS'
:
Organization
.
get_user_admin_orgs
(
request
.
user
),
'ADMIN_ORGS'
:
Organization
.
get_user_admin_orgs
(
request
.
user
),
'CURRENT_ORG'
:
get_
current_org
(
),
'CURRENT_ORG'
:
get_
org_from_request
(
request
),
'HAS_ORG_PERM'
:
current_org
.
can_admin_by
(
request
.
user
),
'HAS_ORG_PERM'
:
current_org
.
can_admin_by
(
request
.
user
),
}
}
return
context
return
context
...
...
apps/orgs/middleware.py
View file @
0f8d4f5b
...
@@ -11,7 +11,7 @@ class OrgMiddleware:
...
@@ -11,7 +11,7 @@ class OrgMiddleware:
@staticmethod
@staticmethod
def
set_permed_org_if_need
(
request
):
def
set_permed_org_if_need
(
request
):
if
request
.
content_type
!=
"text/plain"
:
if
request
.
path
.
startswith
(
'/api'
)
:
return
return
if
not
(
request
.
user
.
is_authenticated
and
request
.
user
.
is_org_admin
):
if
not
(
request
.
user
.
is_authenticated
and
request
.
user
.
is_org_admin
):
return
return
...
...
apps/orgs/mixins.py
View file @
0f8d4f5b
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
from
werkzeug.local
import
Local
from
werkzeug.local
import
Local
from
django.db
import
models
from
django.db
import
models
from
django.conf
import
settings
from
django.utils.translation
import
ugettext_lazy
as
_
from
django.utils.translation
import
ugettext_lazy
as
_
from
django.shortcuts
import
redirect
,
get_object_or_404
from
django.shortcuts
import
redirect
,
get_object_or_404
from
django.forms
import
ModelForm
from
django.forms
import
ModelForm
...
@@ -20,7 +21,7 @@ from .utils import (
...
@@ -20,7 +21,7 @@ from .utils import (
from
.models
import
Organization
from
.models
import
Organization
logger
=
get_logger
(
__file__
)
logger
=
get_logger
(
__file__
)
t
l
=
Local
()
loca
l
=
Local
()
__all__
=
[
__all__
=
[
'OrgManager'
,
'OrgViewGenericMixin'
,
'OrgModelMixin'
,
'OrgModelForm'
,
'OrgManager'
,
'OrgViewGenericMixin'
,
'OrgModelMixin'
,
'OrgModelForm'
,
...
@@ -28,16 +29,13 @@ __all__ = [
...
@@ -28,16 +29,13 @@ __all__ = [
'OrgMembershipModelViewSetMixin'
,
'OrgResourceSerializerMixin'
,
'OrgMembershipModelViewSetMixin'
,
'OrgResourceSerializerMixin'
,
'BulkOrgResourceSerializerMixin'
,
'BulkOrgResourceModelSerializer'
,
'BulkOrgResourceSerializerMixin'
,
'BulkOrgResourceModelSerializer'
,
]
]
debug
=
settings
.
DEBUG
class
OrgManager
(
models
.
Manager
):
class
OrgManager
(
models
.
Manager
):
def
get_queryset
(
self
):
def
get_queryset
(
self
):
queryset
=
super
(
OrgManager
,
self
)
.
get_queryset
()
queryset
=
super
(
OrgManager
,
self
)
.
get_queryset
()
kwargs
=
{}
kwargs
=
{}
# if not hasattr(tl, 'times'):
# tl.times = 0
# logger.debug("[{}]>>>>>>>>>> Get query set".format(tl.times))
if
not
current_org
:
if
not
current_org
:
kwargs
[
'id'
]
=
None
kwargs
[
'id'
]
=
None
elif
current_org
.
is_real
():
elif
current_org
.
is_real
():
...
@@ -45,7 +43,6 @@ class OrgManager(models.Manager):
...
@@ -45,7 +43,6 @@ class OrgManager(models.Manager):
elif
current_org
.
is_default
():
elif
current_org
.
is_default
():
queryset
=
queryset
.
filter
(
org_id
=
""
)
queryset
=
queryset
.
filter
(
org_id
=
""
)
queryset
=
queryset
.
filter
(
**
kwargs
)
queryset
=
queryset
.
filter
(
**
kwargs
)
# tl.times += 1
return
queryset
return
queryset
def
filter_by_fullname
(
self
,
fullname
,
field
=
None
):
def
filter_by_fullname
(
self
,
fullname
,
field
=
None
):
...
...
apps/perms/api/user_permission.py
View file @
0f8d4f5b
...
@@ -26,7 +26,7 @@ from ..hands import (
...
@@ -26,7 +26,7 @@ from ..hands import (
)
)
from
..
import
serializers
,
const
from
..
import
serializers
,
const
from
..mixins
import
(
from
..mixins
import
(
AssetsFilterMixin
,
RemoteAppFilterMixin
,
ChangeOrgIfNeedMixin
AssetsFilterMixin
,
RemoteAppFilterMixin
)
)
from
..models
import
Action
from
..models
import
Action
...
@@ -48,14 +48,6 @@ class UserPermissionCacheMixin:
...
@@ -48,14 +48,6 @@ class UserPermissionCacheMixin:
CACHE_TIME
=
settings
.
ASSETS_PERM_CACHE_TIME
CACHE_TIME
=
settings
.
ASSETS_PERM_CACHE_TIME
_object
=
None
_object
=
None
@staticmethod
def
change_org_if_need
(
request
,
kwargs
):
if
request
.
user
.
is_authenticated
and
\
request
.
user
.
is_superuser
or
\
request
.
user
.
is_app
or
\
kwargs
.
get
(
'pk'
)
is
None
:
set_to_root_org
()
def
get_object
(
self
):
def
get_object
(
self
):
return
None
return
None
...
@@ -115,7 +107,6 @@ class UserPermissionCacheMixin:
...
@@ -115,7 +107,6 @@ class UserPermissionCacheMixin:
cache
.
set
(
key
,
response
.
data
,
self
.
CACHE_TIME
)
cache
.
set
(
key
,
response
.
data
,
self
.
CACHE_TIME
)
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
change_org_if_need
(
request
,
kwargs
)
self
.
cache_policy
=
request
.
GET
.
get
(
'cache_policy'
,
'0'
)
self
.
cache_policy
=
request
.
GET
.
get
(
'cache_policy'
,
'0'
)
obj
=
self
.
_get_object
()
obj
=
self
.
_get_object
()
...
@@ -461,7 +452,7 @@ class GetUserAssetPermissionActionsApi(UserPermissionCacheMixin, APIView):
...
@@ -461,7 +452,7 @@ class GetUserAssetPermissionActionsApi(UserPermissionCacheMixin, APIView):
# RemoteApp permission
# RemoteApp permission
class
UserGrantedRemoteAppsApi
(
ChangeOrgIfNeedMixin
,
RemoteAppFilterMixin
,
ListAPIView
):
class
UserGrantedRemoteAppsApi
(
RemoteAppFilterMixin
,
ListAPIView
):
permission_classes
=
(
IsOrgAdminOrAppUser
,)
permission_classes
=
(
IsOrgAdminOrAppUser
,)
serializer_class
=
RemoteAppSerializer
serializer_class
=
RemoteAppSerializer
pagination_class
=
LimitOffsetPagination
pagination_class
=
LimitOffsetPagination
...
@@ -486,7 +477,7 @@ class UserGrantedRemoteAppsApi(ChangeOrgIfNeedMixin, RemoteAppFilterMixin, ListA
...
@@ -486,7 +477,7 @@ class UserGrantedRemoteAppsApi(ChangeOrgIfNeedMixin, RemoteAppFilterMixin, ListA
return
super
()
.
get_permissions
()
return
super
()
.
get_permissions
()
class
UserGrantedRemoteAppsAsTreeApi
(
ChangeOrgIfNeedMixin
,
ListAPIView
):
class
UserGrantedRemoteAppsAsTreeApi
(
ListAPIView
):
serializer_class
=
TreeNodeSerializer
serializer_class
=
TreeNodeSerializer
permission_classes
=
(
IsOrgAdminOrAppUser
,)
permission_classes
=
(
IsOrgAdminOrAppUser
,)
...
@@ -518,11 +509,10 @@ class UserGrantedRemoteAppsAsTreeApi(ChangeOrgIfNeedMixin, ListAPIView):
...
@@ -518,11 +509,10 @@ class UserGrantedRemoteAppsAsTreeApi(ChangeOrgIfNeedMixin, ListAPIView):
return
super
()
.
get_permissions
()
return
super
()
.
get_permissions
()
class
ValidateUserRemoteAppPermissionApi
(
ChangeOrgIfNeedMixin
,
APIView
):
class
ValidateUserRemoteAppPermissionApi
(
APIView
):
permission_classes
=
(
IsOrgAdminOrAppUser
,)
permission_classes
=
(
IsOrgAdminOrAppUser
,)
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
change_org_if_need
(
request
,
kwargs
)
user_id
=
request
.
query_params
.
get
(
'user_id'
,
''
)
user_id
=
request
.
query_params
.
get
(
'user_id'
,
''
)
remote_app_id
=
request
.
query_params
.
get
(
'remote_app_id'
,
''
)
remote_app_id
=
request
.
query_params
.
get
(
'remote_app_id'
,
''
)
user
=
get_object_or_404
(
User
,
id
=
user_id
)
user
=
get_object_or_404
(
User
,
id
=
user_id
)
...
...
apps/perms/utils/asset_permission.py
View file @
0f8d4f5b
...
@@ -11,6 +11,7 @@ from django.core.cache import cache
...
@@ -11,6 +11,7 @@ from django.core.cache import cache
from
django.conf
import
settings
from
django.conf
import
settings
from
django.utils.translation
import
ugettext
as
_
from
django.utils.translation
import
ugettext
as
_
from
orgs.utils
import
set_to_root_org
from
common.utils
import
get_logger
from
common.utils
import
get_logger
from
common.tree
import
TreeNode
from
common.tree
import
TreeNode
from
..
import
const
from
..
import
const
...
@@ -162,6 +163,11 @@ class AssetPermissionUtil:
...
@@ -162,6 +163,11 @@ class AssetPermissionUtil:
self
.
_filter_id
=
'None'
# 当通过filter更改 permission是标记
self
.
_filter_id
=
'None'
# 当通过filter更改 permission是标记
self
.
cache_policy
=
cache_policy
self
.
cache_policy
=
cache_policy
self
.
tree
=
GenerateTree
()
self
.
tree
=
GenerateTree
()
self
.
change_org_if_need
()
@staticmethod
def
change_org_if_need
():
set_to_root_org
()
@classmethod
@classmethod
def
is_not_using_cache
(
cls
,
cache_policy
):
def
is_not_using_cache
(
cls
,
cache_policy
):
...
...
apps/perms/utils/remote_app_permission.py
View file @
0f8d4f5b
...
@@ -4,6 +4,7 @@
...
@@ -4,6 +4,7 @@
from
django.db.models
import
Q
from
django.db.models
import
Q
from
common.tree
import
TreeNode
from
common.tree
import
TreeNode
from
orgs.utils
import
set_to_root_org
from
..models
import
RemoteAppPermission
from
..models
import
RemoteAppPermission
...
@@ -38,6 +39,11 @@ class RemoteAppPermissionUtil:
...
@@ -38,6 +39,11 @@ class RemoteAppPermissionUtil:
def
__init__
(
self
,
obj
):
def
__init__
(
self
,
obj
):
self
.
object
=
obj
self
.
object
=
obj
self
.
change_org_if_need
()
@staticmethod
def
change_org_if_need
():
set_to_root_org
()
@property
@property
def
permissions
(
self
):
def
permissions
(
self
):
...
...
apps/settings/signals_handler.py
View file @
0f8d4f5b
...
@@ -26,10 +26,10 @@ def refresh_settings_on_changed(sender, instance=None, **kwargs):
...
@@ -26,10 +26,10 @@ def refresh_settings_on_changed(sender, instance=None, **kwargs):
def
monkey_patch_settings
(
sender
,
**
kwargs
):
def
monkey_patch_settings
(
sender
,
**
kwargs
):
cache_key_prefix
=
'_SETTING_'
cache_key_prefix
=
'_SETTING_'
custom_need_cache_settings
=
[
custom_need_cache_settings
=
[
'AUTHENTICATION_BACKENDS'
'AUTHENTICATION_BACKENDS'
,
'TERMINAL_HOST_KEY'
,
]
]
custom_no_cache_settings
=
[
custom_no_cache_settings
=
[
'BASE_DIR'
,
'VERSION'
,
'AUTH_OPENID'
'BASE_DIR'
,
'VERSION'
,
'AUTH_OPENID'
,
]
]
django_settings
=
dir
(
global_settings
)
django_settings
=
dir
(
global_settings
)
uncached_settings
=
[
i
for
i
in
django_settings
if
i
.
isupper
()]
uncached_settings
=
[
i
for
i
in
django_settings
if
i
.
isupper
()]
...
...
apps/static/js/jumpserver.js
View file @
0f8d4f5b
...
@@ -500,8 +500,10 @@ jumpserver.initDataTable = function (options) {
...
@@ -500,8 +500,10 @@ jumpserver.initDataTable = function (options) {
$
(
'[data-toggle="popover"]'
).
popover
({
$
(
'[data-toggle="popover"]'
).
popover
({
html
:
true
,
html
:
true
,
placement
:
'bottom'
,
placement
:
'bottom'
,
// trigger: 'hover
',
trigger
:
'click
'
,
container
:
'body'
container
:
'body'
}).
on
(
'click'
,
function
(
e
)
{
$
(
'[data-toggle="popover"]'
).
not
(
this
).
popover
(
'hide'
);
});
});
});
});
$
(
'.ipt_check_all'
).
on
(
'click'
,
function
()
{
$
(
'.ipt_check_all'
).
on
(
'click'
,
function
()
{
...
@@ -670,6 +672,14 @@ jumpserver.initServerSideDataTable = function (options) {
...
@@ -670,6 +672,14 @@ jumpserver.initServerSideDataTable = function (options) {
}).
on
(
'draw'
,
function
(){
}).
on
(
'draw'
,
function
(){
$
(
'#op'
).
html
(
options
.
op_html
||
''
);
$
(
'#op'
).
html
(
options
.
op_html
||
''
);
$
(
'#uc'
).
html
(
options
.
uc_html
||
''
);
$
(
'#uc'
).
html
(
options
.
uc_html
||
''
);
$
(
'[data-toggle="popover"]'
).
popover
({
html
:
true
,
placement
:
'bottom'
,
trigger
:
'click'
,
container
:
'body'
}).
on
(
'click'
,
function
(
e
)
{
$
(
'[data-toggle="popover"]'
).
not
(
this
).
popover
(
'hide'
);
});
var
table_data
=
[];
var
table_data
=
[];
$
.
each
(
table
.
rows
().
data
(),
function
(
id
,
row
)
{
$
.
each
(
table
.
rows
().
data
(),
function
(
id
,
row
)
{
if
(
row
.
id
)
{
if
(
row
.
id
)
{
...
...
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