diff --git a/.gitignore b/.gitignore index abf165e2e..dc51315af 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,4 @@ celerybeat.pid django.db celerybeat-schedule.db data/static -_build/ +docs/_build/ diff --git a/README.md b/README.md index 818294247..9d15557fb 100644 --- a/README.md +++ b/README.md @@ -18,103 +18,40 @@ Jumpserver采纳分布式架构,支持多机房跨区域部署,中心节点 ---- -### Feature 功能 - - Auth 统一认证 - - CMDB 资产管理 - - Perm 统一授权 - - Audit 审计 - - LDAP AUTH 支持LDAP认证 +### 功能 + - 统一认证 + - 资产管理 + - 统一授权 + - 审计 + - 支持LDAP认证 - Web terminal - SSH Server + - 支持Windows RDP + +### 开始使用 + +快速开始文档 [Docker安装](http://docs.jumpserver.org/zh/latest/quickstart.html) + +一步一步安装文档 [详细部署](http://docs.jumpserver.org/zh/latest/step_by_step.html) + +也可以查看我们完整文档包括了使用和开发 [文档](http://docs.jumpserver.org) -### Environment 环境 - * Python 3.6 - * Django 1.11 +### Demo 和 截图 -### 快速启动 +我们提供了DEMO和截图可以让你快速了解Jumpserver -``` -$ docker run -p 8080:80 -p 2222:2222 jumpserver/jumpserver:0.5.0-beta2 -``` -更多见 [Dockerfile](https://github.com/jumpserver/Dockerfile.git) - -### 详细安装步骤 - -    [文档](https://github.com/jumpserver/jumpserver/wiki/v0.5.0-%E5%9F%BA%E4%BA%8E-CentOS7) - - -### Usage 使用 -   1. Visit http://$HOST:8080 (访问 http://你的主机IP:8080 来访问 Jumpserver) - -   2. Click left navigation visit Applications-Terminal and accept coco and luna register - (点击左侧 应用程序接受 Coco注册) - -   3. Click Assets-Admin user, Create admin user - (添加 管理用户) - - 4. Click Assets-System user, Create system user - (添加 系统用户) - -   5. Click Assets-Asset, Add a asset - (添加 资产) - -   6. Click Perms-Asset permission, Add a perm rule - (添加授权规则,授权给admin) - -   7. Connect ssh server coco (连接 ssh server coco) - - ssh -p2222 $USER@$Host - - - -### Snapshot 截图 - - https://github.com/jumpserver/jumpserver/issues/438 - - -### Demo - -demo使用了开发者模式,并发只能为1 - -- Jumpserver: [访问](http://demo.jumpserver.org:8080) 账号: admin 密码: admin - -- Coco: ssh -p 2222 admin@demo.jumpserver.org 密码: admin - -### ROADMAP - -参见 https://github.com/jumpserver/jumpserver/milestone/2 +[DEMO](http://demo.jumpserver.org) +[截图](http://docs.jumpserver.org/zh/docs/snapshot.html) ### SDK -- python: https://github.com/jumpserver/jumpserver-python-sdk -- java: https://github.com/KaiJunYan/jumpserver-java-sdk.git +我们还编写了一些SDK,供你其它系统快速和Jumpserver APi交互, -### Docs 开发者文档 +- [python](https://github.com/jumpserver/jumpserver-python-sdk) Jumpserver其它组件使用这个SDK完成交互 +- [java](https://github.com/KaiJunYan/jumpserver-java-sdk.git) 恺珺同学提供的Java版本的SDK - * [Project structure 项目结构描述](https://github.com/jumpserver/jumpserver/blob/dev/docs/project_structure.md) - * [Code style Python代码规范](https://github.com/jumpserver/jumpserver/blob/dev/docs/python_style_guide.md) - * [Api style API设计规范](https://github.com/jumpserver/jumpserver/blob/dev/docs/api_style_guide.md) - -### Contributor 贡献者 -#### 0.4.0 -- ibuler <广宏伟> -- 小彧 <李磊> Django资深开发者,为users模块贡献了很多代码 -- sofia <周小侠> 资深前端工程师, luna前端代码贡献者和现在维护者 -- liuz <刘正> 全栈工程师, 编写了luna大部分代码 -- jiaxiangkong <陈尚委> Jumpserver测试运营 - -#### 0.3.2 -- halcyon <王墉> DevOps 资深开发者, 0.3.2 核心开发者之一 -- yumaojun03 <喻茂峻> DevOps 资深开发者,jperm开发者,擅长Python, Go以及PAAS平台开发 -- kelianchun <柯连春> DevOps 资产开发者,fix了很多connect.py bug - -### 开发者群 -如果你为Jumpserver贡献过代码,请加一下群 (需要验证一下你的github id) - -群号: 489385245 - ### License & Copyright Copyright (c) 2014-2017 Beijing Duizhan Tech, Inc., All rights reserved. diff --git a/apps/assets/forms/asset.py b/apps/assets/forms/asset.py index 34865c544..ce3e3fb56 100644 --- a/apps/assets/forms/asset.py +++ b/apps/assets/forms/asset.py @@ -34,9 +34,11 @@ class AssetCreateForm(forms.ModelForm): 'hostname': '* required', 'ip': '* required', 'port': '* required', - 'admin_user': _('Admin user is a privilege user exist on this asset,' - 'Example: root or other NOPASSWD sudo privilege user' - ) + 'admin_user': _( + 'Admin user is a privilege user exist on this asset,' + 'Example: root or other NOPASSWD sudo privilege user' + 'If asset not support ansible, set any one' + ) } @@ -67,6 +69,7 @@ class AssetUpdateForm(forms.ModelForm): 'admin_user': _( 'Admin user is a privilege user exist on this asset,' 'Example: root or other NOPASSWD sudo privilege user' + 'If asset not support ansible, set any one' ) } diff --git a/apps/assets/tasks.py b/apps/assets/tasks.py index a20ab3a74..3f792a080 100644 --- a/apps/assets/tasks.py +++ b/apps/assets/tasks.py @@ -343,8 +343,12 @@ def push_system_user_util(system_users, assets, task_name): from ops.utils import update_or_create_ansible_task tasks = [] for system_user in system_users: - if system_user.is_need_push(): - tasks.extend(get_push_system_user_tasks(system_user)) + if not system_user.is_need_push(): + msg = "push system user `{}` passed, may be not auto push or ssh " \ + "protocol is not ssh".format(system_user.name) + logger.info(msg) + continue + tasks.extend(get_push_system_user_tasks(system_user)) if not tasks: logger.info("Not tasks, passed") @@ -376,6 +380,12 @@ def push_system_user_to_node(system_user, node): @shared_task def push_system_user_related_nodes(system_user): + if not system_user.is_need_push(): + msg = "push system user `{}` passed, may be not auto push or ssh " \ + "protocol is not ssh".format(system_user.name) + logger.info(msg) + return + nodes = system_user.nodes.all() for node in nodes: push_system_user_to_node(system_user, node) diff --git a/apps/assets/templates/assets/system_user_asset.html b/apps/assets/templates/assets/system_user_asset.html index f82f97ab8..4ac3a5e04 100644 --- a/apps/assets/templates/assets/system_user_asset.html +++ b/apps/assets/templates/assets/system_user_asset.html @@ -67,7 +67,7 @@ - + - + {% if system_user.auto_push %} + + {% endif %}
{% trans 'Push system user manually' %}:{% trans 'Push system user now' %}: diff --git a/apps/assets/templates/assets/system_user_detail.html b/apps/assets/templates/assets/system_user_detail.html index c655436b9..28d792bd2 100644 --- a/apps/assets/templates/assets/system_user_detail.html +++ b/apps/assets/templates/assets/system_user_detail.html @@ -131,7 +131,8 @@
{% trans 'Push system user manually' %}:{% trans 'Push system user now' %}: @@ -139,6 +140,7 @@
{% trans 'Test assets connective' %}: diff --git a/apps/i18n/zh/LC_MESSAGES/django.mo b/apps/i18n/zh/LC_MESSAGES/django.mo index 2861b0128..7a5757460 100644 Binary files a/apps/i18n/zh/LC_MESSAGES/django.mo and b/apps/i18n/zh/LC_MESSAGES/django.mo differ diff --git a/apps/i18n/zh/LC_MESSAGES/django.po b/apps/i18n/zh/LC_MESSAGES/django.po index 2a98c8c0c..ff95b3eab 100644 --- a/apps/i18n/zh/LC_MESSAGES/django.po +++ b/apps/i18n/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Jumpserver 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-07 11:54+0800\n" +"POT-Creation-Date: 2018-03-07 21:18+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -21,40 +21,42 @@ msgstr "" msgid "New node {}" msgstr "新节点 {}" -#: assets/forms/asset.py:23 assets/forms/asset.py:52 assets/forms/user.py:125 +#: assets/forms/asset.py:23 assets/forms/asset.py:54 assets/forms/user.py:125 #: assets/models/asset.py:53 assets/models/user.py:218 #: assets/templates/assets/asset_detail.html:181 #: assets/templates/assets/asset_detail.html:189 -#: assets/templates/assets/system_user_detail.html:164 +#: assets/templates/assets/system_user_detail.html:166 msgid "Nodes" msgstr "节点管理" -#: assets/forms/asset.py:26 assets/forms/asset.py:55 assets/forms/asset.py:90 -#: assets/forms/asset.py:94 assets/models/asset.py:57 +#: assets/forms/asset.py:26 assets/forms/asset.py:57 assets/forms/asset.py:93 +#: assets/forms/asset.py:97 assets/models/asset.py:57 #: assets/models/cluster.py:19 assets/models/user.py:187 #: assets/templates/assets/asset_detail.html:73 templates/_nav.html:24 msgid "Admin user" msgstr "管理用户" -#: assets/forms/asset.py:29 assets/forms/asset.py:58 assets/models/asset.py:81 +#: assets/forms/asset.py:29 assets/forms/asset.py:60 assets/models/asset.py:81 #: assets/templates/assets/asset_create.html:32 #: assets/templates/assets/asset_detail.html:218 #: assets/templates/assets/asset_update.html:37 templates/_nav.html:26 msgid "Labels" msgstr "标签管理" -#: assets/forms/asset.py:37 assets/forms/asset.py:68 +#: assets/forms/asset.py:38 assets/forms/asset.py:70 msgid "" "Admin user is a privilege user exist on this asset,Example: root or other " -"NOPASSWD sudo privilege user" -msgstr "管理用户是资产上已经存在的特权用户,如 root或者其它有NOPASSWD的用户" +"NOPASSWD sudo privilege userIf asset not support ansible, set any one" +msgstr "" +"管理用户是资产上已经存在的特权用户,如 root或者其它有NOPASSWD的用户, 如果资产" +"不支持ansible, 任意设置一个即可" -#: assets/forms/asset.py:77 assets/forms/asset.py:81 assets/forms/label.py:15 +#: assets/forms/asset.py:80 assets/forms/asset.py:84 assets/forms/label.py:15 #: perms/templates/perms/asset_permission_asset.html:88 users/forms.py:242 msgid "Select assets" msgstr "选择资产" -#: assets/forms/asset.py:86 assets/models/asset.py:52 +#: assets/forms/asset.py:89 assets/models/asset.py:52 #: assets/templates/assets/admin_user_assets.html:53 #: assets/templates/assets/asset_detail.html:69 #: assets/templates/assets/system_user_asset.html:51 @@ -62,11 +64,11 @@ msgstr "选择资产" msgid "Port" msgstr "端口" -#: assets/forms/asset.py:106 assets/templates/assets/asset_create.html:36 +#: assets/forms/asset.py:109 assets/templates/assets/asset_create.html:36 msgid "Select labels" msgstr "选择标签" -#: assets/forms/asset.py:109 assets/templates/assets/admin_user_detail.html:91 +#: assets/forms/asset.py:112 assets/templates/assets/admin_user_detail.html:91 msgid "Select nodes" msgstr "选择节点" @@ -454,11 +456,11 @@ msgstr "测试系统用户可连接性: {}" msgid "test system user connectability period: {}" msgstr "测试系统用户可连接性: {}" -#: assets/tasks.py:365 +#: assets/tasks.py:369 msgid "Push system user to node: {} => {}" msgstr "推送系统用户到节点: {}->{}" -#: assets/tasks.py:397 +#: assets/tasks.py:407 msgid "Push system users to node: {}" msgstr "推送系统用户到节点: {}" @@ -748,7 +750,7 @@ msgstr "测试可连接性" #: assets/templates/assets/admin_user_assets.html:75 #: assets/templates/assets/asset_detail.html:170 #: assets/templates/assets/system_user_asset.html:81 -#: assets/templates/assets/system_user_detail.html:145 +#: assets/templates/assets/system_user_detail.html:147 msgid "Test" msgstr "测试" @@ -763,7 +765,7 @@ msgstr "替换资产的管理员" #: assets/templates/assets/admin_user_detail.html:100 #: assets/templates/assets/asset_detail.html:198 #: assets/templates/assets/asset_list.html:541 -#: assets/templates/assets/system_user_detail.html:181 +#: assets/templates/assets/system_user_detail.html:183 #: assets/templates/assets/system_user_list.html:135 templates/_modal.html:16 #: terminal/templates/terminal/session_detail.html:108 #: users/templates/users/user_detail.html:339 @@ -936,27 +938,27 @@ msgid "Assets of " msgstr "资产" #: assets/templates/assets/system_user_asset.html:70 -#: assets/templates/assets/system_user_detail.html:134 -msgid "Push system user manually" -msgstr "手动推送系统" +#: assets/templates/assets/system_user_detail.html:135 +msgid "Push system user now" +msgstr "立刻推送系统" #: assets/templates/assets/system_user_asset.html:73 -#: assets/templates/assets/system_user_detail.html:137 +#: assets/templates/assets/system_user_detail.html:138 msgid "Push" msgstr "推送" #: assets/templates/assets/system_user_asset.html:78 -#: assets/templates/assets/system_user_detail.html:142 +#: assets/templates/assets/system_user_detail.html:144 msgid "Test assets connective" msgstr "测试资产可连接性" #: assets/templates/assets/system_user_asset.html:147 -#: assets/templates/assets/system_user_detail.html:301 +#: assets/templates/assets/system_user_detail.html:303 msgid "Task has been send, Go to ops task list seen result" msgstr "任务已下发,查看ops任务列表" #: assets/templates/assets/system_user_asset.html:159 -#: assets/templates/assets/system_user_detail.html:313 +#: assets/templates/assets/system_user_detail.html:315 msgid "Task has been send, seen left assets status" msgstr "任务已下发,查看左侧资产状态" @@ -968,7 +970,7 @@ msgstr "家目录" msgid "Uid" msgstr "Uid" -#: assets/templates/assets/system_user_detail.html:172 +#: assets/templates/assets/system_user_detail.html:174 msgid "Add to node" msgstr "添加到节点" diff --git a/apps/templates/_header_bar.html b/apps/templates/_header_bar.html index 4615674a8..ae552fbb6 100644 --- a/apps/templates/_header_bar.html +++ b/apps/templates/_header_bar.html @@ -19,7 +19,7 @@ diff --git a/apps/templates/index.html b/apps/templates/index.html index 800b1d46f..a297adedd 100644 --- a/apps/templates/index.html +++ b/apps/templates/index.html @@ -168,9 +168,9 @@
{% ifequal login.is_finished 0 %} - {{ login.date_start|timesince }} ago + {{ login.date_start|timesince }} 前 {% else %} - {{ login.date_start|timesince }} ago + {{ login.date_start|timesince }} 前 {% endifequal %} {{ login.user }} 登录了{{ login.asset }}
{{ login.date_start }} diff --git a/apps/terminal/api.py b/apps/terminal/api.py index 88f8fc926..da0e88820 100644 --- a/apps/terminal/api.py +++ b/apps/terminal/api.py @@ -4,12 +4,15 @@ from collections import OrderedDict import logging import os import uuid +import boto3 # AWS S3 sdk from django.core.cache import cache from django.shortcuts import get_object_or_404, redirect from django.utils import timezone from django.core.files.storage import default_storage from django.http import HttpResponseNotFound +from django.conf import settings + from rest_framework import viewsets, serializers from rest_framework.views import APIView, Response from rest_framework.permissions import AllowAny @@ -23,7 +26,6 @@ from .hands import IsSuperUserOrAppUser, IsAppUser, \ IsSuperUserOrAppUserOrUserReadonly from .backends import get_command_store, get_multi_command_store, \ SessionCommandSerializer -import boto3 # AWS S3 sdk logger = logging.getLogger(__file__) @@ -280,11 +282,11 @@ class SessionReplayViewSet(viewsets.ViewSet): url = default_storage.url(path) return redirect(url) else: - config = self.app.config.get("REPLAY_STORAGE", None) + config = settings.TERMINAL_REPLAY_STORAGE.items() if config: - for name in config.keys(): - if config[name].get("TYPE", '') == "s3": - client, bucket = self.s3Client(config[name]) + for name, value in config: + if value.get("TYPE", '') == "s3": + client, bucket = self.s3Client(value) try: client.head_object(Bucket=bucket, Key=path) client.download_file(bucket, path, default_storage.base_location + '/' + path) @@ -298,7 +300,7 @@ class SessionReplayViewSet(viewsets.ViewSet): REGION = config.get("REGION", None) ACCESS_KEY = config.get("ACCESS_KEY", None) SECRET_KEY = config.get("SECRET_KEY", None) - if self.ACCESS_KEY and REGION and SECRET_KEY: + if ACCESS_KEY and REGION and SECRET_KEY: s3 = boto3.client('s3', region_name=REGION, aws_access_key_id=ACCESS_KEY, diff --git a/apps/terminal/models.py b/apps/terminal/models.py index 91ac8e052..5829fa2e1 100644 --- a/apps/terminal/models.py +++ b/apps/terminal/models.py @@ -127,7 +127,7 @@ class Session(models.Model): is_finished = models.BooleanField(default=False) has_replay = models.BooleanField(default=False, verbose_name=_("Replay")) has_command = models.BooleanField(default=False, verbose_name=_("Command")) - terminal = models.ForeignKey(Terminal, null=True, on_delete=models.CASCADE) + terminal = models.ForeignKey(Terminal, null=True, on_delete=models.SET_NULL) date_last_active = models.DateTimeField(verbose_name=_("Date last active"), default=timezone.now) date_start = models.DateTimeField(verbose_name=_("Date start"), db_index=True) date_end = models.DateTimeField(verbose_name=_("Date end"), null=True) @@ -148,7 +148,7 @@ class Task(models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, choices=NAME_CHOICES, verbose_name=_("Name")) args = models.CharField(max_length=1024, verbose_name=_("Args")) - terminal = models.ForeignKey(Terminal, null=True, on_delete=models.CASCADE) + terminal = models.ForeignKey(Terminal, null=True, on_delete=models.SET_NULL) is_finished = models.BooleanField(default=False) date_created = models.DateTimeField(auto_now_add=True) date_finished = models.DateTimeField(null=True) diff --git a/apps/terminal/tasks.py b/apps/terminal/tasks.py index 89f9cc5cc..e267b30b7 100644 --- a/apps/terminal/tasks.py +++ b/apps/terminal/tasks.py @@ -31,6 +31,6 @@ def delete_terminal_status_period(): def clean_orphan_session(): active_sessions = Session.objects.filter(is_finished=False) for session in active_sessions: - if not session.terminal.is_active: + if not session.terminal or not session.terminal.is_active: session.is_finished = True session.save() diff --git a/apps/users/migrations/0002_auto_20171225_1157.py b/apps/users/migrations/0002_auto_20171225_1157.py deleted file mode 100644 index 6b5bae73c..000000000 --- a/apps/users/migrations/0002_auto_20171225_1157.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2017-12-25 03:57 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='user', - name='email', - field=models.EmailField(max_length=128, unique=True, verbose_name='Email'), - ), - migrations.AlterField( - model_name='user', - name='name', - field=models.CharField(max_length=128, verbose_name='Name'), - ), - migrations.AlterField( - model_name='user', - name='username', - field=models.CharField(max_length=128, unique=True, verbose_name='Username'), - ), - migrations.AlterField( - model_name='user', - name='wechat', - field=models.CharField(blank=True, max_length=128, verbose_name='Wechat'), - ), - ] diff --git a/docs/_static/img/admin_asset.png b/docs/_static/img/admin_asset.png new file mode 100644 index 000000000..a4d33d475 Binary files /dev/null and b/docs/_static/img/admin_asset.png differ diff --git a/docs/_static/img/admin_user.png b/docs/_static/img/admin_user.png new file mode 100644 index 000000000..de844ad21 Binary files /dev/null and b/docs/_static/img/admin_user.png differ diff --git a/docs/_static/img/dash_board.png b/docs/_static/img/dash_board.png new file mode 100644 index 000000000..ffb940668 Binary files /dev/null and b/docs/_static/img/dash_board.png differ diff --git a/docs/_static/img/linux_terminal.png b/docs/_static/img/linux_terminal.png new file mode 100644 index 000000000..c745a826e Binary files /dev/null and b/docs/_static/img/linux_terminal.png differ diff --git a/docs/_static/img/logo-text.png b/docs/_static/img/logo-text.png old mode 100644 new mode 100755 index cb76b555a..f4912a08f Binary files a/docs/_static/img/logo-text.png and b/docs/_static/img/logo-text.png differ diff --git a/docs/_static/img/windows_terminal.png b/docs/_static/img/windows_terminal.png new file mode 100644 index 000000000..14f56e57b Binary files /dev/null and b/docs/_static/img/windows_terminal.png differ diff --git a/docs/admin_asset.rst b/docs/admin_asset.rst index 758db8912..03aec1675 100644 --- a/docs/admin_asset.rst +++ b/docs/admin_asset.rst @@ -1,2 +1,12 @@ 资产管理模块 -============= \ No newline at end of file +============= + +这里介绍资产管理模块功能。 + +.. toctree:: + :maxdepth: 1 + + asset_list + asset_admin_user + asset_system_user + asset_label \ No newline at end of file diff --git a/docs/admin_guide.rst b/docs/admin_guide.rst index df59969cc..fd770c17c 100644 --- a/docs/admin_guide.rst +++ b/docs/admin_guide.rst @@ -6,5 +6,10 @@ .. toctree:: :maxdepth: 1 + admin_instruction admin_user admin_asset + admin_permission + admin_work_center + admin_session + admin_system_settings diff --git a/docs/admin_instruction.rst b/docs/admin_instruction.rst new file mode 100644 index 000000000..3e513b92d --- /dev/null +++ b/docs/admin_instruction.rst @@ -0,0 +1,44 @@ +架构说明 +================= + +.. image:: _static/img/structure.png + :alt: 组件架构图 + + +组件说明 +================= + +Jumpserver +``````````` +现指Jumpserver管理后台,是核心组件(Core), 使用 Django Class Based View 风格开发,支持Restful API。 + +`Github `_ + + +Coco +```````` +实现了SSH Server 和 Web Terminal Server的组件,提供ssh和websocket接口, 使用 Paramiko 和 Flask 开发。 + + +`Github `__ + + +Luna +```````` +现在是Web Terminal前端,计划前端页面都由该项目提供,Jumpserver只提供API,不再负责后台渲染html等。 + +`Github `__ + + +Guacamole +``````````` +Apache 跳板机项目,Jumpserver使用其组件实现RDP功能,Jumpserver并没有修改其代码而是添加了额外的插件,支持Jumpserver调用 + + +Jumpserver-python-sdk +``````````````````````` +Jumpserver API Python SDK,Coco目前使用该SDK与Jumpserver API交互 + +`Github `__ + + diff --git a/docs/admin_permission.rst b/docs/admin_permission.rst new file mode 100644 index 000000000..0bd5c3bde --- /dev/null +++ b/docs/admin_permission.rst @@ -0,0 +1,9 @@ +权限管理模块 +============= + +这里介绍权限管理功能。 + +.. toctree:: + :maxdepth: 1 + + permission_asset_authorized diff --git a/docs/admin_session.rst b/docs/admin_session.rst new file mode 100644 index 000000000..90b38e4e8 --- /dev/null +++ b/docs/admin_session.rst @@ -0,0 +1,13 @@ +会话管理模块 +============== + +这里介绍会话管理功能。 + +.. toctree:: + :maxdepth: 1 + + session_history + session_online + session_command + session_web_terminal + session_terminal \ No newline at end of file diff --git a/docs/admin_system_settings.rst b/docs/admin_system_settings.rst new file mode 100644 index 000000000..eca804a62 --- /dev/null +++ b/docs/admin_system_settings.rst @@ -0,0 +1,41 @@ +系统设置 +============= + +这里介绍系统设置的功能。 + +.. contents:: Topics + +.. _view_system_settings: + +查看系统设置 +````````````` + +点击页面左侧“系统设置”按钮,进入系统设置页面,产看基本设置、邮件设置、LDAP 设置和终端设置等内容。 + +.. _basic_settings: + +基本设置 +````````` + +点击页面上边的“基本设置“ TAB ,进入基本设置页面,编辑当前站点 URL、用户想到 URL、Email 主题前缀等信息,点击“提交”按钮,基本设置完成。 + +.. _email_settings: + +邮件设置 +````````` + +点击页面上边的“邮件设置” TAB ,进入邮件设置页面,编辑 SMTP 主机、SMTP 端口、SMTP 账号、SMTP 密码和使用 SSL 或者 TSL 等信息,点击“测试连接”按钮,测试是否正确设置,点击“提交”按钮,邮件设置完成。 + +.. _ladp_settings: + +LDAP 设置 +```````````` + +点击页面上边的“ LDAP 设置” TAB ,进入 LDAP 设置页面,编辑 LDAP 地址、DN、用户 OU、用户过滤器、LDAP 属性映射和是否使用 SSL、是否启用 LDAP 认证等信息,点击“测试连接”按钮,测试是否正确设置,点击“提交”按钮,完成 LDAP 设置。 + +.. _terminal_settings: + +终端设置 +```````````` + +点击页面上边的“终端设置” TAB ,进入终端设置页面,编辑终端信息,点击“提交”按钮,终端设置完成。 \ No newline at end of file diff --git a/docs/admin_user.rst b/docs/admin_user.rst index cdce938e1..0d74b38b3 100644 --- a/docs/admin_user.rst +++ b/docs/admin_user.rst @@ -1,51 +1,11 @@ -用户管理 -======== +用户管理模块 +============= -这里介绍用户管理模块的功能。 +这里介绍用户管理功能。 -点击页面左侧“用户列表”菜单下的“用户列表,进入用户列表页面。 +.. toctree:: + :maxdepth: 1 -.. contents:: Topics - -.. _create_user: - -创建用户 -```````` - -点击页面左上角“创建用户”按钮,进入创建用户页面,填写账户,角色安全,个人等信息,点击“提交”按钮,用户创建完成。 - - -.. _update_user: - -更新用户 -```````` - -点击页面右边的“更新”按钮,进入编辑用户页面,编辑用户信息,点击“提交”按钮,更新用户完成。 - -.. _delete_user: - -删除用户 -```````` - -点击页面右边的“删除”按钮,弹出是否删除确认框,点击“确定”按钮,删除用户完成。 - -.. _export_user: - -导出用户 -```````` - -选中用户,点击右上角的“导出”按钮,导出用户完成。 - -.. _inport_user: - -导入用户 -```````` - -点击右上角的“导入”按钮,弹出导入对话框,选择要导入的CSV格式文件,点击“确认”按钮,导入用户完成。 - -.. _batch_operation: - -批量操作 -```````` - -选中用户,选择页面左下角的批量操作选项,点击”提交“按钮,批量操作完成。 \ No newline at end of file + user + user_group + login_log \ No newline at end of file diff --git a/docs/admin_work_center.rst b/docs/admin_work_center.rst new file mode 100644 index 000000000..a15e2095c --- /dev/null +++ b/docs/admin_work_center.rst @@ -0,0 +1,9 @@ +作业中心模块 +============== + +这里介绍作业中心功能。 + +.. toctree:: + :maxdepth: 1 + + work_center_list \ No newline at end of file diff --git a/docs/asset_admin_user.rst b/docs/asset_admin_user.rst new file mode 100644 index 000000000..4ebebe8b5 --- /dev/null +++ b/docs/asset_admin_user.rst @@ -0,0 +1,35 @@ +管理用户 +========== + +这里介绍管理用户的功能。 + +.. contents:: Topics + +.. _view_admin_user_list: + +查看管理用户列表 +```````````````` + +点击页面左侧“资产管理“菜单下的“管理用户”按钮,进入管理用户列表页面,查看管理用户的名称、资产数等信息。 + + +.. _create_admin_user: + +创建管理用户 +```````````` + +点击页面左上角的“创建管理用户“按钮,进入创建管理用户界面,填写名称、用户名、密码、ssh私钥等信息,点击“提交”按钮,完成管理用户创建。 + +.. _update_admin_user: + +更新管理用户 +```````````` + +点击页面右边动作栏的“更新”按钮,进入更新管理用户页面,编辑管理用户的信息,点击“提交”按钮,完成管理用户更新。 + +.. _delete_admin_user: + +删除管理用户 +```````````` + +点击页面右边动作栏的“删除”按钮,弹出删除确认框,点击"确认"按钮,管理用户删除完成。 \ No newline at end of file diff --git a/docs/asset_label.rst b/docs/asset_label.rst new file mode 100644 index 000000000..abc723df3 --- /dev/null +++ b/docs/asset_label.rst @@ -0,0 +1,34 @@ +标签管理 +============ + +这里介绍标签管理的功能。 + +.. contents:: Topics + +.. _view_label_list: + +查看标签列表 +```````````````` + +点击页面左边“资产管理”菜单下的“标签管理”按钮,进入标签列表页面,产看标签的名称、值、资产数等信息。 + +.. _create_label: + +创建标签 +```````````` + +点击页面左上角“创建标签”按钮,进入创建标签页面,填写标签的名称、值等信息,选择资产,点击“提交”按钮,标签创建完成。 + +.. _update_label: + +更新标签 +```````````` + +点击页面右边动作栏的“更新”按钮,进入更新标签页面,编辑标签信息,点击“提交”按钮,标签更新完成。 + +.. _delete_label: + +删除标签 +````````` + +点击页面右边动作栏的“删除”按钮,弹出删除确认框,点击“确认”按钮,完成标签删除。 \ No newline at end of file diff --git a/docs/asset_list.rst b/docs/asset_list.rst new file mode 100644 index 000000000..3d1f75adc --- /dev/null +++ b/docs/asset_list.rst @@ -0,0 +1,41 @@ +资产列表 +=========== + +这里介绍资产列表的功能。 + +.. contents:: Topics + +.. _view_asset_list: + +查看资产列表 +````````````` + +点击页面左侧的“资产管理”菜单下的“资产列表”按钮,查看当前所有的资产列表。 + +.. _create_asset: + +创建资产 +```````````` + +点击页面左上角的“创建资产”按钮,进入资产创建页面,填写资产信息,点击“提交”按钮,完成资产创建。 + +.. _update_asset: + +更新资产 +```````````` + +点击页面右边的“更新”按钮,进入编辑资产页面,更新资产信息,点击“提交”按钮,完成资产更新。 + +.. _delete_asset: + +删除资产 +````````` + +点击页面右边的“删除”按钮,弹出删除确认框,点击“确认”按钮,完成资产删除。 + +.. _batch_operation: + +批量操作 +```````````` + +选中资产,选择页面左下角批量操作选项,点击“提交”按钮,完成批量操作。 \ No newline at end of file diff --git a/docs/asset_system_user.rst b/docs/asset_system_user.rst new file mode 100644 index 000000000..de695eeb8 --- /dev/null +++ b/docs/asset_system_user.rst @@ -0,0 +1,34 @@ +系统用户 +=========== + +这里介绍系统用户功能。 + +.. contents:: Topics + +.. _view_admin_system_user: + +查看系统用户 +```````````` + +点击页面左侧“资产管理“菜单下的”系统用户“按钮,进入系统用户列表页面,查看系统用户的名称,资产数和连接数等信息。 + +.. _create_admin_system_user: + +创建系统用户 +```````````` + +点击页面左上角的“创建系统用户“按钮,进入创建系统用户页面,填写系统用户的基本信息、认证信息和其它信息,点击“提交“按钮,完成系统用户创建。 + +.. _update_admin_system_user: + +更新系统用户 +````````````` + +点击页面动作栏的“更新”按钮,进入更新系统用户页面,编辑系统用户信息,点击“提交”按钮,系统用户更新完成。 + +.. _delete_admin_system_user: + +删除系统用户 +````````````` + +点击页面动作栏的“删除”按钮,弹出删除确认框,点击“删除”按钮,完成删除系统用户。 \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 068048c0f..2012ac65e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -20,7 +20,7 @@ import sphinx_rtd_theme # -- Project information ----------------------------------------------------- -project = 'jumpserver' +project = 'Jumpserver' copyright = '北京堆栈科技有限公司 © 2014-2018' author = 'Jumpserver team' @@ -88,7 +88,7 @@ html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # html_theme_options = { 'logo_only': True, - 'display_version': False + 'display_version': True } # Add any paths that contain custom static files (such as style sheets) here, @@ -137,7 +137,7 @@ latex_elements = { # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'jumpserver.tex', 'jumpserver Documentation', + (master_doc, 'Jumpserver.tex', 'Jumpserver Documentation', 'Jumpserver team', 'manual'), ] @@ -147,7 +147,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'jumpserver', 'jumpserver Documentation', + (master_doc, 'Jumpserver', 'Jumpserver Documentation', [author], 1) ] @@ -158,8 +158,8 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'jumpserver', 'jumpserver Documentation', - author, 'jumpserver', 'One line description of project.', + (master_doc, 'Jumpserver', 'Jumpserver 文档', + author, 'Jumpserver', ' Jumpserver是全球首款完全开源的堡垒机,是符合 4A 的专业运维审计系统', 'Miscellaneous'), ] diff --git a/docs/contact.rst b/docs/contact.rst index 767554517..789207779 100644 --- a/docs/contact.rst +++ b/docs/contact.rst @@ -1,6 +1,11 @@ 联系方式 +++++++++++++++++++++++++ +商业支持 +~~~~~~~~~~~ + +https://market.aliyun.com/products/53690006/cmgj026011.html + QQ群 ~~~~~~~~ @@ -11,7 +16,7 @@ QQ群 Github ~~~~~~~~ - + https://github.com/jumpserver/jumpserver.git diff --git a/docs/contributor.rst b/docs/contributor.rst index 05c2604f1..4c351291f 100644 --- a/docs/contributor.rst +++ b/docs/contributor.rst @@ -1,13 +1,17 @@ 贡献者 -++++++++++++++++++++++++ +============= 感谢一下朋友为Jumpserver做出的贡献,世界因你们而不同,排名不分先后 -- **小彧 <李磊>** Django资深开发者,为用户模块贡献了很多代码 -- **sofia <周小侠>** 资深前端工程师, 前端代码贡献者 -- **liuz <刘正> 全栈工程师** 编写了Web terminal大部分代码 +- **小彧 <李磊>** Django 资深开发者,为用户模块贡献了很多代码 +- **sofia <周小侠>** 资深前端工程师, 前端代码贡献者 +- **liuz <刘正> 全栈工程师** 编写了 Web Terminal 大部分代码 - **jiaxiangkong <陈尚委>** Jumpserver测试运营 - **halcyon <王墉>** DevOps 资深开发者, 0.3.2 核心开发者之一 -- **yumaojun03 <喻茂峻>** DevOps 资深开发者,擅长Python, Go以及PAAS平台开发 -- **kelianchun <柯连春>** DevOps 资产开发者,fix了很多bug \ No newline at end of file +- **yumaojun03 <喻茂峻>** DevOps 资深开发者,擅长Python, Go以及 PaaS 平台开发 +- **kelianchun <柯连春>** DevOps 资产开发者,fix了很多bug +- **q4speed <莫鹍>** 架构师,贡献了 0.5.0 Windows 远程桌面登录大部分代码 +- **ZhangFengyi <张峰毅>** 贡献了 0.5.0 新版文档 +- **Aaron3S <沈晨阳>** 贡献了 0.5.0 新版文档 +- **liqiang-fit2cloud <张立强>** 0.5.0 版本测试,给资产树设计贡献了很多建议 \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 787f05564..41a9ffcb0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,24 +6,16 @@ Jumpserver 文档 ====================================== +目录: + .. toctree:: :maxdepth: 2 - :caption: 文档: - intro + introduce installation admin_guide user_guide development contributor contact - faq - - - -索引 -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` + snapshot diff --git a/docs/introduce.rst b/docs/introduce.rst new file mode 100644 index 000000000..eff6f16ca --- /dev/null +++ b/docs/introduce.rst @@ -0,0 +1,12 @@ +总体介绍 +================== + +欢迎来到 Jumpserver 文档。 + +Jumpserver是全球首款完全开源的堡垒机,使用GNU GPL v2.0开源协议,是符合 4A 的专业运维审计系统。 + +Jumpserver使用Python / Django 进行开发,遵循 Web 2.0 规范,配备了业界领先的 Web Terminal 解决方案,交互界面美观、用户体验好。 + +Jumpserver采纳分布式架构,支持多机房跨区域部署,中心节点提供 API,各机房部署登录节点,可横向扩展、无并发访问限制。 + +改变世界,从一点点开始。 \ No newline at end of file diff --git a/docs/login_log.rst b/docs/login_log.rst new file mode 100644 index 000000000..73debfa8a --- /dev/null +++ b/docs/login_log.rst @@ -0,0 +1,6 @@ +登录日志 +========== + +这里介绍登录日志的功能。 + +点击页面左侧“用户管理”菜单下的“登录日志”按钮,进入登录日志页面。 \ No newline at end of file diff --git a/docs/old/README.md b/docs/old/README.md deleted file mode 100644 index a3698f4c9..000000000 --- a/docs/old/README.md +++ /dev/null @@ -1,4 +0,0 @@ -#### [项目结构描述](https://code.simcu.com/jumpserver/jumpserver/blob/master/docs/project_structure.md) -#### [Python代码规范](https://code.simcu.com/jumpserver/jumpserver/blob/master/docs/python_style_guide.md) -#### [API设计规范](https://code.simcu.com/jumpserver/jumpserver/blob/master/docs/api_style_guide.md) -#### [表结构](https://code.simcu.com/jumpserver/jumpserver/wikis/table_structure_image) \ No newline at end of file diff --git a/docs/old/api_style_guide.md b/docs/old/api_style_guide.md deleted file mode 100644 index 928b02a98..000000000 --- a/docs/old/api_style_guide.md +++ /dev/null @@ -1,148 +0,0 @@ -## REST API规范约定 - -这里仅考虑REST API的基本情况。参考 - -[RESTful API 设计指南](http://www.ruanyifeng.com/blog/2014/05/restful_api.html) - -[github api文档](https://developer.github.com/v3/) - -### 协议 - -API与用户的通信协议,总是使用HTTPs协议。 - - -### 域名 - -这版api相对简单, 没有前后端分离, 没有独立app, 所以放在主域名下 - -``` -https://example.org/api/ -``` - -### 版本 - -将API的版本号放入URL中, 由于一个项目多个app所以Jumpserver使用以下风格, -将版本号放到app后面 - -``` -https://example.com/api/:app:/:version:/:resource: -https://example.com/api/assets/v1.0/assets [GET, POST] -https://example.com/api/assets/v1.0/assets/1 [GET, PUT, DELETE] -``` - - -### 路径 - -路径又称"终点"(endpoint),表示API的具体网址。 -在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。 -举例来说 cmdb中的assets列表, idc列表 - -``` -https://example.com/api/:app:/:version:/:resource: - -https://example.com/api/assets/v1.0/assets [GET, POST] -https://example.com/api/assets/v1.0/assets/1 [GET, PUT, DELETE] -https://example.com/api/assets/v1.0/idcs [GET, POST] -``` - -一般性的增删查改(CRUD)API,完全使用HTTP method加上url提供的语义,url中的可变部分(比如上面提到的) -一般用来传递该API操作的核心实体对象的唯一ID,如果有更多的参数需要提供,GET方法请使用url parameter -(例如:"?client_id=xxxxx&app_id=xxxxxx"),PUT/POST/DELETE方法请使用请求体传递参数。 - - -### HTTP Method - -对于资源的具体操作类型,由HTTP动词表示。 - -常用的HTTP动词有下面五个(括号里是对应的SQL命令)。 - -- GET(SELECT):从服务器取出资源(一项或多项)。 -- POST(CREATE):在服务器新建一个资源。 -- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源, 幂等 -- PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。 -- DELETE(DELETE):从服务器删除资源。 - - -### 过滤信息 - -常见参数约定 - -``` -?keyword=localhost 模糊搜索 -?limit=10:指定返回记录的数量 -?offset=10:指定返回记录的开始位置。 -?page=2&per_page=100:指定第几页,以及每页的记录数。 -?sort=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。 -?asset_id=1:指定筛选条件 -``` - - -### 状态码 - -服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。 - -- 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。 -- 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。 -- 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务) -- 204 NO CONTENT - [DELETE]:用户删除数据成功。 -- 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。 -- 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。 -- 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。 -- 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。 -- 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。 -- 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。 -- 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。 -- 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。 - - -### 错误处理 - -如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。 - -``` -{ - error: "Invalid API key" -} -``` - -### 返回结果 - -针对不同操作,服务器向用户返回的结果应该符合以下规范。 - -``` -GET /collection:返回资源对象的列表(数组) -GET /collection/resource:返回单个资源对象 -POST /collection:返回新生成的资源对象 -PUT /collection/resource:返回完整的资源对象 -PATCH /collection/resource:返回完整的资源对象 -DELETE /collection/resource:返回一个空文档 -``` - -### Hypermedia API - -RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。 -比如,当用户向api.example.com的根目录发出请求,会得到这样一个文档。 - -``` -{"link": { - "rel": "collection https://www.example.com/zoos", - "href": "https://api.example.com/zoos", - "title": "List of zoos", - "type": "application/vnd.yourformat+json" -}} -``` - -上面代码表示,文档中有一个link属性,用户读取这个属性就知道下一步该调用什么API了。 - -rel表示这个API与当前网址的关系(collection关系,并给出该collection的网址), - -href表示API的路径,title表示API的标题,type表示返回类型。 -Hypermedia API的设计被称为HATEOAS。 -Github的API就是这种设计. - - -### 其它 - -(1)API的身份认证应该使用OAuth 2.0框架。 -(2)服务器返回的数据格式,应该尽量使用JSON - diff --git a/docs/old/django_class_base_view_inheritance.py b/docs/old/django_class_base_view_inheritance.py deleted file mode 100644 index 434c28af6..000000000 --- a/docs/old/django_class_base_view_inheritance.py +++ /dev/null @@ -1,295 +0,0 @@ -#!/usr/bin/env python -# ~*~ coding: utf-8 ~*~ -# - -from django.core.paginator import InvalidPage, Paginator - - -class View(object): - - http_method_names = [] - - def __init__(self, **kwargs): - pass - - @classmethod - def as_view(cls, **initkwargs): - pass - - def dispatch(self, request, *args, **kwargs): - pass - - def http_method_not_allowed(self, request, *args, **kwargs): - pass - - def options(self, request, *args, **kwargs): - pass - - def _allowed_method(self): - pass - - -class TemplateResponseMixin(object): - template_name = None - template_engine = None - response_class = None - content_type = None - - def render_to_response(self, context, **response_kwargs): - pass - - def get_template_name(self): - pass - - -class ContextMixin(object): - def get_context_data(self, **kwargs): - pass - - -class RedirectView(View): - permanent = False - url = None - pattern_name = None - query_string = False - - def get_redirect_url(self, *args, **kwargs): - pass - - def get(self, request, *args, **kwargs): - pass - - def head(self, request, *args, **kwargs): - pass - - def post(self, request, *args, **kwargs): - pass - - def options(self, request, *args, **kwargs): - pass - - def delete(self, request, *args, **kwargs): - pass - - def put(self, request, *args, **kwargs): - pass - - def patch(self, request, *args, **kwargs): - pass - - -class TemplateView(TemplateResponseMixin, ContextMixin, View): - def get(self, request, *args, **kwargs): - pass - - -class SingleObjectMixin(ContextMixin): - model = None - queryset = None - slug_field = 'slug' - context_object_name = None - slug_url_kwarg = 'slug' - pk_url_kwarg = 'pk' - query_pk_and_slug = False - - def get_object(self): - pass - - def get_queryset(self): - pass - - def get_slug_field(self): - pass - - def get_context_object_name(self, obj): - pass - - def get_context_data(self, **kwargs): - pass - - -class BaseDetailView(SingleObjectMixin, View): - def get(self, request, *args, **kwargs): - pass - - -class SingleObjectTemplateResponseMixin(TemplateResponseMixin): - template_name_field = None - template_name_suffix = '_detail' - - def get_template_name(self): - pass - - -class DetailView(SingleObjectTemplateResponseMixin, BaseDetailView): - pass - - -class FormMixin(ContextMixin): - initial = {} - form_class = None - success_url = None - prefix = None - - def get_initial(self): - pass - - def get_prefix(self): - pass - - def get_form_class(self): - pass - - def get_form(self, form_class): - pass - - def get_form_kwargs(self): - pass - - def get_success_url(self): - pass - - def form_valid(self, form): - pass - - def form_invalid(self, form): - pass - - def get_context_data(self, **kwargs): - pass - - -class ModelFormMixin(FormMixin, SingleObjectMixin): - fields = None - - def get_form_class(self): - pass - - def get_form_kwargs(self): - pass - - def get_success_url(self): - pass - - def form_valid(self, form): - pass - - -class ProcessFormView(View): - def get(self, request, *args, **kwargs): - pass - - def post(self, request, *args, **kwargs): - pass - - def put(self, request, *args, **kwargs): - pass - - -class BaseFormView(FormMixin, ProcessFormView): - pass - - -class FormView(TemplateResponseMixin, BaseFormView): - pass - - -class BaseCreateView(ModelFormMixin, ProcessFormView): - def get(self, request, *args, **kwargs): - pass - - def post(self, request, *args, **kwargs): - pass - - -class CreateView(SingleObjectTemplateResponseMixin, BaseCreateView): - template_name_suffix = '_form' - - -class BaseUpdateView(ModelFormMixin, ProcessFormView): - def get(self, request, *args, **kwargs): - pass - - def post(self, request, *args, **kwargs): - pass - - -class UpdateView(SingleObjectTemplateResponseMixin, BaseUpdateView): - template_name_suffix = '_form' - - -class DeletionMixin(object): - success_url = None - - def delete(self, request, *args, **kwargs): - pass - - def post(self, request, *args, **kwargs): - pass - - def get_success_url(self): - pass - - -class BaseDeleteView(DeletionMixin, BaseDetailView): - pass - - -class DeleteView(SingleObjectTemplateResponseMixin, BaseDeleteView): - pass - - -class MultipleObjectMixin(ContextMixin): - allow_empty = True - queryset = None - model = None - paginate_by = None - paginate_orphans = 0 - context_object_name = None - paginator_class = Paginator - page_kwarg = 'page' - ordering = None - - def get_queryset(self): - pass - - def get_ordering(self): - pass - - def paginate_queryset(self, queryset, page_size): - pass - - def get_paginate_by(self, queryset): - pass - - def get_paginator(self, queryset, per_page, orphans=0, - allow_empty_first_page=True, **kwargs): - pass - - def get_paginate_orphans(self): - pass - - def get_allow_empty(self): - pass - - def get_context_object_name(self, object_list): - pass - - def get_context_data(self, **kwargs): - pass - - -class BaseListView(MultipleObjectMixin, View): - def get(self, request, *args, **kwargs): - pass - - -class MultipleObjectTemplateResponseMixin(TemplateResponseMixin): - template_name_suffix = '_list' - - def get_template_name(self): - pass - - -class ListView(MultipleObjectTemplateResponseMixin, BaseListView): - pass diff --git a/docs/old/install.md b/docs/old/install.md deleted file mode 100644 index 1a6892f53..000000000 --- a/docs/old/install.md +++ /dev/null @@ -1 +0,0 @@ -More see [安装文档](https://github.com/jumpserver/jumpserver/wiki/v0.5.0-%E5%9F%BA%E4%BA%8E-CentOS7) diff --git a/docs/old/project_structure.md b/docs/old/project_structure.md deleted file mode 100644 index 3cc9b8f94..000000000 --- a/docs/old/project_structure.md +++ /dev/null @@ -1,50 +0,0 @@ -## 项目骨架 - -说明如下: - -``` -. -├── config-example.py // 配置文件样例 -├── docs // 所有doc文件放到该目录 -│ └── README.md -├── LICENSE -├── README.md -├── install // 安装说明 -├── logs // 日志目录 -├── apps // 管理后台目录,也是各app所在目录 -│ └── assets // app目录 -│ │ ├── admin.py -│ │ ├── apps.py // 新版本django app设置文件 -│ │ ├── api.py // api文件 -│ │ ├── __init__.py // 对外暴露的接口,放到该文件中,方便别的app引用 -│ │ ├── migrations // models Migrations版本控制目录 -│ │ │ └── __init__.py -│ │ ├── models.py // 数据模型目录 -│ │ ├── static // app下静态资源目录,如果需要 -│ │ │ └── assets // 多一层目录,防止资源重名 -│ │ │ └── some_image.png -│ │ ├── templates // app下模板目录 -│ │ │ └── assets // 多一层目录,防止资源重名 -│ │ │ └── asset_list.html -│ │ ├── templatetags // 模板标签目录 -│ │ ├── tests.py // 测试用例文件 -│ │ ├── urls.py // urlconf文件 -│ │ ├── utils.py // 将views和api可复用的代码放在这里, api和views只是请求和返回不同 -│ │ └── views.py // views文件 -│ ├── common -│ │ ├── templatetags // 通用template tag -│ │ ├── utils.py // 通用的函数方法 -│ │ └── views.py -│ ├── fixtures // 初始化数据目录 -│ │ ├── init.json // 初始化项目数据库 -│ │ └── fake.json // 生成大量测试数据 -│ ├── jumpserver // 项目设置目录 -│ │ ├── __init__.py -│ │ ├── settings.py // 项目设置文件 -│ │ ├── urls.py // 项目入口urlconf -│ │ └── wsgi.py -│ ├── manage.py -│ ├── static // 项目静态资源目录 -│   ├── i18n                     // 项目多语言目录 -│ └── templates // 项目模板目录 -``` diff --git a/docs/old/python_style_guide.md b/docs/old/python_style_guide.md deleted file mode 100644 index 22de0dfa4..000000000 --- a/docs/old/python_style_guide.md +++ /dev/null @@ -1,194 +0,0 @@ -# Jumpserver 项目规范(Draft) - -## 语言框架 -1. Python 3.6.1 (当前最新) -2. Django 1.11 (当前最新) -3. Flask 0.12 Luna (当前最新) -4. Paramiko 2.12 Coco (当前最新) - -## Django规范 -1. 尽量使用Class Base View编程,更少代码 -2. 使用Django Form -3. 每个url独立命名,不要硬编码,同理static也是 -4. 数据库表名手动指定,不要使用默认 -5. 代码优雅简洁 -6. 注释明确优美 -7. 测试案例尽可能完整 -8. 尽可能利用Django造好的轮子 - - -## 代码风格 - -Python方面大致的风格,我们采用pocoo的[Style Guidance](http://www.pocoo.org/internal/styleguide/),但是有些细节部分会尽量放开 -参考国内翻译 - -### 基本的代码布局 - -#### 缩进 - -1. Python严格采用4个空格的缩进,任何python代码都都必须遵守此规定。 -2. web部分代码(HTML, CSS, JavaScript),Node.js采用2空格缩进,同样不使用tab (\t)。 -之所以与Python不同,是因为js中有大量回调式的写法,2空格可以显著降低视觉上的负担。 - -#### 最大行长度 - -按PEP8规范,Python一般限制最大79个字符, 但是Django的命名,url等通常比较长, -而且21世纪都是宽屏了,所以我们限制最大120字符 - -**补充说明:HTML代码不受此规范约束。** - -#### 长语句缩进 - -编写长语句时,可以使用换行符(\)换行。在这种情况下,下一行应该与上一行的最后 -一个“.”句点或“=”对齐,或者是缩进4个空格符 - -``` -this_is_a_very_long(function_call, 'with many parameters') \ - .that_returns_an_object_with_an_attribute - -MyModel.query.filter(MyModel.scalar > 120) \ - .order_by(MyModel.name.desc()) \ - .limit(10) -``` - -如果你使用括号“()”或花括号“{}”为长语句换行,那么下一行应与括号或花括号对齐: -``` -this_is_a_very_long(function_call, 'with many parameters', - 23, 42, 'and even more') -``` - -对于元素众多的列表或元组,在第一个“[”或“(”之后马上换行: - -``` -items = [ - 'this is the first', 'set of items', 'with more items', - 'to come in this line', 'like this' -] -``` - -#### 空行 - -顶层函数与类之间空两行,此外都只空一行。不要在代码中使用太多的空行来区分不同的逻辑模块。 - -``` -def hello(name): - print 'Hello %s!' % name - - -def goodbye(name): - print 'See you %s.' % name - - -class MyClass(object): - """This is a simple docstring.""" - - def __init__(self, name): - self.name = name - - def get_annoying_name(self): - return self.name.upper() + '!!!!111' -``` - - -### 语句和表达式 - -#### 一般空格规则 - -1. 单目运算符与运算对象之间不空格(例如,-,~等),即使单目运算符位于括号内部也一样。 -2. 双目运算符与运算对象之间要空格。 - -``` -exp = -1.05 -value = (item_value / item_count) * offset / exp -value = my_list[index] -value = my_dict['key'] -``` - -#### 比较 - -1. 任意类型之间的比较,使用“==”和“!=”。 -2. 与单例(singletons)进行比较时,使用is和is not。 -3. 永远不要与True或False进行比较(例如,不要这样写:foo == False,而应该这样写:not foo)。 - -#### 否定成员关系检查 - -使用foo not in bar,而不是not foo in bar。 - - -### 命名约定 - -1. 类名称:采用骆驼拼写法(CamelCase),首字母缩略词保持大写不变(HTTPWriter,而不是HttpWriter)。 -2. 变量名:小写_以及_下划线(lowercase_with_underscores)。 -3. 方法与函数名:小写_以及_下划线(lowercase_with_underscores)。 -4. 常量:大写_以及_下划线(UPPERCASE_WITH_UNDERSCORES)。 -5. 预编译的正则表达式:name_re。 -6. 受保护的元素以一个下划线为前缀。双下划线前缀只有定义混入类(mixin classes)时才使用。 -7. 如果使用关键词(keywords)作为类名称,应在名称后添加后置下划线(trailing underscore)。 -允许与内建变量重名,不要在变量名后添加下划线进行区分。如果函数需要访问重名的内建变量,请将内建变量重新绑定为其他名称。 -8. 命名要有寓意, 不使用拼音,不使用无意义简单字母命名 (循环中计数例外 for i in) -9. 命名缩写要谨慎, 尽量是大家认可的缩写 - - -#### 函数和方法的参数: - -1. 类方法:cls为第一个参数。 -2. 实例方法:self为第一个参数。 -3. property函数中使用匿名函数(lambdas)时,匿名函数的第一个参数可以用x替代, -例如:display_name = property(lambda x: x.real_name or x.username)。 - - - -### 文档注释(Docstring,即各方法,类的说明文档注释) - -所有文档字符串均以reStructuredText格式编写,方便Sphinx处理。文档字符串的行数不同,布局也不一样。 -如果只有一行,代表字符串结束的三个引号与代表字符串开始的三个引号在同一行。 -如果为多行,文档字符串中的文本紧接着代表字符串开始的三个引号编写,代表字符串结束的三个引号则自己独立成一行。 -(有能力尽可能用英文, 否则请中文优雅注释) - - -``` -def foo(): - """This is a simple docstring.""" - - -def bar(): - """This is a longer docstring with so much information in there - that it spans three lines. In this case, the closing triple quote - is on its own line. - """ -``` - -文档字符串应分成简短摘要(尽量一行)和详细介绍。如果必要的话,摘要与详细介绍之间空一行。 - -### 模块头部 - -模块文件的头部包含有utf-8编码声明(如果模块中使用了非ASCII编码的字符,建议进行声明),以及标准的文档字符串。 - -``` -# -*- coding: utf-8 -*- -""" - package.module - ~~~~~~~~~~~~~~ - - A brief description goes here. - - :copyright: (c) YEAR by AUTHOR. - :license: LICENSE_NAME, see LICENSE_FILE for more details. -""" -``` - - -### 注释(comment) - -注释的规范与文档字符串编写规范类似。二者均以reStructuredText格式编写。 -如果使用注释来编写类属性的文档,请在#符号后添加一个冒号":"。 -(有能力尽可能用英文, 否则请中文优雅注释) - -``` -class User(object): - #: the name of the user as unicode string - name = Column(String) - #: the sha1 hash of the password + inline salt - pw_hash = Column(String) -``` - diff --git a/docs/old/table_design.xml b/docs/old/table_design.xml deleted file mode 100644 index acc1fe395..000000000 --- a/docs/old/table_design.xml +++ /dev/null @@ -1,795 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -INTEGER -NULL - -VARCHAR(20) -'NULL' - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR(30) - - -BINARY -NULL - -VARCHAR(20) -NULL - -VARBINARY -NULL - -INTEGER -0 - -INTEGER -0 - -INTEGER -0 - -INTEGER -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -CHAR -NULL - -DATETIME -'now()' - -DATETIME -NULL - -DATETIME -NULL - -id - -
- - -INTEGER -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -id - -
- - -INTEGER -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -DATETIME -NULL - -VARCHAR -NULL - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -INTEGER -NULL - - -id - -
- - -INTEGER -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -INTEGER -NULL - - -id - -
- - -INTEGER -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -INTEGER -NULL - - -id - -
- - -INTEGER -NULL - -VARCHAR -NULL - -CHAR -NULL - -INTEGER -NULL - -VARCHAR -NULL - -VARBINARY -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -INTEGER -NULL - - -INTEGER -NULL - - -VARCHAR -NULL - -INTEGER -NULL - - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -INTEGER -NULL - -INTEGER -NULL - -INTEGER -NULL - - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -INTEGER -NULL - -CHAR -NULL - -VARCHAR -NULL - -DATETIME -NULL - -id - -
- - -INTEGER -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -id - -
- - -INTEGER -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -DATETIME -NULL - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -VARCHAR -NULL - -VARCHAR -NULL - -id - -
- - -INTEGER -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -DATETIME -NULL - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -INTEGER -NULL - - -id - -
- - -INTEGER -NULL - -CHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -INTEGER -NULL - -INTEGER -NULL - -DATETIME -NULL - -CHAR -NULL - -CHAR -NULL - -id - -
- - -INTEGER -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -INTEGER -NULL - -INTEGER -NULL - -INTEGER -NULL - -INTEGER -NULL - -CHAR -NULL - -CHAR -NULL - -INTEGER -NULL - -CHAR -NULL - -CHAR -NULL - -DATETIME -NULL - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -INTEGER -NULL - - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -INTEGER -NULL - -INTEGER -NULL - -INTEGER -NULL - -CHAR -NULL - -DATETIME -NULL - -DATETIME -NULL - -id - -
- - -INTEGER -NULL - -CHAR -NULL - -INTEGER -NULL - -DATETIME -NULL - -DATE -NULL - -id - -
- - -INTEGER -NULL - -CHAR -NULL - -CHAR -NULL - -VARCHAR -NULL - -TIME -NULL - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -INTEGER -NULL - - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -INTEGER -NULL - - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -INTEGER -NULL - - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -INTEGER -NULL - - -id - -
- - -INTEGER -NULL - -CHAR -NULL - -VARCHAR -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -DATE -NULL - -DATE -NULL - -id - -
- - -INTEGER -NULL - -DATETIME -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -id - -
- - -INTEGER -NULL - -VARCHAR -NULL - -CHAR -NULL - -VARCHAR -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -CHAR -NULL - -INTEGER -NULL - -DATETIME -NULL - -DATETIME -NULL - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -CHAR -NULL - -VARCHAR -NULL - -DATE -NULL - -DATE -NULL - -id - -
- - -INTEGER -NULL - -INTEGER -NULL - - -INTEGER -NULL - - -CHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -VARCHAR -NULL - -INTEGER -NULL - -DATETIME -NULL - -TIME -NULL - -id - -
-
- diff --git a/docs/permission_asset_authorized.rst b/docs/permission_asset_authorized.rst new file mode 100644 index 000000000..70e109b26 --- /dev/null +++ b/docs/permission_asset_authorized.rst @@ -0,0 +1,34 @@ +资产授权 +========= + +这里介绍资产授权的相关的功能。 + +.. contents:: Topics + +.. _view_asset_authorized: + +查看资产授权规则列表 +```````````````````` + +资产授权页面默认展示资产授权列表。点击左侧资产节点树下的节点,右侧展示此节点下的资产授权规则。 + +.. _create_asset_authorized: + +创建授权规则 +```````````` +在左侧资产节点树下选择要创建授权规则的节点,点击页面右侧创建授权规则进入创建授权规则页面,填写授权规则信息,点击提交,完成创建授权规则。 + +.. _update_asset_authorized: + +更新授权规则 +```````````` + +在左侧资产节点树下选择要更新授权规则的节点,在右侧授权规则列表中找到要更新的授权规则,点击“动作”标题下的“更新”按钮进入授权规则更新页面,填写授权规则信息,点击提交,完成创建授权规则。 + +.. _delete_asset_authorized: + +删除授权规则 +```````````` + +在左侧资产节点树下选择要删除授权规则的节点,在右侧授权规则列表中找到要删除的授权规则,点击“动作”标题下的“删除”按钮,弹出确认删除页面,点击确认,完成删除授权规则。 + diff --git a/docs/python_style_guide.rst b/docs/python_style_guide.rst index de7bae56f..976e627ed 100644 --- a/docs/python_style_guide.rst +++ b/docs/python_style_guide.rst @@ -34,8 +34,7 @@ Guidance`_\ ,但是有些细节部分会尽量放开 参考国内翻译 ^^^^ 1. Python严格采用4个空格的缩进,任何python代码都都必须遵守此规定。 -2. web部分代码(HTML, CSS, - JavaScript),Node.js采用2空格缩进,同样不使用tab (:raw-latex:`\t`)。 +2. web部分代码(HTML, CSS,JavaScript),Node.js采用2空格缩进,同样不使用tab。 之所以与Python不同,是因为js中有大量回调式的写法,2空格可以显著降低视觉上的负担。 最大行长度 diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 7892999fe..7e391b11f 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -13,7 +13,7 @@ Docker 安装见: `Docker官方安装文档 `_ ``````````````` 使用root命令行输入:: - $ docker run -p 8080:80 -p 2222:2222 jumpserver/jumpserver:0.5.0-beta2 + $ docker run -d -p 8080:80 -p 2222:2222 registry.jumpserver.org/public/jumpserver:latest 访问 ``````````````` @@ -39,7 +39,7 @@ ssh访问: ssh -p 2222 localhost :: - docker run -p 8080:80 -p 2222:2222 -e DB_ENGINE=mysql -e DB_HOST=192.168.1.1 -e DB_PORT=3306 -e DB_USER=root -e DB_PASSWORD=xxx -e DB_NAME=jumpserver jumpserver/jumpserver:0.5.0-beta2 + docker run -d -p 8080:80 -p 2222:2222 -e DB_ENGINE=mysql -e DB_HOST=192.168.1.1 -e DB_PORT=3306 -e DB_USER=root -e DB_PASSWORD=xxx -e DB_NAME=jumpserver registry.jumpserver.org/public/jumpserver:latest 仓库地址 diff --git a/docs/session_command.rst b/docs/session_command.rst new file mode 100644 index 000000000..a1296f86f --- /dev/null +++ b/docs/session_command.rst @@ -0,0 +1,30 @@ +命令记录 +========= + +这里介绍命令记录功能。 + +点击页面左侧“会话管理”菜单下的“命令记录”,进入命令记录列表页面。 + +.. contents:: Topics + +.. _view_command_session: + +查看命令记录 +````````````` + +命令记录页面默认展示一周内命令记录,页面左上角提供起止时间、用户、资产、系统用户等搜索过滤条件。 + +.. _detial_command_invoke: + +查看命令执行详情 +```````````````` + +点击命令记录列表中需要查看命令执行详情的行,即可显示命令执行详情。 + +.. _detial_command_session: + +转到会话详情 +````````````` + +在命令记录列表中找到需要转到会话详情的记录,点击“会话”标题下的“转到”按钮,完成转到会话详情。 + diff --git a/docs/session_history.rst b/docs/session_history.rst new file mode 100644 index 000000000..c4b63231f --- /dev/null +++ b/docs/session_history.rst @@ -0,0 +1,22 @@ +历史会话 +========= + +这里介绍历史会话功能。 + +点击页面左侧“会话管理”菜单下的“历史会话”,进入历史会话列表页面。 + +.. contents:: Topics + +.. _view_history_session: + +查看历史会话 +````````````` + +历史会话页面默认展示一周内历史会话,页面左上角提供起止时间、用户、资产、系统用户等搜索过滤条件。 + +.. _playback_history_session: + +历史会话回放 +````````````` + +在在线会话列表中找到要回放的历史会话,点击动作标签下的“回放”按钮,弹出回放页面,完成回放历史会话。 \ No newline at end of file diff --git a/docs/session_online.rst b/docs/session_online.rst new file mode 100644 index 000000000..741725c1f --- /dev/null +++ b/docs/session_online.rst @@ -0,0 +1,25 @@ +在线会话 +========= + +这里介绍在线会话功能。 + +点击页面左侧“会话管理”菜单下的“在线会话”,进入在线会话列表页面。 + +.. contents:: Topics + +.. _view_online_session: + +查看在线会话 +````````````` + +在线会话页面默认展示一周内在线会话,页面左上角提供起止时间、用户、资产、系统用户等搜索过滤条件。 + +.. _stop_online_session: + +终断在线会话 +````````````` + +在在线会话列表中找到要终止的在线会话,点击动作标签下的“终断”按钮,完成终断在线会话。 + + + diff --git a/docs/session_terminal.rst b/docs/session_terminal.rst new file mode 100644 index 000000000..3f749af5c --- /dev/null +++ b/docs/session_terminal.rst @@ -0,0 +1,29 @@ +终端管理 +========= + +这里介绍终端管理功能。 + +点击页面左侧“会话管理”菜单下的“终端管理”,进入终端列表页面。 + +.. contents:: Topics + +.. _view_terminal_session: + +查看终端列表 +````````````` + +终端列表页面默认展示全部终端列表。 + +.. _upate_terminal_session: + +更新终端 +````````````` + +在在线会话列表中找到要更新的终端,点击动作标签下的“更新”按钮,在更新终端页面填写相关信息,点击提交,完成更新终端。 + +.. _delete_terminal_session: + +删除终端 +````````````` + +在在线会话列表中找到要删除的终端,点击动作标签下的“删除”按钮,在弹出确认删除页面点击确认,完成删除终端。 diff --git a/docs/session_web_terminal.rst b/docs/session_web_terminal.rst new file mode 100644 index 000000000..c388e44c4 --- /dev/null +++ b/docs/session_web_terminal.rst @@ -0,0 +1,23 @@ +Web终端 +========= + +这里介绍Web终端功能。 + +点击页面左侧“会话管理”菜单下的“Web终端”,进入Web终端页面。 + +.. contents:: Topics + +.. _login: + +主机登录 +````````````` + +点解页面左侧的”Web终端”,进入主机登录页,然后点击页面右侧的主机IP地址,连接主机,页面右侧会展示当前连接的终端信息。 + +.. _logout: + +主机登出 +````````````` + +在主机登录页面,选择左上角的“服务器”按钮,出现两个选项,一个“断开链接“按钮,断开当前连接的主机;另一个”断开所有链接“,断开当前所有连接的主机。 + diff --git a/docs/snapshot.rst b/docs/snapshot.rst new file mode 100644 index 000000000..7266495c3 --- /dev/null +++ b/docs/snapshot.rst @@ -0,0 +1,27 @@ +Snapshot 截图 ++++++++++++++++++ + +仪表盘 +~~~~~~~~ + +.. image:: _static/img/dash_board.png + +用户管理 +~~~~~~~~~~ + +.. image:: _static/img/admin_user.png + +资产管理 +~~~~~~~~~~ + +.. image:: _static/img/admin_asset.png + +Linux 终端 +~~~~~~~~~~~~~ + +.. image:: _static/img/linux_terminal.png + +Windows 终端 +~~~~~~~~~~~~~~~~ + +.. image:: _static/img/windows_terminal.png diff --git a/docs/step_by_step.rst b/docs/step_by_step.rst index db4b08608..403395fea 100644 --- a/docs/step_by_step.rst +++ b/docs/step_by_step.rst @@ -61,7 +61,7 @@ zip包,我的网速好,我直接clone了 :: $ cd /opt/ - $ git clone --depth=1 https://github.com/jumpserver/jumpserver.git && cd jumpserver && git checkout dev + $ git clone --depth=1 https://github.com/jumpserver/jumpserver.git && cd jumpserver && git checkout master **2.2 安装依赖rpm包** @@ -161,7 +161,7 @@ zip包,我的网速好,我直接clone了 :: $ cd /opt - $ git clone https://github.com/jumpserver/coco.git && cd coco && git checkout dev + $ git clone https://github.com/jumpserver/coco.git && cd coco && git checkout master **3.2 安装依赖** @@ -187,7 +187,7 @@ zip包,我的网速好,我直接clone了 $ python run_server.py 这时需要去 -jumpserver管理后台-终端-终端(http://192.168.244.144:8080/terminal/terminal/)接受coco的注册 +jumpserver管理后台-会话管理-终端管理(http://192.168.244.144:8080/terminal/terminal/)接受coco的注册 :: @@ -230,16 +230,18 @@ Luna已改为纯前端,需要nginx来运行访问 五. 安装Windows支持组件 ~~~~~~~~~~~~~~~~~~~~~~~ -使用docker启动 guacamole +因为手动安装 guacamole 组件比较复杂,这里提供打包好的docker使用, 启动 guacamole .. code:: shell - docker run \ - -p 8080:8080 \ - -e JUMPSERVER_SERVER=http://:8080 \ + + + docker run -d \ + -p 8081:8080 \ + -e JUMPSERVER_SERVER=http://<填写本机的IP地址>:8080 \ jumpserver/guacamole -这里所需要注意的是guacamole暴露出来的端口是8080,若与jumpserver部署在同一主机上自定义一下。 +这里所需要注意的是guacamole暴露出来的端口是8081,若与主机上其他端口冲突请自定义一下。 修改JUMPSERVER_SERVER的配置,填上jumpserver的内网地址 @@ -275,13 +277,20 @@ Luna已改为纯前端,需要nginx来运行访问 location /socket.io/ { proxy_pass http://localhost:5000/socket.io/; + proxy_buffering off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } location /guacamole/ { - proxy_pass http://:8080/; + proxy_pass http://localhost:8081/; + proxy_buffering off; + proxy_http_version 1.1; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + access_log off; } location / { diff --git a/docs/user.rst b/docs/user.rst new file mode 100644 index 000000000..c3bb1f61f --- /dev/null +++ b/docs/user.rst @@ -0,0 +1,51 @@ +用户列表 +======== + +这里介绍用户列表的功能。 + +点击页面左侧“用户列表”菜单下的“用户列表“,进入用户列表页面。 + +.. contents:: Topics + +.. _create_user: + +创建用户 +```````` + +点击页面左上角“创建用户”按钮,进入创建用户页面,填写账户,角色安全,个人等信息,点击“提交”按钮,用户创建完成。 + + +.. _update_user: + +更新用户 +```````` + +点击页面右边的“更新”按钮,进入编辑用户页面,编辑用户信息,点击“提交”按钮,更新用户完成。 + +.. _delete_user: + +删除用户 +```````` + +点击页面右边的“删除”按钮,弹出是否删除确认框,点击“确定”按钮,删除用户完成。 + +.. _export_user: + +导出用户 +```````` + +选中用户,点击右上角的“导出”按钮,导出用户完成。 + +.. _import_user: + +导入用户 +```````` + +点击右上角的“导入”按钮,弹出导入对话框,选择要导入的CSV格式文件,点击“确认”按钮,导入用户完成。 + +.. _batch_user_operation: + +批量操作 +```````` + +选中用户,选择页面左下角的批量操作选项,点击”提交“按钮,批量操作完成。 \ No newline at end of file diff --git a/docs/user_group.rst b/docs/user_group.rst new file mode 100644 index 000000000..90aca6c05 --- /dev/null +++ b/docs/user_group.rst @@ -0,0 +1,29 @@ +用户组列表 +============ + +这里介绍用户组列表的功能。 + +点击页面左侧“用户管理”菜单下的”用户组“,进入用户组列表页面。 + +.. contents:: Topics + +.. _create_user_group: + +创建用户组 +`````````` + +点击页面左上角“创建用户组”按钮,进入创建用户组页面,填写用户组信息,点击“提交”按钮,创建用户完成。 + +.. _update_user_group: + +更新用户组 +`````````` + +点击页面右边的“更新”按钮,进入编辑用户组页面,编辑用户组信息,点击“确认”按钮,更新用户组完成。 + +.. _delete_user_group: + +删除用户组 +```````````` + +点击页面右边的“删除”按钮,弹出删除确认框,点击“确认”按钮,删除用户组完成。 \ No newline at end of file diff --git a/docs/work_center_list.rst b/docs/work_center_list.rst new file mode 100644 index 000000000..2ba982676 --- /dev/null +++ b/docs/work_center_list.rst @@ -0,0 +1,35 @@ +任务列表 +========= + +这里介绍任务列表的相关的功能。 + +.. contents:: Topics + +.. _view_asset_works: + +查看任务列表 +```````````` + +任务列表页面默认展示一周内所有任务。点击标题可根据当前字段进行排序。 + +.. _invoke_asset_work: + +手动执行任务 +```````````` + +在任务列表中找到要手动执行的任务,点击“动作”标题下的“执行”按钮,完成手动执行当前任务。 + +.. _delete_asset_work: + +删除任务 +````````` + +在任务列表中找到要删除的任务,点击“动作”标题下的“删除”按钮,完成删除当前任务。 + +.. _detial_asset_work: + +查看任务详情 +````````````` + +在任务列表中找到要查看的任务,点击要查看的任务名称,即可进入任务详情页面。 + diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 42f3bc36a..200d23480 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,13 +1,15 @@ amqp==2.1.4 -six==1.11.0 ansible==2.4.2.0 asn1crypto==0.24.0 bcrypt==3.1.4 billiard==3.5.0.3 +boto3==1.6.4 +botocore==1.9.4 celery==4.1.0 certifi==2017.11.5 cffi==1.11.2 chardet==3.0.4 +configparser==3.5.0 coreapi==2.3.3 coreschema==0.0.4 cryptography==2.1.4 @@ -15,6 +17,7 @@ decorator==4.1.2 Django==1.11 django-auth-ldap==1.3.0 django-bootstrap3==9.1.0 +django-celery-beat==1.1.1 django-filter==1.1.0 django-formtools==2.1 django-ranged-response==0.2.0 @@ -23,15 +26,21 @@ django-rest-swagger==2.1.2 django-simple-captcha==0.5.6 djangorestframework==3.7.3 djangorestframework-bulk==0.2.1 +docutils==0.14 ecdsa==0.13 +elasticsearch==6.1.1 enum-compat==0.0.2 +ephem==3.7.6.0 eventlet==0.21.0 ForgeryPy==0.1 greenlet==0.4.12 +gunicorn==19.7.1 idna==2.6 itsdangerous==0.24 itypes==1.1.0 Jinja2==2.10 +jmespath==0.9.3 +jms-es-sdk kombu==4.0.2 ldap3==2.4 MarkupSafe==1.0 @@ -46,18 +55,16 @@ pycparser==2.18 pycrypto==2.6.1 pyldap==2.4.45 PyNaCl==1.2.1 +python-dateutil==2.6.1 +python-gssapi==0.6.4 pytz==2017.3 PyYAML==3.12 redis==2.10.6 requests==2.18.4 +s3transfer==0.1.13 simplejson==3.13.2 +six==1.11.0 sshpubkeys==2.2.0 uritemplate==3.0.0 urllib3==1.22 vine==1.1.4 -gunicorn==19.7.1 -#https://github.com/celery/django-celery-beat/zipball/master#egg=django-celery-beat -django_celery_beat==1.1.1 -ephem==3.7.6.0 -python-gssapi==0.6.4 -jms-es-sdk diff --git a/tmp/.gitkeep b/tmp/.gitkeep index a43b1b292..e69de29bb 100644 --- a/tmp/.gitkeep +++ b/tmp/.gitkeep @@ -1 +0,0 @@ -Because ansible connect remote host using key file path except key string, so I create this dir for keep them. \ No newline at end of file