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
01e50d59
Commit
01e50d59
authored
Mar 05, 2017
by
ibuler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完成AdHoc JMSHost JMSInventory
parent
0524e8dd
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
35 additions
and
278 deletions
+35
-278
asset.py
apps/assets/models/asset.py
+12
-0
user.py
apps/assets/models/user.py
+18
-3
serializers.py
apps/ops/api/serializers.py
+0
-61
views.py
apps/ops/api/views.py
+0
-72
__init__.py
apps/ops/models/__init__.py
+0
-2
cron.py
apps/ops/models/cron.py
+0
-62
sudo.py
apps/ops/models/sudo.py
+0
-0
utils.py
apps/ops/models/utils.py
+2
-4
api_urls.py
apps/ops/urls/api_urls.py
+2
-16
view_urls.py
apps/ops/urls/view_urls.py
+0
-12
ansible_api.py
apps/ops/utils/ansible_api.py
+0
-0
views.py
apps/ops/views.py
+1
-46
No files found.
apps/assets/models/asset.py
View file @
01e50d59
...
...
@@ -87,6 +87,18 @@ class Asset(models.Model):
def
to_json
(
self
):
pass
def
_to_secret_json
(
self
):
"""Ansible use it create inventory"""
return
{
'hostname'
:
self
.
hostname
,
'ip'
:
self
.
ip
,
'port'
:
self
.
port
,
'groups'
:
[
group
.
name
for
group
in
self
.
groups
.
all
()],
'username'
:
self
.
admin_user
.
username
,
'password'
:
self
.
admin_user
.
password
,
'private_key'
:
self
.
admin_user
.
private_key
,
}
class
Meta
:
unique_together
=
(
'ip'
,
'port'
)
...
...
apps/assets/models/user.py
View file @
01e50d59
...
...
@@ -9,7 +9,7 @@ import logging
from
django.utils.translation
import
ugettext_lazy
as
_
from
django.core.exceptions
import
ValidationError
from
common.utils
import
signer
,
validate_ssh_private_key
from
common.utils
import
signer
,
validate_ssh_private_key
,
ssh_key_string_to_obj
__all__
=
[
'AdminUser'
,
'SystemUser'
,
'private_key_validator'
]
logger
=
logging
.
getLogger
(
__name__
)
...
...
@@ -24,12 +24,20 @@ def private_key_validator(value):
class
AdminUser
(
models
.
Model
):
BECOME_METHOD_CHOICES
=
(
(
'sudo'
,
'sudo'
),
(
'su'
,
'su'
),
)
name
=
models
.
CharField
(
max_length
=
128
,
unique
=
True
,
verbose_name
=
_
(
'Name'
))
username
=
models
.
CharField
(
max_length
=
16
,
verbose_name
=
_
(
'Username'
))
_password
=
models
.
CharField
(
max_length
=
256
,
blank
=
True
,
null
=
True
,
verbose_name
=
_
(
'Password'
))
_private_key
=
models
.
CharField
(
max_length
=
4096
,
blank
=
True
,
null
=
True
,
verbose_name
=
_
(
'SSH private key'
),
validators
=
[
private_key_validator
,])
_public_key
=
models
.
CharField
(
max_length
=
4096
,
blank
=
True
,
verbose_name
=
_
(
'SSH public key'
))
become
=
models
.
BooleanField
(
default
=
True
)
become_method
=
models
.
CharField
(
choices
=
BECOME_METHOD_CHOICES
,
default
=
'sudo'
,
max_length
=
4
)
become_user
=
models
.
CharField
(
default
=
'root'
,
max_length
=
64
)
become_password
=
models
.
CharField
(
default
=
''
,
max_length
=
128
)
comment
=
models
.
TextField
(
blank
=
True
,
verbose_name
=
_
(
'Comment'
))
date_created
=
models
.
DateTimeField
(
auto_now_add
=
True
,
null
=
True
)
created_by
=
models
.
CharField
(
max_length
=
32
,
null
=
True
,
verbose_name
=
_
(
'Created by'
))
...
...
@@ -41,7 +49,10 @@ class AdminUser(models.Model):
@property
def
password
(
self
):
return
signer
.
unsign
(
self
.
_password
)
if
self
.
_password
:
return
signer
.
unsign
(
self
.
_password
)
else
:
return
''
@password.setter
def
password
(
self
,
password_raw
):
...
...
@@ -49,7 +60,11 @@ class AdminUser(models.Model):
@property
def
private_key
(
self
):
return
signer
.
unsign
(
self
.
_private_key
)
if
self
.
_private_key
:
key_str
=
signer
.
unsign
(
self
.
_private_key
)
return
ssh_key_string_to_obj
(
key_str
)
else
:
return
None
@private_key.setter
def
private_key
(
self
,
private_key_raw
):
...
...
apps/ops/api/serializers.py
View file @
01e50d59
# ~*~ coding: utf-8 ~*~
from
__future__
import
unicode_literals
from
ops.models
import
*
from
rest_framework
import
serializers
class
HostAliaSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
HostAlia
class
CmdAliaSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
CmdAlia
class
UserAliaSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
UserAlia
class
RunasAliaSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
RunasAlia
class
ExtraconfSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
Extra_conf
class
PrivilegeSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
Privilege
class
SudoSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
Sudo
class
CronTableSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
CronTable
class
TaskSerializer
(
serializers
.
ModelSerializer
):
sub_tasks
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
read_only
=
True
)
class
Meta
:
model
=
Task
read_only_fields
=
(
'record'
,)
class
SubTaskSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
SubTask
apps/ops/api/views.py
View file @
01e50d59
...
...
@@ -5,75 +5,3 @@ from rest_framework import viewsets
from
serializers
import
*
from
permissions
import
*
__all__
=
[
"HostAliaViewSet"
,
"CmdAliaViewSet"
,
"UserAliaViewSet"
,
"RunasAliaViewSet"
,
"ExtraconfViewSet"
,
"PrivilegeViewSet"
,
"SudoViewSet"
,
"CronTableViewSet"
,
"TaskViewSet"
,
"SubTaskViewSet"
,
]
class
HostAliaViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
HostAlia
.
objects
.
all
()
serializer_class
=
HostAliaSerializer
permission_classes
=
(
AdminUserRequired
,)
class
CmdAliaViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
CmdAlia
.
objects
.
all
()
serializer_class
=
CmdAliaSerializer
permission_classes
=
(
AdminUserRequired
,)
class
UserAliaViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
UserAlia
.
objects
.
all
()
serializer_class
=
UserAliaSerializer
permission_classes
=
(
AdminUserRequired
,)
class
RunasAliaViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
RunasAlia
.
objects
.
all
()
serializer_class
=
RunasAliaSerializer
permission_classes
=
(
AdminUserRequired
,)
class
ExtraconfViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
Extra_conf
.
objects
.
all
()
serializer_class
=
ExtraconfSerializer
permission_classes
=
(
AdminUserRequired
,)
class
PrivilegeViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
Privilege
.
objects
.
all
()
serializer_class
=
PrivilegeSerializer
permission_classes
=
(
AdminUserRequired
,)
class
SudoViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
Sudo
.
objects
.
all
()
serializer_class
=
SudoSerializer
permission_classes
=
(
AdminUserRequired
,)
class
CronTableViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
CronTable
.
objects
.
all
()
serializer_class
=
CronTableSerializer
permission_classes
=
(
AdminUserRequired
,)
class
TaskViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
Task
.
objects
.
all
()
serializer_class
=
TaskSerializer
permission_classes
=
(
AdminUserRequired
,)
class
SubTaskViewSet
(
viewsets
.
ModelViewSet
):
queryset
=
SubTask
.
objects
.
all
()
serializer_class
=
SubTaskSerializer
permission_classes
=
(
AdminUserRequired
,)
apps/ops/models/__init__.py
View file @
01e50d59
from
ansible
import
*
from
cron
import
*
from
sudo
import
*
from
utils
import
*
from
task
import
*
apps/ops/models/cron.py
deleted
100644 → 0
View file @
0524e8dd
# ~*~ coding: utf-8 ~*~
from
__future__
import
unicode_literals
,
absolute_import
import
logging
from
django.db
import
models
from
assets.models
import
Asset
from
django.utils.translation
import
ugettext_lazy
as
_
logger
=
logging
.
getLogger
(
__name__
)
__all__
=
[
"CronTable"
]
class
CronTable
(
models
.
Model
):
name
=
models
.
CharField
(
max_length
=
128
,
blank
=
True
,
null
=
True
,
unique
=
True
,
verbose_name
=
_
(
'Name'
),
help_text
=
_
(
"Description of a crontab entry"
))
month
=
models
.
CharField
(
max_length
=
128
,
blank
=
True
,
null
=
True
,
verbose_name
=
_
(
'Month'
),
help_text
=
_
(
"Month of the year the job should run ( 1-12, *, */2, etc )"
))
weekday
=
models
.
CharField
(
max_length
=
128
,
blank
=
True
,
null
=
True
,
verbose_name
=
_
(
'WeekDay'
),
help_text
=
_
(
"Day of the week that the job should run"
" ( 0-6 for Sunday-Saturday, *, etc )"
))
day
=
models
.
CharField
(
max_length
=
128
,
blank
=
True
,
null
=
True
,
verbose_name
=
_
(
'Day'
),
help_text
=
_
(
"Day of the month the job should run ( 1-31, *, */2, etc )"
))
hour
=
models
.
CharField
(
max_length
=
128
,
blank
=
True
,
null
=
True
,
verbose_name
=
_
(
'Hour'
),
help_text
=
_
(
"Hour when the job should run ( 0-23, *, */2, etc )"
))
minute
=
models
.
CharField
(
max_length
=
128
,
blank
=
True
,
null
=
True
,
verbose_name
=
_
(
'Minute'
),
help_text
=
_
(
"Minute when the job should run ( 0-59, *, */2, etc )"
))
job
=
models
.
CharField
(
max_length
=
4096
,
blank
=
True
,
null
=
True
,
verbose_name
=
_
(
'Job'
),
help_text
=
_
(
"The command to execute or, if env is set, the value of "
"environment variable. Required if state=present."
))
user
=
models
.
CharField
(
max_length
=
128
,
blank
=
True
,
null
=
True
,
verbose_name
=
_
(
'User'
),
help_text
=
_
(
"The specific user whose crontab should be modified."
))
asset
=
models
.
ForeignKey
(
Asset
,
null
=
True
,
blank
=
True
,
related_name
=
'crontables'
)
@property
def
describe
(
self
):
return
"http://docs.ansible.com/ansible/cron_module.html"
@classmethod
def
generate_fake
(
cls
,
count
=
20
):
from
random
import
seed
,
choice
import
forgery_py
seed
()
for
i
in
range
(
count
):
cron
=
cls
(
name
=
forgery_py
.
name
.
full_name
(),
month
=
str
(
choice
(
range
(
1
,
13
))),
weekday
=
str
(
choice
(
range
(
0
,
7
))),
day
=
str
(
choice
(
range
(
1
,
32
))),
hour
=
str
(
choice
(
range
(
0
,
24
))),
minute
=
str
(
choice
(
range
(
0
,
60
))),
job
=
forgery_py
.
lorem_ipsum
.
sentence
(),
user
=
forgery_py
.
name
.
first_name
(),
)
try
:
cron
.
save
()
logger
.
debug
(
'Generate fake cron:
%
s'
%
cron
.
name
)
except
Exception
as
e
:
print
(
'Error:
%
s, continue...'
%
e
.
message
)
continue
\ No newline at end of file
apps/ops/models/sudo.py
deleted
100644 → 0
View file @
0524e8dd
This diff is collapsed.
Click to expand it.
apps/ops/models/utils.py
View file @
01e50d59
...
...
@@ -2,13 +2,10 @@
from
__future__
import
unicode_literals
from
ansible
import
*
from
cron
import
*
from
sudo
import
*
__all__
=
[
"generate_fake"
]
def
generate_fake
():
for
cls
in
(
TaskRecord
,
AnsiblePlay
,
AnsibleTask
,
AnsibleHostResult
,
CronTable
,
HostAlia
,
UserAlia
,
CmdAlia
,
RunasAlia
,
Privilege
,
Sudo
):
for
cls
in
(
TaskRecord
,
AnsiblePlay
,
AnsibleTask
,
AnsibleHostResult
):
cls
.
generate_fake
()
\ No newline at end of file
apps/ops/urls/api_urls.py
View file @
01e50d59
...
...
@@ -2,20 +2,6 @@
from
__future__
import
unicode_literals
from
rest_framework.routers
import
DefaultRouter
from
ops
import
api
as
v1_api
__all__
=
[
"urlpatterns"
]
api_router
=
DefaultRouter
()
api_router
.
register
(
r'v1/host_alia'
,
v1_api
.
HostAliaViewSet
)
api_router
.
register
(
r'v1/user_alia'
,
v1_api
.
UserAliaViewSet
)
api_router
.
register
(
r'v1/cmd_alia'
,
v1_api
.
CmdAliaViewSet
)
api_router
.
register
(
r'v1/runas_alia'
,
v1_api
.
RunasAliaViewSet
)
api_router
.
register
(
r'v1/extra_conf'
,
v1_api
.
ExtraconfViewSet
)
api_router
.
register
(
r'v1/privilege'
,
v1_api
.
PrivilegeViewSet
)
api_router
.
register
(
r'v1/sudo'
,
v1_api
.
SudoViewSet
)
api_router
.
register
(
r'v1/cron'
,
v1_api
.
CronTableViewSet
)
api_router
.
register
(
r'v1/task'
,
v1_api
.
TaskViewSet
)
api_router
.
register
(
r'v1/subtask'
,
v1_api
.
SubTaskViewSet
)
urlpatterns
=
api_router
.
urls
\ No newline at end of file
urlpatterns
=
[]
\ No newline at end of file
apps/ops/urls/view_urls.py
View file @
01e50d59
...
...
@@ -8,18 +8,6 @@ from ops import views as page_view
__all__
=
[
"urlpatterns"
]
urlpatterns
=
[
# Resource Sudo url
url
(
r'^sudo/list$'
,
page_view
.
SudoListView
.
as_view
(),
name
=
'page-sudo-list'
),
url
(
r'^sudo/create$'
,
page_view
.
SudoCreateView
.
as_view
(),
name
=
'page-sudo-create'
),
url
(
r'^sudo/(?P<pk>[0-9]+)/detail$'
,
page_view
.
SudoDetailView
.
as_view
(),
name
=
'page-sudo-detail'
),
url
(
r'^sudo/(?P<pk>[0-9]+)/update$'
,
page_view
.
SudoUpdateView
.
as_view
(),
name
=
'page-sudo-update'
),
# Resource Cron url
url
(
r'^cron/list$'
,
page_view
.
CronListView
.
as_view
(),
name
=
'page-cron-list'
),
url
(
r'^cron/create$'
,
page_view
.
CronCreateView
.
as_view
(),
name
=
'page-cron-create'
),
url
(
r'^cron/(?P<pk>[0-9]+)/detail$'
,
page_view
.
CronDetailView
.
as_view
(),
name
=
'page-cron-detail'
),
url
(
r'^cron/(?P<pk>[0-9]+)/update$'
,
page_view
.
CronUpdateView
.
as_view
(),
name
=
'page-cron-update'
),
# TResource Task url
url
(
r'^task/list$'
,
page_view
.
TaskListView
.
as_view
(),
name
=
'page-task-list'
),
url
(
r'^task/create$'
,
page_view
.
TaskCreateView
.
as_view
(),
name
=
'page-task-create'
),
...
...
apps/ops/utils/ansible_api.py
View file @
01e50d59
This diff is collapsed.
Click to expand it.
apps/ops/views.py
View file @
01e50d59
...
...
@@ -8,54 +8,9 @@ from django.views.generic.detail import DetailView, SingleObjectMixin
from
users.utils
import
AdminUserRequiredMixin
from
ops.utils.mixins
import
CreateSudoPrivilegesMixin
,
ListSudoPrivilegesMixin
from
ops.models
import
*
from
.models
import
Task
class
SudoListView
(
AdminUserRequiredMixin
,
ListSudoPrivilegesMixin
,
ListView
):
paginate_by
=
settings
.
CONFIG
.
DISPLAY_PER_PAGE
model
=
Sudo
context_object_name
=
'sudos'
template_name
=
'sudo/list.html'
class
SudoCreateView
(
AdminUserRequiredMixin
,
CreateSudoPrivilegesMixin
,
CreateView
):
model
=
Sudo
template_name
=
'sudo/create.html'
class
SudoUpdateView
(
AdminUserRequiredMixin
,
UpdateView
):
model
=
Sudo
template_name
=
'sudo/update.html'
class
SudoDetailView
(
DetailView
):
model
=
Sudo
context_object_name
=
'sudo'
template_name
=
'sudo/detail.html'
class
CronListView
(
AdminUserRequiredMixin
,
ListView
):
paginate_by
=
settings
.
CONFIG
.
DISPLAY_PER_PAGE
model
=
CronTable
context_object_name
=
'crons'
template_name
=
'cron/list.html'
class
CronCreateView
(
AdminUserRequiredMixin
,
CreateView
):
model
=
CronTable
template_name
=
'cron/create.html'
class
CronUpdateView
(
AdminUserRequiredMixin
,
UpdateView
):
model
=
CronTable
template_name
=
'cron/update.html'
class
CronDetailView
(
DetailView
):
model
=
CronTable
context_object_name
=
'cron'
template_name
=
'cron/detail.html'
class
TaskListView
(
AdminUserRequiredMixin
,
ListView
):
paginate_by
=
settings
.
CONFIG
.
DISPLAY_PER_PAGE
model
=
Task
...
...
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