diff --git a/README.md b/README.md
index 9ec85a624..2154da785 100644
--- a/README.md
+++ b/README.md
@@ -1,46 +1,59 @@
- // Jumpserver //
-
-
- ~ Jumpserver是什么?
-
- Jumpserver是一款开源的跳板机(堡垒机)产品, 主要使用Python,Django开发
- 他实现了跳板机(堡垒机)的主要功能,删减、优化了传统堡垒机,致力于为互联网
- 运维提供服务
-
- ~ 版本依赖
-
- * Python 2.7
-
+## Jumpserver
+Jumpserver是一款开源的跳板机产品,主要使用Python,Django开发
+
+### 开发环境
+ * Python 2.7 # 开发时需考虑兼容Python3
* 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)
- * [API设计规范](https://code.jumpserver.org/jumpserver/jumpserver/blob/master/docs/api_style_guide.md)
- * [表结构](https://code.jumpserver.org/Jumpserver/jumpserver/wikis/table-structure)
+### 安装
+1. 安装依赖库
+```
+ $ 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)
diff --git a/apps/assets/forms.py b/apps/assets/forms.py
index c8f846f15..ec95f0e1d 100644
--- a/apps/assets/forms.py
+++ b/apps/assets/forms.py
@@ -121,6 +121,9 @@ class IDCForm(forms.ModelForm):
'extranet': forms.Textarea(
attrs={'placeholder': 'IP段之间用逗号隔开,如:201.1.32.1/24,202.2.32.1/24'})
}
+ help_texts = {
+ 'name': '* required'
+ }
class AdminUserForm(forms.ModelForm):
diff --git a/apps/assets/templates/assets/idc_create_update.html b/apps/assets/templates/assets/idc_create_update.html
index 67c7f4c55..b811a2b27 100644
--- a/apps/assets/templates/assets/idc_create_update.html
+++ b/apps/assets/templates/assets/idc_create_update.html
@@ -47,9 +47,9 @@
-
-
-
+
+
+
diff --git a/apps/assets/templates/assets/idc_list.html b/apps/assets/templates/assets/idc_list.html
index 8663e5009..a3471adc8 100644
--- a/apps/assets/templates/assets/idc_list.html
+++ b/apps/assets/templates/assets/idc_list.html
@@ -32,7 +32,7 @@
-
diff --git a/apps/assets/templates/assets/system_user_list.html b/apps/assets/templates/assets/system_user_list.html
index 51b6456b4..6a1a85884 100644
--- a/apps/assets/templates/assets/system_user_list.html
+++ b/apps/assets/templates/assets/system_user_list.html
@@ -32,7 +32,7 @@
-
+
{% trans 'Submit' %}
diff --git a/apps/ops/models/task.py b/apps/ops/models/task.py
index babfbefa5..979d36479 100644
--- a/apps/ops/models/task.py
+++ b/apps/ops/models/task.py
@@ -30,8 +30,8 @@ class Task(models.Model):
return []
def run(self):
- from ops.utils.ansible_api import ADHocRunner, Config
- conf = Config()
+ from ops.utils.ansible_api import ADHocRunner, Options
+ conf = Options()
gather_facts = "yes" if self.is_gather_facts else "no"
play_source = {
"name": "Ansible Play",
diff --git a/apps/ops/tasks/_celery_tasks.py b/apps/ops/tasks/_celery_tasks.py
index 13fe8d0c1..9c76fdc84 100644
--- a/apps/ops/tasks/_celery_tasks.py
+++ b/apps/ops/tasks/_celery_tasks.py
@@ -3,12 +3,12 @@ from __future__ import absolute_import, unicode_literals
from celery import shared_task
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")
def get_asset_hardware_info(task_name, task_uuid, *assets):
- conf = Config()
+ conf = Options()
play_source = {
"name": "Get host hardware information",
"hosts": "default",
@@ -24,7 +24,7 @@ def get_asset_hardware_info(task_name, task_uuid, *assets):
@shared_task(name="asset_test_ping_check")
def asset_test_ping_check(task_name, task_uuid, *assets):
- conf = Config()
+ conf = Options()
play_source = {
"name": "Test host connection use ping",
"hosts": "default",
diff --git a/apps/ops/utils/ansible_api.py b/apps/ops/utils/ansible_api.py
index 3f3345c5f..09af3a37c 100644
--- a/apps/ops/utils/ansible_api.py
+++ b/apps/ops/utils/ansible_api.py
@@ -20,7 +20,7 @@ from ansible.plugins.callback import CallbackBase
from ops.models import TaskRecord, AnsiblePlay, AnsibleTask, AnsibleHostResult
-__all__ = ["ADHocRunner", "Config"]
+__all__ = ["ADHocRunner", "Options"]
logger = logging.getLogger(__name__)
@@ -30,7 +30,7 @@ class AnsibleError(StandardError):
pass
-class Config(object):
+class Options(object):
"""Ansible运行时配置类, 用于初始化Ansible的一些默认配置.
"""
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):
- """提供生成Ansible inventory对象的方法
+ """
+ 提供生成Ansible inventory对象的方法
"""
def gen_inventory(self):
@@ -313,7 +314,8 @@ class PlayBookRunner(InventoryMixin):
"""用于执行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实例
@@ -392,7 +394,8 @@ class PlayBookRunner(InventoryMixin):
class ADHocRunner(InventoryMixin):
- """ADHoc接口
+ """
+ ADHoc接口
"""
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)]
)
"""
- self.options = config if config != None else Config()
+ self.options = config if config != None else Options()
# 设置verbosity级别, 及命令行的--verbose选项
self.display = Display()
@@ -482,7 +485,7 @@ class ADHocRunner(InventoryMixin):
def test_run():
- conf = Config()
+ conf = Options()
assets = [
{
"name": "192.168.1.119",
diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html
index 92b9c5894..25ecf136d 100644
--- a/apps/templates/_nav.html
+++ b/apps/templates/_nav.html
@@ -50,8 +50,6 @@
diff --git a/apps/users/models/group.py b/apps/users/models/group.py
index 939ddeaf8..d24d05553 100644
--- a/apps/users/models/group.py
+++ b/apps/users/models/group.py
@@ -14,7 +14,8 @@ from common.mixins import NoDeleteModelMixin
__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'))
date_created = models.DateTimeField(auto_now_add=True, null=True)
created_by = models.CharField(max_length=100)
@@ -34,9 +35,12 @@ class UserGroup(NoDeleteModelMixin, Group):
@classmethod
def initial(cls):
- group, created = cls.objects.get_or_create(
- name='Default', created_by='System',
- comment='Default user group for all user')
+ default_group = cls.objects.filter(name='Default')
+ if not default_group:
+ group = cls(name='Default', created_by='System', comment='Default user group')
+ group.save()
+ else:
+ group = default_group[0]
return group
@classmethod
diff --git a/config_example.py b/config_example.py
index 71b9ab8bc..d600832f0 100644
--- a/config_example.py
+++ b/config_example.py
@@ -99,8 +99,8 @@ class DevelopmentConfig(Config):
EMAIL_PORT = 465
EMAIL_HOST_USER = 'ask@jumpserver.org'
EMAIL_HOST_PASSWORD = 'xfDf4x1n'
- EMAIL_USE_SSL = True # If port is 465, set True
- EMAIL_USE_TLS = False # If port is 587, set True
+ EMAIL_USE_SSL = True
+ EMAIL_USE_TLS = False
EMAIL_SUBJECT_PREFIX = '[Jumpserver] '
SITE_URL = 'http://localhost:8080'
diff --git a/run_server.py b/run_server.py
index fc730ae51..384db3282 100644
--- a/run_server.py
+++ b/run_server.py
@@ -23,7 +23,7 @@ def start_django():
http_port = CONFIG.HTTP_LISTEN_PORT or '8080'
os.chdir(apps_dir)
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():
diff --git a/utils/make_migrations.sh b/utils/make_migrations.sh
index 0704b9cc9..3da8a20b1 100755
--- a/utils/make_migrations.sh
+++ b/utils/make_migrations.sh
@@ -1,6 +1,6 @@
#!/bin/bash
#
-python ../apps/manage.py makemigrations
+python2.7 ../apps/manage.py makemigrations
-python ../apps/manage.py migrate
+python2.7 ../apps/manage.py migrate