mirror of https://github.com/jumpserver/jumpserver
[Bugfix] 修改一些bug
parent
7833fc8c80
commit
ab62bfca7e
99
README.md
99
README.md
|
@ -1,46 +1,59 @@
|
||||||
// Jumpserver //
|
## Jumpserver
|
||||||
|
Jumpserver是一款开源的跳板机产品,主要使用Python,Django开发
|
||||||
|
|
||||||
~ Jumpserver是什么?
|
### 开发环境
|
||||||
|
* Python 2.7 # 开发时需考虑兼容Python3
|
||||||
Jumpserver是一款开源的跳板机(堡垒机)产品, 主要使用Python,Django开发
|
|
||||||
他实现了跳板机(堡垒机)的主要功能,删减、优化了传统堡垒机,致力于为互联网
|
|
||||||
运维提供服务
|
|
||||||
|
|
||||||
~ 版本依赖
|
|
||||||
|
|
||||||
* Python 2.7
|
|
||||||
|
|
||||||
* Django 1.10
|
* Django 1.10
|
||||||
|
|
||||||
|
|
||||||
~ 快速开始
|
|
||||||
|
|
||||||
```
|
|
||||||
pip install -r requirements.txt # Install pip module
|
|
||||||
|
|
||||||
yum -y install `cat rpm_requirements.txt` # Install rpm package
|
|
||||||
|
|
||||||
cp config_example.py config.py # Prepaire config from example config
|
|
||||||
|
|
||||||
cd apps && python manage.py makemigrations # Make migrations for django
|
|
||||||
|
|
||||||
python manage.py migrate # Migrate ORM to database
|
|
||||||
|
|
||||||
python manage.py loaddata init # Init some data
|
|
||||||
|
|
||||||
python manage.py loaddata fake # Generake some fake data
|
|
||||||
|
|
||||||
yum -y install redis && service redis start # Or install redis docker
|
|
||||||
|
|
||||||
python manage.py runserver 0.0.0.0:80 # Run it
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
~ 文档
|
|
||||||
|
|
||||||
* [项目结构描述](https://code.jumpserver.org/jumpserver/jumpserver/blob/master/docs/project_structure.md)
|
### 安装
|
||||||
* [Python代码规范](https://code.jumpserver.org/jumpserver/jumpserver/blob/master/docs/python_style_guide.md)
|
1. 安装依赖库
|
||||||
* [API设计规范](https://code.jumpserver.org/jumpserver/jumpserver/blob/master/docs/api_style_guide.md)
|
```
|
||||||
* [表结构](https://code.jumpserver.org/Jumpserver/jumpserver/wikis/table-structure)
|
$ cd requirements
|
||||||
|
$ sudo yum -y install `cat rpm_requirements.txt` # CentOS/RedHat
|
||||||
|
$ sudo apt-get install `cat deb_requirements.txt` # Ubuntu/Debian
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 安装Python依赖包
|
||||||
|
|
||||||
|
```
|
||||||
|
# 请自行安装 Python2.7 和 pip, 以下运行是以python2.7和pip2.7开始
|
||||||
|
$ pip2.7 install -r requirements.txt -i https://pypi.doubanio.com/simple
|
||||||
|
|
||||||
|
# MacOS
|
||||||
|
$ pip2.7 install -r requirements.txt -i https://pypi.doubanio.com/simple --user
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 配置文件
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd ..
|
||||||
|
$ cp config_example.py config.py
|
||||||
|
```
|
||||||
|
|
||||||
|
配置项 参考 config.py
|
||||||
|
|
||||||
|
4. 初始化数据库
|
||||||
|
```
|
||||||
|
# cd utils
|
||||||
|
# sh make_migrations.sh
|
||||||
|
# sh init_db.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
5. 依赖redis
|
||||||
|
```
|
||||||
|
$ yum -y install redis
|
||||||
|
$ service redis start # Run docker or redis-server &
|
||||||
|
```
|
||||||
|
|
||||||
|
6. 启动
|
||||||
|
|
||||||
|
```
|
||||||
|
$ python2.7 run_server.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### 开发者文档
|
||||||
|
|
||||||
|
|
||||||
|
* [项目结构描述](https://github.com/jumpserver/jumpserver/blob/dev/docs/project_structure.md)
|
||||||
|
* [Python代码规范](https://github.com/jumpserver/jumpserver/blob/dev/docs/python_style_guide.md)
|
||||||
|
* [API设计规范](https://github.com/jumpserver/jumpserver/blob/dev/docs/api_style_guide.md)
|
||||||
|
|
|
@ -121,6 +121,9 @@ class IDCForm(forms.ModelForm):
|
||||||
'extranet': forms.Textarea(
|
'extranet': forms.Textarea(
|
||||||
attrs={'placeholder': 'IP段之间用逗号隔开,如:201.1.32.1/24,202.2.32.1/24'})
|
attrs={'placeholder': 'IP段之间用逗号隔开,如:201.1.32.1/24,202.2.32.1/24'})
|
||||||
}
|
}
|
||||||
|
help_texts = {
|
||||||
|
'name': '* required'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class AdminUserForm(forms.ModelForm):
|
class AdminUserForm(forms.ModelForm):
|
||||||
|
|
|
@ -47,9 +47,9 @@
|
||||||
|
|
||||||
<div class="hr-line-dashed"></div>
|
<div class="hr-line-dashed"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-sm-4 col-sm-offset-5">
|
<div class="col-sm-4 col-sm-offset-2">
|
||||||
<button class="btn btn-white" type="reset"> 重置 </button>
|
<button class="btn btn-default" type="reset"> {% trans 'Reset' %}</button>
|
||||||
<button class="btn btn-primary" type="submit"> 提交 </button>
|
<button id="submit_button" class="btn btn-primary" type="submit">{% trans 'Submit' %}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
<option value="delete">{% trans 'Delete selected' %}</option>
|
<option value="delete">{% trans 'Delete selected' %}</option>
|
||||||
</select>
|
</select>
|
||||||
<div class="input-group-btn pull-left" style="padding-left: 5px;">
|
<div class="input-group-btn pull-left" style="padding-left: 5px;">
|
||||||
<button id='btn_bulk_update' style="height: 32px;" class="btn btn-sm btn-warning">
|
<button id='btn_bulk_update' style="height: 32px;" class="btn btn-sm btn-primary">
|
||||||
{% trans 'Submit' %}
|
{% trans 'Submit' %}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
<option value="update">{% trans 'Update selected' %}</option>
|
<option value="update">{% trans 'Update selected' %}</option>
|
||||||
</select>
|
</select>
|
||||||
<div class="input-group-btn pull-left" style="padding-left: 5px;">
|
<div class="input-group-btn pull-left" style="padding-left: 5px;">
|
||||||
<button id='btn_bulk_update' style="height: 32px;" class="btn btn-sm btn-warning">
|
<button id='btn_bulk_update' style="height: 32px;" class="btn btn-sm btn-primary">
|
||||||
{% trans 'Submit' %}
|
{% trans 'Submit' %}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -30,8 +30,8 @@ class Task(models.Model):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
from ops.utils.ansible_api import ADHocRunner, Config
|
from ops.utils.ansible_api import ADHocRunner, Options
|
||||||
conf = Config()
|
conf = Options()
|
||||||
gather_facts = "yes" if self.is_gather_facts else "no"
|
gather_facts = "yes" if self.is_gather_facts else "no"
|
||||||
play_source = {
|
play_source = {
|
||||||
"name": "Ansible Play",
|
"name": "Ansible Play",
|
||||||
|
|
|
@ -3,12 +3,12 @@ from __future__ import absolute_import, unicode_literals
|
||||||
from celery import shared_task
|
from celery import shared_task
|
||||||
|
|
||||||
from common import celery_app
|
from common import celery_app
|
||||||
from ops.utils.ansible_api import Config, ADHocRunner
|
from ops.utils.ansible_api import Options, ADHocRunner
|
||||||
|
|
||||||
|
|
||||||
@shared_task(name="get_asset_hardware_info")
|
@shared_task(name="get_asset_hardware_info")
|
||||||
def get_asset_hardware_info(task_name, task_uuid, *assets):
|
def get_asset_hardware_info(task_name, task_uuid, *assets):
|
||||||
conf = Config()
|
conf = Options()
|
||||||
play_source = {
|
play_source = {
|
||||||
"name": "Get host hardware information",
|
"name": "Get host hardware information",
|
||||||
"hosts": "default",
|
"hosts": "default",
|
||||||
|
@ -24,7 +24,7 @@ def get_asset_hardware_info(task_name, task_uuid, *assets):
|
||||||
|
|
||||||
@shared_task(name="asset_test_ping_check")
|
@shared_task(name="asset_test_ping_check")
|
||||||
def asset_test_ping_check(task_name, task_uuid, *assets):
|
def asset_test_ping_check(task_name, task_uuid, *assets):
|
||||||
conf = Config()
|
conf = Options()
|
||||||
play_source = {
|
play_source = {
|
||||||
"name": "Test host connection use ping",
|
"name": "Test host connection use ping",
|
||||||
"hosts": "default",
|
"hosts": "default",
|
||||||
|
|
|
@ -20,7 +20,7 @@ from ansible.plugins.callback import CallbackBase
|
||||||
|
|
||||||
from ops.models import TaskRecord, AnsiblePlay, AnsibleTask, AnsibleHostResult
|
from ops.models import TaskRecord, AnsiblePlay, AnsibleTask, AnsibleHostResult
|
||||||
|
|
||||||
__all__ = ["ADHocRunner", "Config"]
|
__all__ = ["ADHocRunner", "Options"]
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -30,7 +30,7 @@ class AnsibleError(StandardError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Config(object):
|
class Options(object):
|
||||||
"""Ansible运行时配置类, 用于初始化Ansible的一些默认配置.
|
"""Ansible运行时配置类, 用于初始化Ansible的一些默认配置.
|
||||||
"""
|
"""
|
||||||
def __init__(self, verbosity=None, inventory=None, listhosts=None, subset=None, module_paths=None, extra_vars=None,
|
def __init__(self, verbosity=None, inventory=None, listhosts=None, subset=None, module_paths=None, extra_vars=None,
|
||||||
|
@ -93,7 +93,8 @@ class Config(object):
|
||||||
|
|
||||||
|
|
||||||
class InventoryMixin(object):
|
class InventoryMixin(object):
|
||||||
"""提供生成Ansible inventory对象的方法
|
"""
|
||||||
|
提供生成Ansible inventory对象的方法
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def gen_inventory(self):
|
def gen_inventory(self):
|
||||||
|
@ -313,7 +314,8 @@ class PlayBookRunner(InventoryMixin):
|
||||||
"""用于执行AnsiblePlaybook的接口.简化Playbook对象的使用.
|
"""用于执行AnsiblePlaybook的接口.简化Playbook对象的使用.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, config, palybook_path, playbook_var, become_pass, *hosts, **group_vars):
|
def __init__(self, config, palybook_path, playbook_var,
|
||||||
|
become_pass, *hosts, **group_vars):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
:param config: Config实例
|
:param config: Config实例
|
||||||
|
@ -392,7 +394,8 @@ class PlayBookRunner(InventoryMixin):
|
||||||
|
|
||||||
|
|
||||||
class ADHocRunner(InventoryMixin):
|
class ADHocRunner(InventoryMixin):
|
||||||
"""ADHoc接口
|
"""
|
||||||
|
ADHoc接口
|
||||||
"""
|
"""
|
||||||
def __init__(self, play_data, config=None, *hosts, **group_vars):
|
def __init__(self, play_data, config=None, *hosts, **group_vars):
|
||||||
"""
|
"""
|
||||||
|
@ -408,7 +411,7 @@ class ADHocRunner(InventoryMixin):
|
||||||
tasks=[dict(action=dict(module='service', args={'name': 'vsftpd', 'state': 'restarted'}), async=async, poll=poll)]
|
tasks=[dict(action=dict(module='service', args={'name': 'vsftpd', 'state': 'restarted'}), async=async, poll=poll)]
|
||||||
)
|
)
|
||||||
"""
|
"""
|
||||||
self.options = config if config != None else Config()
|
self.options = config if config != None else Options()
|
||||||
|
|
||||||
# 设置verbosity级别, 及命令行的--verbose选项
|
# 设置verbosity级别, 及命令行的--verbose选项
|
||||||
self.display = Display()
|
self.display = Display()
|
||||||
|
@ -482,7 +485,7 @@ class ADHocRunner(InventoryMixin):
|
||||||
|
|
||||||
|
|
||||||
def test_run():
|
def test_run():
|
||||||
conf = Config()
|
conf = Options()
|
||||||
assets = [
|
assets = [
|
||||||
{
|
{
|
||||||
"name": "192.168.1.119",
|
"name": "192.168.1.119",
|
||||||
|
|
|
@ -50,8 +50,6 @@
|
||||||
</a>
|
</a>
|
||||||
<ul class="nav nav-second-level">
|
<ul class="nav nav-second-level">
|
||||||
<li id="task"><a href="{% url 'ops:page-task-list' %}">{% trans 'Task' %}</a></li>
|
<li id="task"><a href="{% url 'ops:page-task-list' %}">{% trans 'Task' %}</a></li>
|
||||||
<li id="sudo"><a href="{% url 'ops:page-sudo-list' %}">{% trans 'Sudo' %}</a></li>
|
|
||||||
<li id="cron"><a href="{% url 'ops:page-cron-list' %}">{% trans 'Cron' %}</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,8 @@ from common.mixins import NoDeleteModelMixin
|
||||||
__all__ = ['UserGroup']
|
__all__ = ['UserGroup']
|
||||||
|
|
||||||
|
|
||||||
class UserGroup(NoDeleteModelMixin, Group):
|
class UserGroup(NoDeleteModelMixin):
|
||||||
|
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||||
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
comment = models.TextField(blank=True, verbose_name=_('Comment'))
|
||||||
date_created = models.DateTimeField(auto_now_add=True, null=True)
|
date_created = models.DateTimeField(auto_now_add=True, null=True)
|
||||||
created_by = models.CharField(max_length=100)
|
created_by = models.CharField(max_length=100)
|
||||||
|
@ -34,9 +35,12 @@ class UserGroup(NoDeleteModelMixin, Group):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def initial(cls):
|
def initial(cls):
|
||||||
group, created = cls.objects.get_or_create(
|
default_group = cls.objects.filter(name='Default')
|
||||||
name='Default', created_by='System',
|
if not default_group:
|
||||||
comment='Default user group for all user')
|
group = cls(name='Default', created_by='System', comment='Default user group')
|
||||||
|
group.save()
|
||||||
|
else:
|
||||||
|
group = default_group[0]
|
||||||
return group
|
return group
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
@ -99,8 +99,8 @@ class DevelopmentConfig(Config):
|
||||||
EMAIL_PORT = 465
|
EMAIL_PORT = 465
|
||||||
EMAIL_HOST_USER = 'ask@jumpserver.org'
|
EMAIL_HOST_USER = 'ask@jumpserver.org'
|
||||||
EMAIL_HOST_PASSWORD = 'xfDf4x1n'
|
EMAIL_HOST_PASSWORD = 'xfDf4x1n'
|
||||||
EMAIL_USE_SSL = True # If port is 465, set True
|
EMAIL_USE_SSL = True
|
||||||
EMAIL_USE_TLS = False # If port is 587, set True
|
EMAIL_USE_TLS = False
|
||||||
EMAIL_SUBJECT_PREFIX = '[Jumpserver] '
|
EMAIL_SUBJECT_PREFIX = '[Jumpserver] '
|
||||||
SITE_URL = 'http://localhost:8080'
|
SITE_URL = 'http://localhost:8080'
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ def start_django():
|
||||||
http_port = CONFIG.HTTP_LISTEN_PORT or '8080'
|
http_port = CONFIG.HTTP_LISTEN_PORT or '8080'
|
||||||
os.chdir(apps_dir)
|
os.chdir(apps_dir)
|
||||||
print('start django')
|
print('start django')
|
||||||
subprocess.call('python ./manage.py runserver %s:%s' % (http_host, http_port), shell=True)
|
subprocess.call('python2.7 ./manage.py runserver %s:%s' % (http_host, http_port), shell=True)
|
||||||
|
|
||||||
|
|
||||||
def start_celery():
|
def start_celery():
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
|
|
||||||
python ../apps/manage.py makemigrations
|
python2.7 ../apps/manage.py makemigrations
|
||||||
|
|
||||||
python ../apps/manage.py migrate
|
python2.7 ../apps/manage.py migrate
|
||||||
|
|
Loading…
Reference in New Issue