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
5ae2711c
Commit
5ae2711c
authored
Nov 20, 2016
by
Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sudo privilege删除走api
parent
39ae4a3a
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
96 additions
and
150 deletions
+96
-150
serializers.py
apps/ops/api/serializers.py
+14
-1
views.py
apps/ops/api/views.py
+52
-0
models.py
apps/ops/models.py
+5
-25
urls.py
apps/ops/urls.py
+5
-5
utils.py
apps/ops/utils.py
+6
-32
views.py
apps/ops/views.py
+14
-87
No files found.
apps/ops/api/serializers.py
View file @
5ae2711c
# ~*~ coding: utf-8 ~*~
# ~*~ coding: utf-8 ~*~
from
__future__
import
unicode_literals
,
print_function
from
__future__
import
unicode_literals
,
print_function
from
..models
import
HostAlia
,
UserAlia
,
CmdAlia
,
RunasAlia
,
Extra_conf
from
..models
import
HostAlia
,
UserAlia
,
CmdAlia
,
RunasAlia
,
Extra_conf
,
Privilege
,
Sudo
from
rest_framework
import
serializers
from
rest_framework
import
serializers
...
@@ -34,3 +34,16 @@ class ExtraconfSerializer(serializers.ModelSerializer):
...
@@ -34,3 +34,16 @@ class ExtraconfSerializer(serializers.ModelSerializer):
class
Meta
:
class
Meta
:
model
=
Extra_conf
model
=
Extra_conf
class
PrivilegeSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
Privilege
class
SudoSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
Sudo
apps/ops/api/views.py
View file @
5ae2711c
...
@@ -193,3 +193,55 @@ class ExtraconfViewSet(viewsets.GenericViewSet):
...
@@ -193,3 +193,55 @@ class ExtraconfViewSet(viewsets.GenericViewSet):
pass
pass
class
PrivilegeViewSet
(
viewsets
.
GenericViewSet
):
queryset
=
Privilege
.
objects
.
all
()
serializer_class
=
PrivilegeSerializer
permission_classes
=
None
def
list
(
self
):
pass
def
create
(
self
):
pass
def
retrieve
(
self
,
*
args
,
**
kwargs
):
pass
def
update
(
self
,
*
args
,
**
kwargs
):
pass
def
destroy
(
self
,
*
args
,
**
kwargs
):
privilege
=
self
.
get_object
()
privilege
.
delete
()
return
Response
(
status
=
status
.
HTTP_204_NO_CONTENT
)
def
perform_create
(
self
):
pass
class
SudoViewSet
(
viewsets
.
GenericViewSet
):
queryset
=
Sudo
.
objects
.
all
()
serializer_class
=
SudoSerializer
permission_classes
=
None
def
list
(
self
):
pass
def
create
(
self
):
pass
def
retrieve
(
self
,
*
args
,
**
kwargs
):
pass
def
update
(
self
,
*
args
,
**
kwargs
):
pass
def
destroy
(
self
,
*
args
,
**
kwargs
):
sudo
=
self
.
get_object
()
sudo
.
delete
()
return
Response
(
status
=
status
.
HTTP_204_NO_CONTENT
)
def
perform_create
(
self
):
pass
apps/ops/models.py
View file @
5ae2711c
...
@@ -274,49 +274,29 @@ class Sudo(models.Model):
...
@@ -274,49 +274,29 @@ class Sudo(models.Model):
"""
"""
Sudo配置文件对象, 用于配置sudo的配置文件
Sudo配置文件对象, 用于配置sudo的配置文件
:param user_alias: <dict> {<alia>: <users_list>}
:param cmnd_alias: <dict> {<alia>: <commands_list>}
:param host_alias: <dict> {<alia>: <hosts_list>}
:param runas_alias: <dict> {<alia>: <runas_list>}
:param extra_lines: <list> [<line1>, <line2>,...]
:param extra_lines: <list> [<line1>, <line2>,...]
:param privileges: <list> [(user, host, runas, command, nopassword),]
:param privileges: <list> [(user, host, runas, command, nopassword),]
"""
"""
asset
=
models
.
ForeignKey
(
Asset
,
null
=
True
,
blank
=
True
,
related_name
=
'sudos'
)
asset
=
models
.
ForeignKey
(
Asset
,
null
=
True
,
blank
=
True
,
related_name
=
'sudos'
)
host_alias
=
models
.
ManyToManyField
(
HostAlia
,
related_name
=
'sudos'
,
blank
=
True
)
user_alias
=
models
.
ManyToManyField
(
UserAlia
,
related_name
=
'sudos'
,
blank
=
True
)
cmnd_alias
=
models
.
ManyToManyField
(
CmdAlia
,
related_name
=
'sudos'
,
blank
=
True
)
runas_alias
=
models
.
ManyToManyField
(
RunasAlia
,
related_name
=
'sudos'
,
blank
=
True
)
extra_lines
=
models
.
ManyToManyField
(
Extra_conf
,
related_name
=
'sudos'
,
blank
=
True
)
extra_lines
=
models
.
ManyToManyField
(
Extra_conf
,
related_name
=
'sudos'
,
blank
=
True
)
privilege_items
=
models
.
ManyToManyField
(
Privilege
,
related_name
=
'sudos'
,
blank
=
True
)
privilege_items
=
models
.
ManyToManyField
(
Privilege
,
related_name
=
'sudos'
,
blank
=
True
)
@property
@property
def
users
(
self
):
def
users
(
self
):
ret
=
{}
return
{
privilege
.
user
.
name
:
privilege
.
user
.
user_items
.
split
(
','
)
for
privilege
in
self
.
privilege_items
.
all
()}
for
user
in
self
.
user_alias
.
all
():
ret
[
user
.
name
]
=
user
.
user_items
.
split
(
','
)
return
ret
@property
@property
def
commands
(
self
):
def
commands
(
self
):
ret
=
{}
return
{
privilege
.
command
.
name
:
privilege
.
command
.
cmd_items
.
split
(
','
)
for
privilege
in
self
.
privilege_items
.
all
()}
for
cmd
in
self
.
cmnd_alias
.
all
():
ret
[
cmd
.
name
]
=
cmd
.
cmd_items
.
split
(
','
)
return
ret
@property
@property
def
hosts
(
self
):
def
hosts
(
self
):
ret
=
{}
return
{
privilege
.
host
.
name
:
privilege
.
host
.
host_items
.
split
(
','
)
for
privilege
in
self
.
privilege_items
.
all
()}
for
host
in
self
.
host_alias
.
all
():
ret
[
host
.
name
]
=
host
.
host_items
.
split
(
','
)
return
ret
@property
@property
def
runas
(
self
):
def
runas
(
self
):
ret
=
{}
return
{
privilege
.
runas
.
name
:
privilege
.
runas
.
runas_items
.
split
(
','
)
for
privilege
in
self
.
privilege_items
.
all
()}
for
runas
in
self
.
runas_alias
.
all
():
ret
[
runas
.
name
]
=
runas
.
runas_items
.
split
(
','
)
return
ret
@property
@property
def
extras
(
self
):
def
extras
(
self
):
...
@@ -391,7 +371,7 @@ root ALL=(ALL:ALL) ALL
...
@@ -391,7 +371,7 @@ root ALL=(ALL:ALL) ALL
# JumpServer Generate User privilege is here.
# JumpServer Generate User privilege is here.
# Note privileges is a tuple list like [(user, host, runas, command, nopassword),]
# Note privileges is a tuple list like [(user, host, runas, command, nopassword),]
{
%
if
p
rivileges -
%
}
{
%
if
P
rivileges -
%
}
{
%
for User_Flag, Host_Flag, Runas_Flag, Command_Flag, NopassWord in Privileges -
%
}
{
%
for User_Flag, Host_Flag, Runas_Flag, Command_Flag, NopassWord in Privileges -
%
}
{
%
if NopassWord -
%
}
{
%
if NopassWord -
%
}
{{ User_Flag }} {{ Host_Flag }}=({{ Runas_Flag }}) NOPASSWD: {{ Command_Flag }}
{{ User_Flag }} {{ Host_Flag }}=({{ Runas_Flag }}) NOPASSWD: {{ Command_Flag }}
...
...
apps/ops/urls.py
View file @
5ae2711c
...
@@ -20,11 +20,11 @@ router.register(r'Extraconf', api_view.ExtraconfViewSet)
...
@@ -20,11 +20,11 @@ router.register(r'Extraconf', api_view.ExtraconfViewSet)
urlpatterns
=
[
urlpatterns
=
[
# Resource Sudo url
# Resource Sudo url
url
(
r'^sudo/list$'
,
mvc_view
.
SudoListView
.
as_view
(),
name
=
'sudo-list'
),
url
(
r'^sudo/list$'
,
mvc_view
.
SudoListView
.
as_view
(),
name
=
'sudo-list'
),
url
(
r'^sudo/create'
,
mvc_view
.
SudoCreateView
.
as_view
(),
name
=
'sudo-create'
),
url
(
r'^sudo/create
$
'
,
mvc_view
.
SudoCreateView
.
as_view
(),
name
=
'sudo-create'
),
url
(
r'^sudo/detail'
,
mvc_view
.
SudoDetailView
.
as_view
(),
name
=
'sudo-detail'
),
url
(
r'^sudo/detail
$
'
,
mvc_view
.
SudoDetailView
.
as_view
(),
name
=
'sudo-detail'
),
url
(
r'^sudo/update'
,
mvc_view
.
SudoUpdateView
.
as_view
(),
name
=
'sudo-update'
),
url
(
r'^sudo/update
$
'
,
mvc_view
.
SudoUpdateView
.
as_view
(),
name
=
'sudo-update'
),
url
(
r'^sudo/delete'
,
mvc_view
.
SudoDeleteView
.
as_view
(),
name
=
'sudo-delete'
),
url
(
r'^sudo/delete
$
'
,
mvc_view
.
SudoDeleteView
.
as_view
(),
name
=
'sudo-delete'
),
]
]
urlpatterns
+=
[
urlpatterns
+=
[
...
...
apps/ops/utils.py
View file @
5ae2711c
# ~*~ coding: utf-8 ~*~
# ~*~ coding: utf-8 ~*~
class
CreateHostAliasMinxin
(
object
):
class
CreateSudoPrivilegesMixin
(
object
):
pass
def
create_privilege
(
self
):
pass
class
CreateUserAliasMinxin
(
object
):
pass
class
ListSudoPrivilegesMixin
(
object
):
class
CreateCmdAliasMinxin
(
object
):
def
get_all_privilege
(
self
):
pass
pass
class
CreateRunasAliasMinxin
(
object
):
pass
class
CreateExtralineAliasMinxin
(
object
):
pass
class
UpdateHostAliasMinxin
(
object
):
pass
class
UpdateUserAliasMinxin
(
object
):
pass
class
UpdateCmdAliasMinxin
(
object
):
pass
class
UpdateRunasAliasMinxin
(
object
):
pass
class
UpdateExtralineAliasMinxin
(
object
):
pass
\ No newline at end of file
apps/ops/views.py
View file @
5ae2711c
...
@@ -7,102 +7,29 @@ from django.views.generic.edit import CreateView, DeleteView, UpdateView
...
@@ -7,102 +7,29 @@ from django.views.generic.edit import CreateView, DeleteView, UpdateView
from
django.views.generic.detail
import
DetailView
,
SingleObjectMixin
from
django.views.generic.detail
import
DetailView
,
SingleObjectMixin
from
.hands
import
AdminUserRequiredMixin
from
.hands
import
AdminUserRequiredMixin
from
.utils
import
CreateSudoPrivilegesMixin
,
ListSudoPrivilegesMixin
from
models
import
*
class
SudoListView
(
AdminUserRequiredMixin
,
ListView
):
class
SudoListView
(
AdminUserRequiredMixin
,
List
SudoPrivilegesMixin
,
List
View
):
paginate_by
=
settings
.
CONFIG
.
DISPLAY_PER_PAGE
paginate_by
=
settings
.
CONFIG
.
DISPLAY_PER_PAGE
model
=
Asset
model
=
Sudo
context_object_name
=
'
asset_list
'
context_object_name
=
'
sudos
'
template_name
=
'
assets/asset_
list.html'
template_name
=
'
sudo/
list.html'
def
get_queryset
(
self
):
queryset
=
super
(
AssetListView
,
self
)
.
get_queryset
()
queryset
=
sorted
(
queryset
,
key
=
self
.
sorted_by_valid_and_ip
)
return
queryset
@staticmethod
class
SudoCreateView
(
AdminUserRequiredMixin
,
CreateSudoPrivilegesMixin
,
CreateView
):
def
sorted_by_valid_and_ip
(
asset
):
model
=
Sudo
ip_list
=
int_seq
(
asset
.
ip
.
split
(
'.'
))
template_name
=
'sudo/create.html'
ip_list
.
insert
(
0
,
asset
.
is_valid
()[
0
])
return
ip_list
def
get_context_data
(
self
,
**
kwargs
):
context
=
{
'app'
:
'Assets'
,
'action'
:
'asset list'
,
'tag_list'
:
[(
i
.
id
,
i
.
name
,
i
.
asset_set
.
all
()
.
count
())
for
i
in
Tag
.
objects
.
all
()
.
order_by
(
'name'
)]
}
kwargs
.
update
(
context
)
return
super
(
AssetListView
,
self
)
.
get_context_data
(
**
kwargs
)
class
SudoCreateView
(
AdminUserRequiredMixin
,
CreateView
):
model
=
Asset
tag_type
=
'asset'
form_class
=
AssetCreateForm
template_name
=
'assets/asset_create.html'
success_url
=
reverse_lazy
(
'assets:asset-list'
)
def
form_valid
(
self
,
form
):
asset
=
form
.
save
()
asset
.
created_by
=
self
.
request
.
user
.
username
or
'Admin'
asset
.
save
()
return
super
(
AssetCreateView
,
self
)
.
form_valid
(
form
)
def
form_invalid
(
self
,
form
):
print
(
form
.
errors
)
return
super
(
AssetCreateView
,
self
)
.
form_invalid
(
form
)
def
get_context_data
(
self
,
**
kwargs
):
context
=
{
'app'
:
'Assets'
,
'action'
:
'Create asset'
,
}
kwargs
.
update
(
context
)
return
super
(
AssetCreateView
,
self
)
.
get_context_data
(
**
kwargs
)
class
SudoUpdateView
(
AdminUserRequiredMixin
,
UpdateView
):
class
SudoUpdateView
(
AdminUserRequiredMixin
,
UpdateView
):
model
=
Asset
model
=
Sudo
form_class
=
AssetCreateForm
template_name
=
'sudo/update.html'
template_name
=
'assets/asset_update.html'
success_url
=
reverse_lazy
(
'assets:asset-list'
)
def
get_context_data
(
self
,
**
kwargs
):
context
=
{
'app'
:
'Assets'
,
'action'
:
'Update asset'
,
}
kwargs
.
update
(
context
)
return
super
(
AssetUpdateView
,
self
)
.
get_context_data
(
**
kwargs
)
def
form_invalid
(
self
,
form
):
print
(
form
.
errors
)
return
super
(
AssetUpdateView
,
self
)
.
form_invalid
(
form
)
class
SudoDeleteView
(
DeleteView
):
model
=
Asset
template_name
=
'assets/delete_confirm.html'
success_url
=
reverse_lazy
(
'assets:asset-list'
)
class
SudoDetailView
(
DetailView
):
class
SudoDetailView
(
DetailView
):
model
=
Asset
model
=
Sudo
context_object_name
=
'
asset
'
context_object_name
=
'
sudo
'
template_name
=
'
assets/asset_
detail.html'
template_name
=
'
sudo/
detail.html'
def
get_context_data
(
self
,
**
kwargs
):
asset_groups
=
self
.
object
.
groups
.
all
()
context
=
{
'app'
:
'Assets'
,
'action'
:
'Asset detail'
,
'asset_groups_remain'
:
[
asset_group
for
asset_group
in
AssetGroup
.
objects
.
all
()
if
asset_group
not
in
asset_groups
],
'asset_groups'
:
asset_groups
,
}
kwargs
.
update
(
context
)
return
super
(
AssetDetailView
,
self
)
.
get_context_data
(
**
kwargs
)
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