diff --git a/apps/common/api.py b/apps/common/api.py index cf3855b60640847049f60201d484c6c44e1a50cd..269d493d098dfbdb935d10df95f6faffcfd6cd4a 100644 --- a/apps/common/api.py +++ b/apps/common/api.py @@ -1,197 +1,17 @@ # -*- coding: utf-8 -*- # - import os -import json -import jms_storage import uuid -from rest_framework.views import Response, APIView -from rest_framework import generics -from ldap3 import Server, Connection -from django.core.mail import send_mail +from rest_framework.views import Response +from rest_framework import generics, serializers from django.core.cache import cache -from django.utils.translation import ugettext_lazy as _ -from django.conf import settings - -from .permissions import IsOrgAdmin, IsSuperUser -from .serializers import ( - MailTestSerializer, LDAPTestSerializer, OutputSerializer -) -from .models import Setting - - -class MailTestingAPI(APIView): - permission_classes = (IsOrgAdmin,) - serializer_class = MailTestSerializer - success_message = _("Test mail sent to {}, please check") - - def post(self, request): - serializer = self.serializer_class(data=request.data) - if serializer.is_valid(): - email_host_user = serializer.validated_data["EMAIL_HOST_USER"] - for k, v in serializer.validated_data.items(): - if k.startswith('EMAIL'): - setattr(settings, k, v) - try: - subject = "Test" - message = "Test smtp setting" - send_mail(subject, message, email_host_user, [email_host_user]) - except Exception as e: - return Response({"error": str(e)}, status=401) - - return Response({"msg": self.success_message.format(email_host_user)}) - else: - return Response({"error": str(serializer.errors)}, status=401) - - -class LDAPTestingAPI(APIView): - permission_classes = (IsOrgAdmin,) - serializer_class = LDAPTestSerializer - success_message = _("Test ldap success") - - def post(self, request): - serializer = self.serializer_class(data=request.data) - if serializer.is_valid(): - host = serializer.validated_data["AUTH_LDAP_SERVER_URI"] - bind_dn = serializer.validated_data["AUTH_LDAP_BIND_DN"] - password = serializer.validated_data["AUTH_LDAP_BIND_PASSWORD"] - use_ssl = serializer.validated_data.get("AUTH_LDAP_START_TLS", False) - search_ougroup = serializer.validated_data["AUTH_LDAP_SEARCH_OU"] - search_filter = serializer.validated_data["AUTH_LDAP_SEARCH_FILTER"] - attr_map = serializer.validated_data["AUTH_LDAP_USER_ATTR_MAP"] - - try: - attr_map = json.loads(attr_map) - except json.JSONDecodeError: - return Response({"error": "AUTH_LDAP_USER_ATTR_MAP not valid"}, status=401) - - server = Server(host, use_ssl=use_ssl) - conn = Connection(server, bind_dn, password) - try: - conn.bind() - except Exception as e: - return Response({"error": str(e)}, status=401) - - users = [] - for search_ou in str(search_ougroup).split("|"): - ok = conn.search(search_ou, search_filter % ({"user": "*"}), - attributes=list(attr_map.values())) - if not ok: - return Response({"error": _("Search no entry matched in ou {}").format(search_ou)}, status=401) - - for entry in conn.entries: - user = {} - for attr, mapping in attr_map.items(): - if hasattr(entry, mapping): - user[attr] = getattr(entry, mapping) - users.append(user) - if len(users) > 0: - return Response({"msg": _("Match {} s users").format(len(users))}) - else: - return Response({"error": "Have user but attr mapping error"}, status=401) - else: - return Response({"error": str(serializer.errors)}, status=401) - - -class ReplayStorageCreateAPI(APIView): - permission_classes = (IsSuperUser,) - - def post(self, request): - storage_data = request.data - - if storage_data.get('TYPE') == 'ceph': - port = storage_data.get('PORT') - if port.isdigit(): - storage_data['PORT'] = int(storage_data.get('PORT')) - - storage_name = storage_data.pop('NAME') - data = {storage_name: storage_data} - - if not self.is_valid(storage_data): - return Response({ - "error": _("Error: Account invalid (Please make sure the " - "information such as Access key or Secret key is correct)")}, - status=401 - ) - - Setting.save_storage('TERMINAL_REPLAY_STORAGE', data) - return Response({"msg": _('Create succeed')}, status=200) - - @staticmethod - def is_valid(storage_data): - if storage_data.get('TYPE') == 'server': - return True - storage = jms_storage.get_object_storage(storage_data) - target = 'tests.py' - src = os.path.join(settings.BASE_DIR, 'common', target) - return storage.is_valid(src, target) - - -class ReplayStorageDeleteAPI(APIView): - permission_classes = (IsSuperUser,) - - def post(self, request): - storage_name = str(request.data.get('name')) - Setting.delete_storage('TERMINAL_REPLAY_STORAGE', storage_name) - return Response({"msg": _('Delete succeed')}, status=200) - - -class CommandStorageCreateAPI(APIView): - permission_classes = (IsSuperUser,) - - def post(self, request): - storage_data = request.data - storage_name = storage_data.pop('NAME') - data = {storage_name: storage_data} - if not self.is_valid(storage_data): - return Response( - {"error": _("Error: Account invalid (Please make sure the " - "information such as Access key or Secret key is correct)")}, - status=401 - ) - - Setting.save_storage('TERMINAL_COMMAND_STORAGE', data) - return Response({"msg": _('Create succeed')}, status=200) - - @staticmethod - def is_valid(storage_data): - if storage_data.get('TYPE') == 'server': - return True - try: - storage = jms_storage.get_log_storage(storage_data) - except Exception: - return False - - return storage.ping() - - -class CommandStorageDeleteAPI(APIView): - permission_classes = (IsSuperUser,) - - def post(self, request): - storage_name = str(request.data.get('name')) - Setting.delete_storage('TERMINAL_COMMAND_STORAGE', storage_name) - return Response({"msg": _('Delete succeed')}, status=200) - -class DjangoSettingsAPI(APIView): - def get(self, request): - if not settings.DEBUG: - return Response("Not in debug mode") - data = {} - for i in [settings, getattr(settings, '_wrapped')]: - if not i: - continue - for k, v in i.__dict__.items(): - if k and k.isupper(): - try: - json.dumps(v) - data[k] = v - except (json.JSONDecodeError, TypeError): - data[k] = str(v) - return Response(data) +class OutputSerializer(serializers.Serializer): + output = serializers.CharField() + is_end = serializers.BooleanField() + mark = serializers.CharField() class LogTailApi(generics.RetrieveAPIView): diff --git a/apps/common/apps.py b/apps/common/apps.py index bc6db2151e0b4f3201c26a82bfa868294f655b99..ea797805d8a2553a4009b7b472c853b03288436e 100644 --- a/apps/common/apps.py +++ b/apps/common/apps.py @@ -1,13 +1,17 @@ from __future__ import unicode_literals +import sys from django.apps import AppConfig +from django.dispatch import receiver +from django.db.backends.signals import connection_created + + +@receiver(connection_created, dispatch_uid="my_unique_identifier") +def on_db_connection_ready(sender, **kwargs): + from .signals import django_ready + if 'migrate' not in sys.argv: + django_ready.send(CommonConfig) class CommonConfig(AppConfig): name = 'common' - - def ready(self): - from . import signals_handler - from .signals import django_ready - django_ready.send(self.__class__) - return super().ready() diff --git a/apps/common/migrations/0002_auto_20180111_1407.py b/apps/common/migrations/0002_auto_20180111_1407.py deleted file mode 100644 index 7c74b9d2b1341e4d9c11d91212c86cdfb010ba1f..0000000000000000000000000000000000000000 --- a/apps/common/migrations/0002_auto_20180111_1407.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-01-11 06:07 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0001_initial'), - ] - - operations = [ - migrations.RenameModel( - old_name='Settings', - new_name='Setting', - ), - migrations.AlterModelManagers( - name='setting', - managers=[ - ], - ), - migrations.AlterModelTable( - name='setting', - table='settings', - ), - ] diff --git a/apps/common/migrations/0003_setting_category.py b/apps/common/migrations/0003_setting_category.py deleted file mode 100644 index 234518287b61e6d4376032508b152d7651b3692f..0000000000000000000000000000000000000000 --- a/apps/common/migrations/0003_setting_category.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-01-22 03:54 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0002_auto_20180111_1407'), - ] - - operations = [ - migrations.AddField( - model_name='setting', - name='category', - field=models.CharField(default='default', max_length=128), - ), - ] diff --git a/apps/common/migrations/0004_setting_encrypted.py b/apps/common/migrations/0004_setting_encrypted.py deleted file mode 100644 index d6862643f3c21db5043794cb2333d37743f8bb57..0000000000000000000000000000000000000000 --- a/apps/common/migrations/0004_setting_encrypted.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 2.1 on 2018-09-03 03:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0003_setting_category'), - ] - - operations = [ - migrations.AddField( - model_name='setting', - name='encrypted', - field=models.BooleanField(default=False), - ), - ] diff --git a/apps/common/migrations/0005_auto_20190221_1902.py b/apps/common/migrations/0005_auto_20190221_1902.py deleted file mode 100644 index 997ca7a1360ae2d2b51d7942fcefedac9e00f4f6..0000000000000000000000000000000000000000 --- a/apps/common/migrations/0005_auto_20190221_1902.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.1.7 on 2019-02-21 11:02 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0004_setting_encrypted'), - ] - - operations = [ - migrations.AlterModelOptions( - name='setting', - options={'verbose_name': 'Setting'}, - ), - ] diff --git a/apps/common/tasks.py b/apps/common/tasks.py index 5aefd28ee4b169759ab2ea634119f3a56da5fde7..dec738921813165287e6b5d63078ad3f0589d89c 100644 --- a/apps/common/tasks.py +++ b/apps/common/tasks.py @@ -2,7 +2,6 @@ from django.core.mail import send_mail from django.conf import settings from celery import shared_task from .utils import get_logger -from .models import Setting logger = get_logger(__file__) diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 43bc3cc1a90b1178985beae13d76712bd24fafb4..22e660bb117648036471f17fadab7e8e6029b00f 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -59,6 +59,7 @@ INSTALLED_APPS = [ 'assets.apps.AssetsConfig', 'perms.apps.PermsConfig', 'ops.apps.OpsConfig', + 'settings.apps.SettingsConfig', 'common.apps.CommonConfig', 'terminal.apps.TerminalConfig', 'audits.apps.AuditsConfig', diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py index 8ddf5cae44ae827fc149f9668ab40397d078e69e..bdae17a44c8f5d5421324929431ab062cfa4ca41 100644 --- a/apps/jumpserver/urls.py +++ b/apps/jumpserver/urls.py @@ -20,7 +20,7 @@ api_v1_patterns = [ path('ops/v1/', include('ops.urls.api_urls', namespace='api-ops')), path('audits/v1/', include('audits.urls.api_urls', namespace='api-audits')), path('orgs/v1/', include('orgs.urls.api_urls', namespace='api-orgs')), - path('common/v1/', include('common.urls.api_urls', namespace='api-common')), + path('settings/v1/', include('settings.urls.api_urls', namespace='api-settings')), ])) ] @@ -56,8 +56,7 @@ urlpatterns = [ path('', include(api_v1_patterns)), path('luna/', LunaView.as_view(), name='luna-error'), path('i18n/<str:lang>/', I18NView.as_view(), name='i18n-switch'), - path('settings/', include('common.urls.view_urls', namespace='settings')), - path('common/', include('common.urls.view_urls', namespace='common')), + path('settings/', include('settings.urls.view_urls', namespace='settings')), # path('api/v2/', include(api_v2_patterns)), # External apps url diff --git a/apps/settings/__init__.py b/apps/settings/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/apps/settings/admin.py b/apps/settings/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..8c38f3f3dad51e4585f3984282c2a4bec5349c1e --- /dev/null +++ b/apps/settings/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/settings/api.py b/apps/settings/api.py new file mode 100644 index 0000000000000000000000000000000000000000..fea869edc939aa46b3bd101a4055de2483972460 --- /dev/null +++ b/apps/settings/api.py @@ -0,0 +1,194 @@ +# -*- coding: utf-8 -*- +# + +import os +import json +import jms_storage + +from rest_framework.views import Response, APIView +from ldap3 import Server, Connection +from django.core.mail import send_mail +from django.utils.translation import ugettext_lazy as _ +from django.conf import settings + +from common.permissions import IsOrgAdmin, IsSuperUser +from .serializers import ( + MailTestSerializer, LDAPTestSerializer +) +from .models import Setting + + +class MailTestingAPI(APIView): + permission_classes = (IsOrgAdmin,) + serializer_class = MailTestSerializer + success_message = _("Test mail sent to {}, please check") + + def post(self, request): + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + email_host_user = serializer.validated_data["EMAIL_HOST_USER"] + for k, v in serializer.validated_data.items(): + if k.startswith('EMAIL'): + setattr(settings, k, v) + try: + subject = "Test" + message = "Test smtp setting" + send_mail(subject, message, email_host_user, [email_host_user]) + except Exception as e: + return Response({"error": str(e)}, status=401) + + return Response({"msg": self.success_message.format(email_host_user)}) + else: + return Response({"error": str(serializer.errors)}, status=401) + + +class LDAPTestingAPI(APIView): + permission_classes = (IsOrgAdmin,) + serializer_class = LDAPTestSerializer + success_message = _("Test ldap success") + + def post(self, request): + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + host = serializer.validated_data["AUTH_LDAP_SERVER_URI"] + bind_dn = serializer.validated_data["AUTH_LDAP_BIND_DN"] + password = serializer.validated_data["AUTH_LDAP_BIND_PASSWORD"] + use_ssl = serializer.validated_data.get("AUTH_LDAP_START_TLS", False) + search_ougroup = serializer.validated_data["AUTH_LDAP_SEARCH_OU"] + search_filter = serializer.validated_data["AUTH_LDAP_SEARCH_FILTER"] + attr_map = serializer.validated_data["AUTH_LDAP_USER_ATTR_MAP"] + + try: + attr_map = json.loads(attr_map) + except json.JSONDecodeError: + return Response({"error": "AUTH_LDAP_USER_ATTR_MAP not valid"}, status=401) + + server = Server(host, use_ssl=use_ssl) + conn = Connection(server, bind_dn, password) + try: + conn.bind() + except Exception as e: + return Response({"error": str(e)}, status=401) + + users = [] + for search_ou in str(search_ougroup).split("|"): + ok = conn.search(search_ou, search_filter % ({"user": "*"}), + attributes=list(attr_map.values())) + if not ok: + return Response({"error": _("Search no entry matched in ou {}").format(search_ou)}, status=401) + + for entry in conn.entries: + user = {} + for attr, mapping in attr_map.items(): + if hasattr(entry, mapping): + user[attr] = getattr(entry, mapping) + users.append(user) + if len(users) > 0: + return Response({"msg": _("Match {} s users").format(len(users))}) + else: + return Response({"error": "Have user but attr mapping error"}, status=401) + else: + return Response({"error": str(serializer.errors)}, status=401) + + +class ReplayStorageCreateAPI(APIView): + permission_classes = (IsSuperUser,) + + def post(self, request): + storage_data = request.data + + if storage_data.get('TYPE') == 'ceph': + port = storage_data.get('PORT') + if port.isdigit(): + storage_data['PORT'] = int(storage_data.get('PORT')) + + storage_name = storage_data.pop('NAME') + data = {storage_name: storage_data} + + if not self.is_valid(storage_data): + return Response({ + "error": _("Error: Account invalid (Please make sure the " + "information such as Access key or Secret key is correct)")}, + status=401 + ) + + Setting.save_storage('TERMINAL_REPLAY_STORAGE', data) + return Response({"msg": _('Create succeed')}, status=200) + + @staticmethod + def is_valid(storage_data): + if storage_data.get('TYPE') == 'server': + return True + storage = jms_storage.get_object_storage(storage_data) + target = 'tests.py' + src = os.path.join(settings.BASE_DIR, 'common', target) + return storage.is_valid(src, target) + + +class ReplayStorageDeleteAPI(APIView): + permission_classes = (IsSuperUser,) + + def post(self, request): + storage_name = str(request.data.get('name')) + Setting.delete_storage('TERMINAL_REPLAY_STORAGE', storage_name) + return Response({"msg": _('Delete succeed')}, status=200) + + +class CommandStorageCreateAPI(APIView): + permission_classes = (IsSuperUser,) + + def post(self, request): + storage_data = request.data + storage_name = storage_data.pop('NAME') + data = {storage_name: storage_data} + if not self.is_valid(storage_data): + return Response( + {"error": _("Error: Account invalid (Please make sure the " + "information such as Access key or Secret key is correct)")}, + status=401 + ) + + Setting.save_storage('TERMINAL_COMMAND_STORAGE', data) + return Response({"msg": _('Create succeed')}, status=200) + + @staticmethod + def is_valid(storage_data): + if storage_data.get('TYPE') == 'server': + return True + try: + storage = jms_storage.get_log_storage(storage_data) + except Exception: + return False + + return storage.ping() + + +class CommandStorageDeleteAPI(APIView): + permission_classes = (IsSuperUser,) + + def post(self, request): + storage_name = str(request.data.get('name')) + Setting.delete_storage('TERMINAL_COMMAND_STORAGE', storage_name) + return Response({"msg": _('Delete succeed')}, status=200) + + +class DjangoSettingsAPI(APIView): + def get(self, request): + if not settings.DEBUG: + return Response("Not in debug mode") + + data = {} + for i in [settings, getattr(settings, '_wrapped')]: + if not i: + continue + for k, v in i.__dict__.items(): + if k and k.isupper(): + try: + json.dumps(v) + data[k] = v + except (json.JSONDecodeError, TypeError): + data[k] = str(v) + return Response(data) + + + diff --git a/apps/settings/apps.py b/apps/settings/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..05af85c462f48008cb14d1ea037441809d558594 --- /dev/null +++ b/apps/settings/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig + + +class SettingsConfig(AppConfig): + name = 'settings' + + def ready(self): + from . import signals_handler diff --git a/apps/common/forms.py b/apps/settings/forms.py similarity index 98% rename from apps/common/forms.py rename to apps/settings/forms.py index 1f7e4c1fd109edfe5eadecb4ff5a71353c6408ff..6721d07d1b28247eddc047fda78292f8f4e7e97d 100644 --- a/apps/common/forms.py +++ b/apps/settings/forms.py @@ -6,8 +6,9 @@ from django.utils.translation import ugettext_lazy as _ from django.db import transaction from .models import Setting, settings -from .fields import FormDictField, FormEncryptCharField, \ - FormEncryptMixin +from common.fields import ( + FormDictField, FormEncryptCharField, FormEncryptMixin +) class BaseForm(forms.Form): diff --git a/apps/common/migrations/0001_initial.py b/apps/settings/migrations/0001_initial.py similarity index 66% rename from apps/common/migrations/0001_initial.py rename to apps/settings/migrations/0001_initial.py index 2b612dc1d6f68fa47ff8df7c31c7ca589f3d581c..f332e8d932e791a65f222579d105c6aade311938 100644 --- a/apps/common/migrations/0001_initial.py +++ b/apps/settings/migrations/0001_initial.py @@ -1,9 +1,6 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-01-11 05:35 -from __future__ import unicode_literals +# Generated by Django 2.1.7 on 2019-02-26 03:11 from django.db import migrations, models -import django.db.models.manager class Migration(migrations.Migration): @@ -15,16 +12,19 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='Settings', + name='Setting', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=128, unique=True, verbose_name='Name')), ('value', models.TextField(verbose_name='Value')), + ('category', models.CharField(default='default', max_length=128)), + ('encrypted', models.BooleanField(default=False)), ('enabled', models.BooleanField(default=True, verbose_name='Enabled')), ('comment', models.TextField(verbose_name='Comment')), ], - managers=[ - ('configs', django.db.models.manager.Manager()), - ], + options={ + 'verbose_name': 'Setting', + 'db_table': 'setting', + }, ), ] diff --git a/apps/settings/migrations/0002_migrate_data.py b/apps/settings/migrations/0002_migrate_data.py new file mode 100644 index 0000000000000000000000000000000000000000..0d76d1386dc07b7dee5f2d471a2af11ae9ce091b --- /dev/null +++ b/apps/settings/migrations/0002_migrate_data.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# +from django.db import migrations, connection + + +class Migration(migrations.Migration): + + dependencies = [ + ("settings", "0001_initial"), + ] + sql = "INSERT INTO setting(name, value, category, encrypted, enabled, comment) " \ + "SELECT name, value, category, encrypted, enabled, comment from settings" + settings_table_exist = 'settings' in connection.introspection.table_names() + + operations = [] + if settings_table_exist: + operations.append(migrations.RunSQL(sql)) diff --git a/apps/settings/migrations/__init__.py b/apps/settings/migrations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/apps/common/models.py b/apps/settings/models.py similarity index 98% rename from apps/common/models.py rename to apps/settings/models.py index a6755a6d40f0ef51cabce2d8d66d55ae8c4d4413..bc70bdb5001d9134158e8389dcc1c35b7c77e526 100644 --- a/apps/common/models.py +++ b/apps/settings/models.py @@ -6,7 +6,7 @@ from django.db.utils import ProgrammingError, OperationalError from django.utils.translation import ugettext_lazy as _ from django.conf import settings -from .utils import get_signer +from common.utils import get_signer signer = get_signer() @@ -122,5 +122,5 @@ class Setting(models.Model): settings.AUTHENTICATION_BACKENDS = old_setting class Meta: - db_table = "settings" + db_table = "setting" verbose_name = _("Setting") diff --git a/apps/common/serializers.py b/apps/settings/serializers.py similarity index 85% rename from apps/common/serializers.py rename to apps/settings/serializers.py index 4c8e6d3b5f5674c2162b51e07d78e8c36f732ee7..731823df92ce1b18f6b25a4a8a9189c8fb69b6ca 100644 --- a/apps/common/serializers.py +++ b/apps/settings/serializers.py @@ -20,7 +20,4 @@ class LDAPTestSerializer(serializers.Serializer): AUTH_LDAP_START_TLS = serializers.BooleanField(required=False) -class OutputSerializer(serializers.Serializer): - output = serializers.CharField() - is_end = serializers.BooleanField() - mark = serializers.CharField() + diff --git a/apps/common/signals_handler.py b/apps/settings/signals_handler.py similarity index 94% rename from apps/common/signals_handler.py rename to apps/settings/signals_handler.py index b44dca78718577a202b6e0ebd515504493a31cae..c8fa92e2797da6619e500b36af2b26dd64b72adb 100644 --- a/apps/common/signals_handler.py +++ b/apps/settings/signals_handler.py @@ -3,15 +3,15 @@ import json from django.dispatch import receiver -from django.db.models.signals import post_save, pre_save +from django.db.models.signals import post_save, pre_save, pre_migrate from django.conf import LazySettings, empty from django.db.utils import ProgrammingError, OperationalError from django.core.cache import cache from jumpserver.utils import current_request +from common.utils import get_logger, ssh_key_gen +from common.signals import django_ready from .models import Setting -from .utils import get_logger, ssh_key_gen -from .signals import django_ready logger = get_logger(__file__) diff --git a/apps/common/templates/common/basic_setting.html b/apps/settings/templates/settings/basic_setting.html similarity index 100% rename from apps/common/templates/common/basic_setting.html rename to apps/settings/templates/settings/basic_setting.html diff --git a/apps/common/templates/common/command_storage_create.html b/apps/settings/templates/settings/command_storage_create.html similarity index 98% rename from apps/common/templates/common/command_storage_create.html rename to apps/settings/templates/settings/command_storage_create.html index 671b11c94cf6b7802f2f177ed4aad22a964e2069..9c60e2d85a50935ee41cfdc08e790a37821507bb 100644 --- a/apps/common/templates/common/command_storage_create.html +++ b/apps/settings/templates/settings/command_storage_create.html @@ -159,10 +159,10 @@ $(document).ready(function() { data[name] = value } }); - var url = "{% url 'api-common:command-storage-create' %}"; + var url = "{% url 'api-settings:command-storage-create' %}"; var success = function(data, textStatus) { console.log(data, textStatus); - location = "{% url 'common:terminal-setting' %}"; + location = "{% url 'settings:terminal-setting' %}"; }; var error = function(data, textStatus) { var error_msg = data.responseJSON.error; diff --git a/apps/common/templates/common/email_setting.html b/apps/settings/templates/settings/email_setting.html similarity index 98% rename from apps/common/templates/common/email_setting.html rename to apps/settings/templates/settings/email_setting.html index 2f0951e0021785d5c4bb5ca4dbf969cc90e74b7a..46846d7dc63dcf8b59b63add5fe5ea5293f4d871 100644 --- a/apps/common/templates/common/email_setting.html +++ b/apps/settings/templates/settings/email_setting.html @@ -84,7 +84,7 @@ $(document).ready(function () { data[field.name] = field.value; }); - var the_url = "{% url 'api-common:mail-testing' %}"; + var the_url = "{% url 'api-settings:mail-testing' %}"; function error(message) { toastr.error(message) diff --git a/apps/common/templates/common/ldap_setting.html b/apps/settings/templates/settings/ldap_setting.html similarity index 98% rename from apps/common/templates/common/ldap_setting.html rename to apps/settings/templates/settings/ldap_setting.html index e55da5a8f9a09895191d7db20582a4afb51ac3a9..45820b97c8d50ff003488196aee5b2a859389727 100644 --- a/apps/common/templates/common/ldap_setting.html +++ b/apps/settings/templates/settings/ldap_setting.html @@ -84,7 +84,7 @@ $(document).ready(function () { data[field.name] = field.value; }); - var the_url = "{% url 'api-common:ldap-testing' %}"; + var the_url = "{% url 'api-settings:ldap-testing' %}"; function error(message) { toastr.error(message) diff --git a/apps/common/templates/common/replay_storage_create.html b/apps/settings/templates/settings/replay_storage_create.html similarity index 99% rename from apps/common/templates/common/replay_storage_create.html rename to apps/settings/templates/settings/replay_storage_create.html index c8f99240a3df9323f9d61786e7a4a1b2c1b9ae97..69a1ba9fc3e0d89d11a7a1aa5e533b04decbd6b3 100644 --- a/apps/common/templates/common/replay_storage_create.html +++ b/apps/settings/templates/settings/replay_storage_create.html @@ -251,9 +251,9 @@ $(document).ready(function() { var name = $(id_field).attr('name'); data[name] = $(id_field).val(); }); - var url = "{% url 'api-common:replay-storage-create' %}"; + var url = "{% url 'api-settings:replay-storage-create' %}"; var success = function(data, textStatus) { - location = "{% url 'common:terminal-setting' %}"; + location = "{% url 'settings:terminal-setting' %}"; submitBtn.removeClass('disabled'); submitBtn.html(origin_text); }; diff --git a/apps/common/templates/common/security_setting.html b/apps/settings/templates/settings/security_setting.html similarity index 100% rename from apps/common/templates/common/security_setting.html rename to apps/settings/templates/settings/security_setting.html diff --git a/apps/common/templates/common/terminal_setting.html b/apps/settings/templates/settings/terminal_setting.html similarity index 95% rename from apps/common/templates/common/terminal_setting.html rename to apps/settings/templates/settings/terminal_setting.html index 994d1714b5e904525948c9c4e1defa4dd850df25..e6eb7298295b8a33ec308289b10a408437d17f45 100644 --- a/apps/common/templates/common/terminal_setting.html +++ b/apps/settings/templates/settings/terminal_setting.html @@ -92,7 +92,7 @@ {% endfor %} </tbody> </table> - <a href="{% url 'common:command-storage-create' %}" class="btn btn-primary btn-xs">{% trans 'Add' %}</a> + <a href="{% url 'settings:command-storage-create' %}" class="btn btn-primary btn-xs">{% trans 'Add' %}</a> <div class="hr-line-dashed"></div> <h3>{% trans "Replay storage" %}</h3> @@ -114,7 +114,7 @@ {% endfor %} </tbody> </table> - <a href="{% url 'common:replay-storage-create' %}" class="btn btn-primary btn-xs">{% trans 'Add' %}</a> + <a href="{% url 'settings:replay-storage-create' %}" class="btn btn-primary btn-xs">{% trans 'Add' %}</a> <div class="hr-line-dashed"></div> </form> @@ -174,12 +174,12 @@ $(document).ready(function () { }) .on('click', '.btn-del-replay', function(){ var $this = $(this); - var the_url = "{% url 'api-common:replay-storage-delete' %}"; + var the_url = "{% url 'api-settings:replay-storage-delete' %}"; deleteStorage($this, the_url); }) .on('click', '.btn-del-command', function() { var $this = $(this); - var the_url = "{% url 'api-common:command-storage-delete' %}"; + var the_url = "{% url 'api-settings:command-storage-delete' %}"; deleteStorage($this, the_url) }); diff --git a/apps/settings/tests.py b/apps/settings/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6 --- /dev/null +++ b/apps/settings/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/common/urls/api_urls.py b/apps/settings/urls/api_urls.py similarity index 100% rename from apps/common/urls/api_urls.py rename to apps/settings/urls/api_urls.py diff --git a/apps/common/urls/view_urls.py b/apps/settings/urls/view_urls.py similarity index 100% rename from apps/common/urls/view_urls.py rename to apps/settings/urls/view_urls.py diff --git a/apps/common/views.py b/apps/settings/views.py similarity index 92% rename from apps/common/views.py rename to apps/settings/views.py index 2500d96a368f7e1c0d6b4508f754bb01f4c3ec2c..b6ac0bd89732063d8dfeb5cdda972fb676d7f64f 100644 --- a/apps/common/views.py +++ b/apps/settings/views.py @@ -3,15 +3,15 @@ from django.shortcuts import render, redirect from django.contrib import messages from django.utils.translation import ugettext as _ +from common.permissions import SuperUserRequiredMixin +from common import utils from .forms import EmailSettingForm, LDAPSettingForm, BasicSettingForm, \ TerminalSettingForm, SecuritySettingForm -from common.permissions import SuperUserRequiredMixin -from . import utils class BasicSettingView(SuperUserRequiredMixin, TemplateView): form_class = BasicSettingForm - template_name = "common/basic_setting.html" + template_name = "settings/basic_setting.html" def get_context_data(self, **kwargs): context = { @@ -37,7 +37,7 @@ class BasicSettingView(SuperUserRequiredMixin, TemplateView): class EmailSettingView(SuperUserRequiredMixin, TemplateView): form_class = EmailSettingForm - template_name = "common/email_setting.html" + template_name = "settings/email_setting.html" def get_context_data(self, **kwargs): context = { @@ -63,7 +63,7 @@ class EmailSettingView(SuperUserRequiredMixin, TemplateView): class LDAPSettingView(SuperUserRequiredMixin, TemplateView): form_class = LDAPSettingForm - template_name = "common/ldap_setting.html" + template_name = "settings/ldap_setting.html" def get_context_data(self, **kwargs): context = { @@ -89,7 +89,7 @@ class LDAPSettingView(SuperUserRequiredMixin, TemplateView): class TerminalSettingView(SuperUserRequiredMixin, TemplateView): form_class = TerminalSettingForm - template_name = "common/terminal_setting.html" + template_name = "settings/terminal_setting.html" def get_context_data(self, **kwargs): command_storage = utils.get_command_storage_setting() @@ -119,7 +119,7 @@ class TerminalSettingView(SuperUserRequiredMixin, TemplateView): class ReplayStorageCreateView(SuperUserRequiredMixin, TemplateView): - template_name = 'common/replay_storage_create.html' + template_name = 'settings/replay_storage_create.html' def get_context_data(self, **kwargs): context = { @@ -131,7 +131,7 @@ class ReplayStorageCreateView(SuperUserRequiredMixin, TemplateView): class CommandStorageCreateView(SuperUserRequiredMixin, TemplateView): - template_name = 'common/command_storage_create.html' + template_name = 'settings/command_storage_create.html' def get_context_data(self, **kwargs): context = { @@ -144,7 +144,7 @@ class CommandStorageCreateView(SuperUserRequiredMixin, TemplateView): class SecuritySettingView(SuperUserRequiredMixin, TemplateView): form_class = SecuritySettingForm - template_name = "common/security_setting.html" + template_name = "settings/security_setting.html" def get_context_data(self, **kwargs): context = { diff --git a/apps/users/utils.py b/apps/users/utils.py index c998774b07709592795dc7a8eae922a1b8769e5a..db69fd0933ef1913c8b505341f286c716033043c 100644 --- a/apps/users/utils.py +++ b/apps/users/utils.py @@ -6,7 +6,6 @@ import re import pyotp import base64 import logging -import uuid import requests import ipaddress @@ -20,8 +19,6 @@ from datetime import datetime from common.tasks import send_mail_async from common.utils import reverse, get_object_or_none -from common.forms import SecuritySettingForm -from common.models import Setting from .models import User, LoginLog diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 526c8f5dffa8728cb5f0f3610375b0cf1c878408..0000000000000000000000000000000000000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = Jumpserver -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/_static/img/admin_asset.png b/docs/_static/img/admin_asset.png deleted file mode 100644 index a4d33d4756800a15046c3b935e1d0fddc6df650f..0000000000000000000000000000000000000000 Binary files a/docs/_static/img/admin_asset.png and /dev/null differ diff --git a/docs/_static/img/admin_user.png b/docs/_static/img/admin_user.png deleted file mode 100644 index de844ad219b71c152e3e447b3f919eafbfac41cb..0000000000000000000000000000000000000000 Binary files a/docs/_static/img/admin_user.png and /dev/null differ diff --git a/docs/_static/img/dash_board.png b/docs/_static/img/dash_board.png deleted file mode 100644 index ffb9406683c638dc67f2fb6b8f863dbeeca71fdb..0000000000000000000000000000000000000000 Binary files a/docs/_static/img/dash_board.png and /dev/null differ diff --git a/docs/_static/img/linux_terminal.png b/docs/_static/img/linux_terminal.png deleted file mode 100644 index e721f4898dc47125971b9267e0b410543a3da327..0000000000000000000000000000000000000000 Binary files a/docs/_static/img/linux_terminal.png and /dev/null differ diff --git a/docs/_static/img/logo-text.png b/docs/_static/img/logo-text.png deleted file mode 100755 index f4912a08f7334f365924e26ebf2d6a2b091f34b4..0000000000000000000000000000000000000000 Binary files a/docs/_static/img/logo-text.png and /dev/null differ diff --git a/docs/_static/img/structure.png b/docs/_static/img/structure.png deleted file mode 100644 index 90476014cc132e1a936e23b2b05295feab934f92..0000000000000000000000000000000000000000 Binary files a/docs/_static/img/structure.png and /dev/null differ diff --git a/docs/_static/img/windows_terminal.png b/docs/_static/img/windows_terminal.png deleted file mode 100644 index 14f56e57b67fc4f1eb1d59cf42c154a9a13b9d74..0000000000000000000000000000000000000000 Binary files a/docs/_static/img/windows_terminal.png and /dev/null differ diff --git a/docs/admin_asset.rst b/docs/admin_asset.rst deleted file mode 100644 index 03aec1675c42487b8e2baedd94eeede812bd6cb3..0000000000000000000000000000000000000000 --- a/docs/admin_asset.rst +++ /dev/null @@ -1,12 +0,0 @@ -资产管ç†æ¨¡å— -============= - -这里介ç»èµ„产管ç†æ¨¡å—功能。 - -.. 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 deleted file mode 100644 index fd770c17cbebb760f0300f5de7b767495718f9ff..0000000000000000000000000000000000000000 --- a/docs/admin_guide.rst +++ /dev/null @@ -1,15 +0,0 @@ -管ç†æ–‡æ¡£ -========= - -这里介ç»ç®¡ç†å‘˜åŠŸèƒ½ã€‚ - -.. 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 deleted file mode 100644 index 77719f5b14327bd48077bd8a2d45439ca9284540..0000000000000000000000000000000000000000 --- a/docs/admin_instruction.rst +++ /dev/null @@ -1,44 +0,0 @@ -架构说明 -================= - -.. image:: _static/img/structure.png - :alt: 组件架构图 - - -组件说明 -================= - -Jumpserver -````````````` -现指 Jumpserver 管ç†åŽå°ï¼Œæ˜¯æ ¸å¿ƒç»„件(Core), 使用 Django Class Based View é£Žæ ¼å¼€å‘ï¼Œæ”¯æŒ Restful API。 - -`Github <https://github.com/jumpserver/jumpserver.git>`_ - - -Coco -```````` -实现了 SSH Server å’Œ Web Terminal Server 的组件,æä¾› SSH å’Œ WebSocket 接å£, 使用 Paramiko å’Œ Flask å¼€å‘。 - - -`Github <https://github.com/jumpserver/coco.git>`__ - - -Luna -```````` -现在是 Web Terminal å‰ç«¯ï¼Œè®¡åˆ’å‰ç«¯é¡µé¢éƒ½ç”±è¯¥é¡¹ç›®æ供,Jumpserver åªæä¾› API,ä¸å†è´Ÿè´£åŽå°æ¸²æŸ“htmlç‰ã€‚ - -`Github <https://github.com/jumpserver/luna.git>`__ - - -Guacamole -``````````` -Apache è·³æ¿æœºé¡¹ç›®ï¼ŒJumpserver 使用其组件实现 RDP 功能,Jumpserver 并没有修改其代ç è€Œæ˜¯æ·»åŠ äº†é¢å¤–çš„æ’ä»¶ï¼Œæ”¯æŒ Jumpserver 调用。 - - -Jumpserver-Python-SDK -``````````````````````` -Jumpserver API Python SDK,Coco ç›®å‰ä½¿ç”¨è¯¥ SDK 与 Jumpserver API 交互。 - -`Github <https://github.com/jumpserver/jumpserver-python-sdk.git>`__ - - diff --git a/docs/admin_permission.rst b/docs/admin_permission.rst deleted file mode 100644 index 0bd5c3bde5c1fe91905c89547c9d2bbbc68b6c33..0000000000000000000000000000000000000000 --- a/docs/admin_permission.rst +++ /dev/null @@ -1,9 +0,0 @@ -æƒé™ç®¡ç†æ¨¡å— -============= - -这里介ç»æƒé™ç®¡ç†åŠŸèƒ½ã€‚ - -.. toctree:: - :maxdepth: 1 - - permission_asset_authorized diff --git a/docs/admin_session.rst b/docs/admin_session.rst deleted file mode 100644 index 90b38e4e8243e745c6c1afa0292a076602fe7517..0000000000000000000000000000000000000000 --- a/docs/admin_session.rst +++ /dev/null @@ -1,13 +0,0 @@ -会è¯ç®¡ç†æ¨¡å— -============== - -这里介ç»ä¼šè¯ç®¡ç†åŠŸèƒ½ã€‚ - -.. 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 deleted file mode 100644 index e6d6f4590c4c8b9878e09851caf54423cb5ff3ee..0000000000000000000000000000000000000000 --- a/docs/admin_system_settings.rst +++ /dev/null @@ -1,41 +0,0 @@ -系统设置 -============= - -这里介ç»ç³»ç»Ÿè®¾ç½®çš„功能。 - -.. 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 deleted file mode 100644 index 0d74b38b3c0d709f8d0fb2bd633d7fe2ca5d0d10..0000000000000000000000000000000000000000 --- a/docs/admin_user.rst +++ /dev/null @@ -1,11 +0,0 @@ -用户管ç†æ¨¡å— -============= - -这里介ç»ç”¨æˆ·ç®¡ç†åŠŸèƒ½ã€‚ - -.. toctree:: - :maxdepth: 1 - - 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 deleted file mode 100644 index a15e2095cb8fdef4ce0ffcc764155e3589de47a3..0000000000000000000000000000000000000000 --- a/docs/admin_work_center.rst +++ /dev/null @@ -1,9 +0,0 @@ -作业ä¸å¿ƒæ¨¡å— -============== - -这里介ç»ä½œä¸šä¸å¿ƒåŠŸèƒ½ã€‚ - -.. toctree:: - :maxdepth: 1 - - work_center_list \ No newline at end of file diff --git a/docs/api_style_guide.rst b/docs/api_style_guide.rst deleted file mode 100644 index ee0103afb12263f2c5eb085fb24c4455ec395677..0000000000000000000000000000000000000000 --- a/docs/api_style_guide.rst +++ /dev/null @@ -1,163 +0,0 @@ -REST API规范约定 ----------------- - -这里仅考虑 REST API 的基本情况。å‚考 - -`RESTful API 设计指å—`_ - -`Github API 文档`_ - -åè®® -~~~~ - -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):从æœåŠ¡å™¨åˆ 除资æºã€‚ - -.. _RESTful API 设计指å—: http://www.ruanyifeng.com/blog/2014/05/restful_api.html -.. _Github API 文档: https://developer.github.com/v3/ - - -è¿‡æ»¤ä¿¡æ¯ -~~~~~~~~ - -常è§å‚数约定 - -:: - - ?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。 \ No newline at end of file diff --git a/docs/asset_admin_user.rst b/docs/asset_admin_user.rst deleted file mode 100644 index 4ebebe8b53373246d14d498be58f4b18c7539064..0000000000000000000000000000000000000000 --- a/docs/asset_admin_user.rst +++ /dev/null @@ -1,35 +0,0 @@ -管ç†ç”¨æˆ· -========== - -这里介ç»ç®¡ç†ç”¨æˆ·çš„功能。 - -.. 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 deleted file mode 100644 index abc723df377a69b9f18cc9124571dbaf93373ecc..0000000000000000000000000000000000000000 --- a/docs/asset_label.rst +++ /dev/null @@ -1,34 +0,0 @@ -æ ‡ç¾ç®¡ç† -============ - -这里介ç»æ ‡ç¾ç®¡ç†çš„功能。 - -.. 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 deleted file mode 100644 index 3d1f75adce36e8218c455eba50ae6830f7e79809..0000000000000000000000000000000000000000 --- a/docs/asset_list.rst +++ /dev/null @@ -1,41 +0,0 @@ -资产列表 -=========== - -这里介ç»èµ„产列表的功能。 - -.. 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 deleted file mode 100644 index de695eeb823d67f7494dd3d7ef29e9631f00e3af..0000000000000000000000000000000000000000 --- a/docs/asset_system_user.rst +++ /dev/null @@ -1,34 +0,0 @@ -系统用户 -=========== - -这里介ç»ç³»ç»Ÿç”¨æˆ·åŠŸèƒ½ã€‚ - -.. 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 deleted file mode 100644 index 2012ac65ef0411d78c8d7f20ba976dcf0ace6dee..0000000000000000000000000000000000000000 --- a/docs/conf.py +++ /dev/null @@ -1,168 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/stable/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) -import sphinx_rtd_theme - - -# -- Project information ----------------------------------------------------- - -project = 'Jumpserver' -copyright = 'åŒ—äº¬å †æ ˆç§‘æŠ€æœ‰é™å…¬å¸ © 2014-2018' -author = 'Jumpserver team' - -# The short X.Y version -version = '' -# The full version, including alpha/beta/rc tags -release = '0.5.0' - - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.viewcode', - 'sphinx.ext.githubpages', -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = 'zh_CN' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path . -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' -html_show_sourcelink = False - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -# html_theme = 'alabaster' -html_theme = "sphinx_rtd_theme" -html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -html_theme_options = { - 'logo_only': True, - 'display_version': True -} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - - -# -- Options for HTMLHelp output --------------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = 'Jumpserver 文档' - - -# -- Options for LaTeX output ------------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'Jumpserver.tex', 'Jumpserver Documentation', - 'Jumpserver team', 'manual'), -] - - -# -- Options for manual page output ------------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'Jumpserver', 'Jumpserver Documentation', - [author], 1) -] - - -# -- Options for Texinfo output ---------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'Jumpserver', 'Jumpserver 文档', - author, 'Jumpserver', ' Jumpserver是全çƒé¦–款完全开æºçš„å ¡åž’æœºï¼Œæ˜¯ç¬¦åˆ 4A 的专业è¿ç»´å®¡è®¡ç³»ç»Ÿ', - 'Miscellaneous'), -] - - -# -- Extension configuration ------------------------------------------------- -html_logo = '_static/img/logo-text.png' diff --git a/docs/contact.rst b/docs/contact.rst deleted file mode 100644 index d7b8fb71e638f4568e9a21a25532588529a10a1e..0000000000000000000000000000000000000000 --- a/docs/contact.rst +++ /dev/null @@ -1,41 +0,0 @@ -è”ç³»æ–¹å¼ -+++++++++++++++++++++++++ - -å•†ä¸šæ”¯æŒ -~~~~~~~~~~~ - -`阿里云市场è´ä¹°: <https://market.aliyun.com/products/53690006/cmgj026011.html>`_ - - -QQ 群 -~~~~~~~~ - -群1: 390139816 (推è) - -群2: 399218702 (满) - -群3: 552054376 (满) - - -Github -~~~~~~~~ - -https://github.com/jumpserver/jumpserver.git - - -官网 -~~~~~~~~ - -http://www.jumpserver.org - - -Demo -~~~~~~~~ - -http://demo.jumpserver.org - - -邮件 -~~~~~~~~ - -support@fit2cloud.com (#替æ¢ä¸º@) \ No newline at end of file diff --git a/docs/contributor.rst b/docs/contributor.rst deleted file mode 100644 index 579d105f604e23a11602b947419db29245c7f868..0000000000000000000000000000000000000000 --- a/docs/contributor.rst +++ /dev/null @@ -1,17 +0,0 @@ -贡献者 -============= - -感谢以下朋å‹ä¸º Jumpserver åšå‡ºçš„è´¡çŒ®ï¼Œä¸–ç•Œå› ä½ ä»¬è€Œä¸åŒï¼ŒæŽ’åä¸åˆ†å…ˆåŽ - - -- **å°å½§ <æŽç£Š>** Django 资深开å‘者,为用户模å—贡献了很多代ç -- **sofia <周å°ä¾ >** 资深å‰ç«¯å·¥ç¨‹å¸ˆ, å‰ç«¯ä»£ç 贡献者 -- **liuz <刘æ£> å…¨æ ˆå·¥ç¨‹å¸ˆ** 编写了 Web Terminal 大部分代ç -- **jiaxiangkong <陈尚委>** Jumpserver 测试è¿è¥ -- **halcyon <王墉>** DevOps 资深开å‘者, 0.3.2 æ ¸å¿ƒå¼€å‘者之一 -- **yumaojun03 <喻茂峻>** DevOps 资深开å‘者,擅长 Pythonã€Go ä»¥åŠ PaaS å¹³å°å¼€å‘ -- **kelianchun <柯连春>** DevOps 资产开å‘者,修å¤äº†å¾ˆå¤š Bugs -- **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/development.rst b/docs/development.rst deleted file mode 100644 index 9e2411ea98c7eeec5438b89cbc7f01e25205e7d1..0000000000000000000000000000000000000000 --- a/docs/development.rst +++ /dev/null @@ -1,12 +0,0 @@ -å¼€å‘文档 -====================================== - -.. toctree:: - :maxdepth: 1 - :caption: å¼€å‘文档 - - api_style_guide - python_style_guide - project_structure - - diff --git a/docs/faq.rst b/docs/faq.rst deleted file mode 100644 index 90775dc54e4303443b03dafde5a7155dc621d833..0000000000000000000000000000000000000000 --- a/docs/faq.rst +++ /dev/null @@ -1,19 +0,0 @@ -FAQ -========== - -1. Windows æ— æ³•è¿žæŽ¥ - -:: - - (1). å¦‚æžœç™½å± å¯èƒ½æ˜¯nginx设置的ä¸å¯¹ï¼Œä¹Ÿå¯èƒ½è¿è¡Œguacamoleçš„docker容器有问题,总之请求到ä¸äº†guacamole - (2). 如果显示没有æƒé™ å¯èƒ½æ˜¯ä½ 在 终端管ç†é‡Œæ²¡æœ‰æŽ¥å— guacamole的注册,请接å—一下,如果还是ä¸è¡Œï¼Œå°±åˆ 除刚æ‰çš„注册,é‡å¯guacamoleçš„dockeré‡æ–°æ³¨å†Œ - (3). 如果显示未知问题 å¯èƒ½æ˜¯ä½ 的资产填写的端å£ä¸å¯¹ï¼Œæˆ–者授æƒçš„系统用户的åè®®ä¸æ˜¯rdp - - -2. 用户ã€ç³»ç»Ÿç”¨æˆ·ã€ç®¡ç†ç”¨æˆ·çš„关系 - -:: - - 用户:æ¯ä¸ªå…¬å¸çš„åŒäº‹åˆ›å»ºä¸€ä¸ªç”¨æˆ·è´¦å·ï¼Œç”¨æ¥ç™»å½•Jumpserver - 系统用户:使用æ¥ç™»å½•åˆ°æœåŠ¡å™¨çš„用户,如 web, dba, rootç‰ - 管ç†ç”¨æˆ·ï¼šæ˜¯æœåŠ¡å™¨ä¸Šå·²å˜åœ¨çš„特æƒç”¨æˆ·ï¼ŒAnsible用æ¥èŽ·å–硬件信æ¯, 如 root, 或者其它拥有 sudo NOPASSWD: ALLæƒé™çš„用户 diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index ac111c6902dee1669bb48585311a53306f26f755..0000000000000000000000000000000000000000 --- a/docs/index.rst +++ /dev/null @@ -1,22 +0,0 @@ -.. jumpserver documentation master file, created by - sphinx-quickstart on Mon Feb 26 23:28:27 2018. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Jumpserver 文档 -====================================== - -目录: - -.. toctree:: - :maxdepth: 2 - - introduce - installation - admin_guide - user_guide - development - contributor - contact - snapshot - faq diff --git a/docs/installation.rst b/docs/installation.rst deleted file mode 100644 index e9dde1f4848029d1153da8ba403737576a5ef411..0000000000000000000000000000000000000000 --- a/docs/installation.rst +++ /dev/null @@ -1,9 +0,0 @@ -安装文档 -++++++++++++++++++++++++ - -.. toctree:: - :maxdepth: 1 - - quickstart - step_by_step - upgrade diff --git a/docs/introduce.rst b/docs/introduce.rst deleted file mode 100644 index 910f21052769270683c16aaa1cae24356418cd4b..0000000000000000000000000000000000000000 --- a/docs/introduce.rst +++ /dev/null @@ -1,12 +0,0 @@ -æ€»ä½“ä»‹ç» -================== - -欢迎æ¥åˆ° 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 deleted file mode 100644 index 73debfa8a60ef8dec6d1be102720ec2ce1f6b674..0000000000000000000000000000000000000000 --- a/docs/login_log.rst +++ /dev/null @@ -1,6 +0,0 @@ -登录日志 -========== - -这里介ç»ç™»å½•æ—¥å¿—的功能。 - -点击页é¢å·¦ä¾§â€œç”¨æˆ·ç®¡ç†â€èœå•ä¸‹çš„“登录日志â€æŒ‰é’®ï¼Œè¿›å…¥ç™»å½•æ—¥å¿—页é¢ã€‚ \ No newline at end of file diff --git a/docs/permission_asset_authorized.rst b/docs/permission_asset_authorized.rst deleted file mode 100644 index 70e109b26942a8eae2b87dab5ae82d45e8d0d10e..0000000000000000000000000000000000000000 --- a/docs/permission_asset_authorized.rst +++ /dev/null @@ -1,34 +0,0 @@ -èµ„äº§æŽˆæƒ -========= - -这里介ç»èµ„产授æƒçš„相关的功能。 - -.. contents:: Topics - -.. _view_asset_authorized: - -查看资产授æƒè§„则列表 -```````````````````` - -资产授æƒé¡µé¢é»˜è®¤å±•ç¤ºèµ„产授æƒåˆ—è¡¨ã€‚ç‚¹å‡»å·¦ä¾§èµ„äº§èŠ‚ç‚¹æ ‘ä¸‹çš„èŠ‚ç‚¹ï¼Œå³ä¾§å±•ç¤ºæ¤èŠ‚点下的资产授æƒè§„则。 - -.. _create_asset_authorized: - -创建授æƒè§„则 -```````````` -åœ¨å·¦ä¾§èµ„äº§èŠ‚ç‚¹æ ‘ä¸‹é€‰æ‹©è¦åˆ›å»ºæŽˆæƒè§„则的节点,点击页é¢å³ä¾§åˆ›å»ºæŽˆæƒè§„则进入创建授æƒè§„则页é¢ï¼Œå¡«å†™æŽˆæƒè§„则信æ¯ï¼Œç‚¹å‡»æ交,完æˆåˆ›å»ºæŽˆæƒè§„则。 - -.. _update_asset_authorized: - -更新授æƒè§„则 -```````````` - -åœ¨å·¦ä¾§èµ„äº§èŠ‚ç‚¹æ ‘ä¸‹é€‰æ‹©è¦æ›´æ–°æŽˆæƒè§„则的节点,在å³ä¾§æŽˆæƒè§„则列表ä¸æ‰¾åˆ°è¦æ›´æ–°çš„授æƒè§„则,点击“动作â€æ ‡é¢˜ä¸‹çš„“更新â€æŒ‰é’®è¿›å…¥æŽˆæƒè§„则更新页é¢,填写授æƒè§„则信æ¯,点击æ交,完æˆåˆ›å»ºæŽˆæƒè§„则。 - -.. _delete_asset_authorized: - -åˆ é™¤æŽˆæƒè§„则 -```````````` - -åœ¨å·¦ä¾§èµ„äº§èŠ‚ç‚¹æ ‘ä¸‹é€‰æ‹©è¦åˆ 除授æƒè§„则的节点,在å³ä¾§æŽˆæƒè§„则列表ä¸æ‰¾åˆ°è¦åˆ 除的授æƒè§„则,点击“动作â€æ ‡é¢˜ä¸‹çš„â€œåˆ é™¤â€æŒ‰é’®ï¼Œå¼¹å‡ºç¡®è®¤åˆ 除页é¢ï¼Œç‚¹å‡»ç¡®è®¤ï¼Œå®Œæˆåˆ 除授æƒè§„则。 - diff --git a/docs/project_structure.rst b/docs/project_structure.rst deleted file mode 100644 index d809733a95c755c1e82740e862a51cf166ca60ce..0000000000000000000000000000000000000000 --- a/docs/project_structure.rst +++ /dev/null @@ -1,51 +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 // 项目模æ¿ç›®å½• \ No newline at end of file diff --git a/docs/python_style_guide.rst b/docs/python_style_guide.rst deleted file mode 100644 index d182a8dd205606c59eacdb5c21d0e68618e11ad7..0000000000000000000000000000000000000000 --- a/docs/python_style_guide.rst +++ /dev/null @@ -1,211 +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`_\ ,但是有些细节部分会尽é‡æ”¾å¼€ å‚考国内翻译 - -基本的代ç 布局 -~~~~~~~~~~~~~~ - -缩进 -^^^^^^^^ - -1. Python ä¸¥æ ¼é‡‡ç”¨4ä¸ªç©ºæ ¼çš„ç¼©è¿›ï¼Œä»»ä½• Python 代ç 都都必须éµå®ˆæ¤è§„定。 -2. Web 部分代ç (HTMLã€CSSã€JavaScript),Node.js 采用2ç©ºæ ¼ç¼©è¿›ï¼ŒåŒæ ·ä¸ä½¿ç”¨ TAB。 - 之所以与 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' - ] - -.. _Style Guidance: http://www.pocoo.org/internal/styleguide/ - - -空行 -^^^^^^ - -顶层函数与类之间空两行,æ¤å¤–都åªç©ºä¸€è¡Œã€‚ä¸è¦åœ¨ä»£ç ä¸ä½¿ç”¨å¤ªå¤šçš„空行æ¥åŒºåˆ†ä¸åŒçš„逻辑模å—。 - -:: - - 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) \ No newline at end of file diff --git a/docs/quickstart.rst b/docs/quickstart.rst deleted file mode 100644 index 58aac783cfa1b7af98159098c31949bb57f9ee02..0000000000000000000000000000000000000000 --- a/docs/quickstart.rst +++ /dev/null @@ -1,54 +0,0 @@ -快速安装 -========================== - -Jumpserver å°è£…了一个 All in one Docker,å¯ä»¥å¿«é€Ÿå¯åŠ¨ã€‚该镜åƒé›†æˆäº†æ‰€éœ€è¦çš„组件(Windows组件未暂未集æˆ),也支æŒä½¿ç”¨å¤–ç½® Database å’Œ Redis - -Tips: ä¸å»ºè®®åœ¨ç”Ÿäº§ä¸ä½¿ç”¨, 生产ä¸è¯·ä½¿ç”¨ 详细安装 `CentOS <step_by_step.html>`_ `Ubuntu <setup_by_ubuntu.html>`_ - - -Docker 安装è§: `Docker官方安装文档 <https://docs.docker.com/install/>`_ - - -快速å¯åŠ¨ -``````````````` -使用 root 命令行输入:: - - $ docker run -d -p 8080:80 -p 2222:2222 registry.jumpserver.org/public/jumpserver:1.0.0 - -访问 -``````````````` - -æµè§ˆå™¨è®¿é—®: http://<容器所在æœåŠ¡å™¨IP>:8080 - -SSH访问: ssh -p 2222 <容器所在æœåŠ¡å™¨IP> - -XShellç‰å·¥å…·è¯·æ·»åŠ connection连接 - - - -é¢å¤–环境å˜é‡ -``````````````` - -- DB_ENGINE = mysql -- DB_HOST = mysql_host -- DB_PORT = 3306 -- DB_USER = xxx -- DB_PASSWORD = xxxx -- DB_NAME = jumpserver - -- REDIS_HOST = <redis-host> -- REDIS_PORT = <redis-port> -- REDIS_PASSWORD = < - - :: - - 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:1.0.0 - - -ä»“åº“åœ°å€ -``````````````` - -https://github.com/jumpserver/Dockerfile - - - diff --git a/docs/session_command.rst b/docs/session_command.rst deleted file mode 100644 index a1296f86f1bee18f7739b4337ab5b6fdc3d6367d..0000000000000000000000000000000000000000 --- a/docs/session_command.rst +++ /dev/null @@ -1,30 +0,0 @@ -命令记录 -========= - -这里介ç»å‘½ä»¤è®°å½•åŠŸèƒ½ã€‚ - -点击页é¢å·¦ä¾§â€œä¼šè¯ç®¡ç†â€èœå•ä¸‹çš„“命令记录â€ï¼Œè¿›å…¥å‘½ä»¤è®°å½•åˆ—表页é¢ã€‚ - -.. contents:: Topics - -.. _view_command_session: - -查看命令记录 -````````````` - -命令记录页é¢é»˜è®¤å±•ç¤ºä¸€å‘¨å†…命令记录,页é¢å·¦ä¸Šè§’æ供起æ¢æ—¶é—´ã€ç”¨æˆ·ã€èµ„产ã€ç³»ç»Ÿç”¨æˆ·ç‰æœç´¢è¿‡æ»¤æ¡ä»¶ã€‚ - -.. _detial_command_invoke: - -查看命令执行详情 -```````````````` - -点击命令记录列表ä¸éœ€è¦æŸ¥çœ‹å‘½ä»¤æ‰§è¡Œè¯¦æƒ…的行,å³å¯æ˜¾ç¤ºå‘½ä»¤æ‰§è¡Œè¯¦æƒ…。 - -.. _detial_command_session: - -转到会è¯è¯¦æƒ… -````````````` - -在命令记录列表ä¸æ‰¾åˆ°éœ€è¦è½¬åˆ°ä¼šè¯è¯¦æƒ…的记录,点击“会è¯â€æ ‡é¢˜ä¸‹çš„“转到â€æŒ‰é’®ï¼Œå®Œæˆè½¬åˆ°ä¼šè¯è¯¦æƒ…。 - diff --git a/docs/session_history.rst b/docs/session_history.rst deleted file mode 100644 index c4b63231f0648ae13a9af457d4bb8296ace23d8a..0000000000000000000000000000000000000000 --- a/docs/session_history.rst +++ /dev/null @@ -1,22 +0,0 @@ -历å²ä¼šè¯ -========= - -这里介ç»åŽ†å²ä¼šè¯åŠŸèƒ½ã€‚ - -点击页é¢å·¦ä¾§â€œä¼šè¯ç®¡ç†â€èœå•ä¸‹çš„“历å²ä¼šè¯â€ï¼Œè¿›å…¥åŽ†å²ä¼šè¯åˆ—表页é¢ã€‚ - -.. 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 deleted file mode 100644 index 741725c1f5fd4f7afb33e3223d73ba0b18eae71f..0000000000000000000000000000000000000000 --- a/docs/session_online.rst +++ /dev/null @@ -1,25 +0,0 @@ -åœ¨çº¿ä¼šè¯ -========= - -这里介ç»åœ¨çº¿ä¼šè¯åŠŸèƒ½ã€‚ - -点击页é¢å·¦ä¾§â€œä¼šè¯ç®¡ç†â€èœå•ä¸‹çš„“在线会è¯â€ï¼Œè¿›å…¥åœ¨çº¿ä¼šè¯åˆ—表页é¢ã€‚ - -.. contents:: Topics - -.. _view_online_session: - -æŸ¥çœ‹åœ¨çº¿ä¼šè¯ -````````````` - -在线会è¯é¡µé¢é»˜è®¤å±•ç¤ºä¸€å‘¨å†…在线会è¯ï¼Œé¡µé¢å·¦ä¸Šè§’æ供起æ¢æ—¶é—´ã€ç”¨æˆ·ã€èµ„产ã€ç³»ç»Ÿç”¨æˆ·ç‰æœç´¢è¿‡æ»¤æ¡ä»¶ã€‚ - -.. _stop_online_session: - -终æ–åœ¨çº¿ä¼šè¯ -````````````` - -在在线会è¯åˆ—表ä¸æ‰¾åˆ°è¦ç»ˆæ¢çš„在线会è¯ï¼Œç‚¹å‡»åŠ¨ä½œæ ‡ç¾ä¸‹çš„“终æ–â€æŒ‰é’®ï¼Œå®Œæˆç»ˆæ–在线会è¯ã€‚ - - - diff --git a/docs/session_terminal.rst b/docs/session_terminal.rst deleted file mode 100644 index 3f749af5ca1be8fd3251a10230c0c36b36f246c1..0000000000000000000000000000000000000000 --- a/docs/session_terminal.rst +++ /dev/null @@ -1,29 +0,0 @@ -ç»ˆç«¯ç®¡ç† -========= - -这里介ç»ç»ˆç«¯ç®¡ç†åŠŸèƒ½ã€‚ - -点击页é¢å·¦ä¾§â€œä¼šè¯ç®¡ç†â€èœå•ä¸‹çš„“终端管ç†â€ï¼Œè¿›å…¥ç»ˆç«¯åˆ—表页é¢ã€‚ - -.. 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 deleted file mode 100644 index c388e44c418f4e4577aec31d91ce86523cd6e450..0000000000000000000000000000000000000000 --- a/docs/session_web_terminal.rst +++ /dev/null @@ -1,23 +0,0 @@ -Web终端 -========= - -这里介ç»Web终端功能。 - -点击页é¢å·¦ä¾§â€œä¼šè¯ç®¡ç†â€èœå•ä¸‹çš„“Web终端â€ï¼Œè¿›å…¥Web终端页é¢ã€‚ - -.. contents:: Topics - -.. _login: - -主机登录 -````````````` - -点解页é¢å·¦ä¾§çš„â€Web终端â€ï¼Œè¿›å…¥ä¸»æœºç™»å½•é¡µï¼Œç„¶åŽç‚¹å‡»é¡µé¢å³ä¾§çš„主机IP地å€ï¼Œè¿žæŽ¥ä¸»æœºï¼Œé¡µé¢å³ä¾§ä¼šå±•ç¤ºå½“å‰è¿žæŽ¥çš„终端信æ¯ã€‚ - -.. _logout: - -主机登出 -````````````` - -在主机登录页é¢ï¼Œé€‰æ‹©å·¦ä¸Šè§’的“æœåŠ¡å™¨â€æŒ‰é’®ï¼Œå‡ºçŽ°ä¸¤ä¸ªé€‰é¡¹ï¼Œä¸€ä¸ªâ€œæ–开链接“按钮,æ–开当å‰è¿žæŽ¥çš„主机;å¦ä¸€ä¸ªâ€æ–开所有链接“,æ–开当å‰æ‰€æœ‰è¿žæŽ¥çš„主机。 - diff --git a/docs/snapshot.rst b/docs/snapshot.rst deleted file mode 100644 index 7266495c3491aad0e09a78d9e6274bbcd85431d2..0000000000000000000000000000000000000000 --- a/docs/snapshot.rst +++ /dev/null @@ -1,27 +0,0 @@ -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 deleted file mode 100644 index 300e1a3a2506d33f1567113fe8c710086edb02b1..0000000000000000000000000000000000000000 --- a/docs/step_by_step.rst +++ /dev/null @@ -1,307 +0,0 @@ -一æ¥ä¸€æ¥å®‰è£… --------------------------- - -环境 -~~~~~~~ - -- 系统: CentOS 7 -- IP: 192.168.244.144 -- å…³é— selinux 和防ç«å¢™ - -:: - - # CentOS 7 - $ setenforce 0 # å¯ä»¥è®¾ç½®é…ç½®æ–‡ä»¶æ°¸ä¹…å…³é— - $ systemctl stop iptables.service - $ systemctl stop firewalld.service - - # CentOS6 - $ setenforce 0 - $ service iptables stop - -一. 准备 Python3 å’Œ Python 虚拟环境 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**1.1 安装ä¾èµ–包** - -:: - - $ yum -y install wget sqlite-devel xz gcc automake zlib-devel openssl-devel epel-release git - -**1.2 编译安装** - -:: - - $ wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz - $ tar xvf Python-3.6.1.tar.xz && cd Python-3.6.1 - $ ./configure && make && make install - -**1.3 建立 Python 虚拟环境** - -å› ä¸º CentOS 6/7 自带的是 Python2,而 Yum ç‰å·¥å…·ä¾èµ–原æ¥çš„ Python,为了ä¸æ‰°ä¹±åŽŸæ¥çš„环境我们æ¥ä½¿ç”¨ Python 虚拟环境 - -:: - - $ cd /opt - $ python3 -m venv py3 - $ source /opt/py3/bin/activate - - # 看到下é¢çš„æ示符代表æˆåŠŸï¼Œä»¥åŽè¿è¡Œ Jumpserver 都è¦å…ˆè¿è¡Œä»¥ä¸Š source 命令,以下所有命令å‡åœ¨è¯¥è™šæ‹ŸçŽ¯å¢ƒä¸è¿è¡Œ - (py3) [root@localhost py3] - -二. 安装 Jumpserver 1.0.0 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**2.1 下载或 Clone 项目** - -项目æ交较多 git clone æ—¶è¾ƒå¤§ï¼Œä½ å¯ä»¥é€‰æ‹©åŽ» Github 项目页é¢ç›´æŽ¥ä¸‹è½½zip包。 - -:: - - $ cd /opt/ - $ git clone --depth=1 https://github.com/jumpserver/jumpserver.git && cd jumpserver && git checkout master - -**2.2 安装ä¾èµ– RPM 包** - -:: - - $ cd /opt/jumpserver/requirements - $ yum -y install $(cat rpm_requirements.txt) # å¦‚æžœæ²¡æœ‰ä»»ä½•æŠ¥é”™è¯·ç»§ç» - -**2.3 安装 Python 库ä¾èµ–** - -:: - - $ pip install -r requirements.txt # ä¸è¦æŒ‡å®š-iå‚æ•°ï¼Œå› ä¸ºé•œåƒä¸Šå¯èƒ½æ²¡æœ‰æœ€æ–°çš„åŒ…ï¼Œå¦‚æžœæ²¡æœ‰ä»»ä½•æŠ¥é”™è¯·ç»§ç» - -**2.4 安装 Redis, Jumpserver 使用 Redis åš cache å’Œ celery broke** - -:: - - $ yum -y install redis - $ service redis start - -**2.5 安装 MySQL** - -本教程使用 Mysql 作为数æ®åº“,如果ä¸ä½¿ç”¨ Mysql å¯ä»¥è·³è¿‡ç›¸å…³ Mysql 安装和é…ç½® - -:: - - # centos7 - $ yum -y install mariadb mariadb-devel mariadb-server # centos7下安装的是mariadb - $ service mariadb start - - # centos6 - $ yum -y install mysql mysql-devel mysql-server - $ service mysqld start - -**2.6 创建数æ®åº“ Jumpserver 并授æƒ** - -:: - - $ mysql - > create database jumpserver default charset 'utf8'; - > grant all on jumpserver.* to 'jumpserver'@'127.0.0.1' identified by 'somepassword'; - -**2.7 修改 Jumpserver é…置文件** - -:: - - $ cd /opt/jumpserver - $ cp config_example.py config.py - $ vi config.py # 我们计划修改 DevelopmentConfigä¸çš„é…ç½®ï¼Œå› ä¸ºé»˜è®¤jumpserver是使用该é…置,它继承自Config - -**注æ„: é…置文件是 Python æ ¼å¼ï¼Œä¸è¦ç”¨ TAB,而è¦ç”¨ç©ºæ ¼** - -:: - - class DevelopmentConfig(Config): - DEBUG = True - DB_ENGINE = 'mysql' - DB_HOST = '127.0.0.1' - DB_PORT = 3306 - DB_USER = 'jumpserver' - DB_PASSWORD = 'somepassword' - DB_NAME = 'jumpserver' - - ... - - config = DevelopmentConfig() # ç¡®ä¿ä½¿ç”¨çš„是刚æ‰è®¾ç½®çš„é…置文件 - -**2.8 生æˆæ•°æ®åº“表结构和åˆå§‹åŒ–æ•°æ®** - -:: - - $ cd /opt/jumpserver/utils - $ bash make_migrations.sh - -**2.9 è¿è¡Œ Jumpserver** - -:: - - $ cd /opt/jumpserver - $ python run_server.py all - -è¿è¡Œä¸æŠ¥é”™ï¼Œè¯·æµè§ˆå™¨è®¿é—® http://192.168.244.144:8080/ -(这里åªæ˜¯ Jumpserver, 没有 Web Terminal,所以访问 Web Terminal 会报错) - -è´¦å·: admin 密ç : admin - -三. 安装 SSH Server å’Œ WebSocket Server: Coco -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -**3.1 下载或 Clone 项目** - -新开一个终端,连接测试机,别忘了 source /opt/py3/bin/activate - -:: - - $ cd /opt - $ git clone https://github.com/jumpserver/coco.git && cd coco && git checkout master - - -**3.2 安装ä¾èµ–** - -:: - - $ cd /opt/coco/requirements - $ yum -y install $(cat rpm_requirements.txt) - $ pip install -r requirements.txt - -**3.3 查看é…置文件并è¿è¡Œ** - -:: - - $ cd /opt/coco - $ cp conf_example.py conf.py - $ python run_server.py - -这时需è¦åŽ» Jumpserver 管ç†åŽå°-会è¯ç®¡ç†-终端管ç†ï¼ˆhttp://192.168.244.144:8080/terminal/terminal/ï¼‰æŽ¥å— Coco 的注册 - -:: - - Coco version 0.4.0, more see https://www.jumpserver.org - Starting ssh server at 0.0.0.0:2222 - Quit the server with CONTROL-C. - -**3.4 测试连接** - -:: - - $ ssh -p2222 admin@192.168.244.144 - 密ç : admin - - 如果是用在 Windows 下,Xshell Terminal 登录è¯æ³•å¦‚下 - $ssh admin@192.168.244.144 2222 - 密ç : admin - 如果能登陆代表部署æˆåŠŸ - -å››. 安装 Web Terminal å‰ç«¯: Luna -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Luna 已改为纯å‰ç«¯ï¼Œéœ€è¦ Nginx æ¥è¿è¡Œè®¿é—® - -访问(https://github.com/jumpserver/luna/releases)下载对应版本的 release 包,直接解压,ä¸éœ€è¦ç¼–译 - -4.1 解压 Luna - -:: - - $ pwd - /opt/ - - $ tar xvf luna.tar.gz - $ ls /opt/luna - ... - -五. 安装 Windows 支æŒç»„件 -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -å› ä¸ºæ‰‹åŠ¨å®‰è£… guacamole 组件比较å¤æ‚,这里æ供打包好的 docker 使用, å¯åŠ¨ guacamole - -.. code:: shell - - - # 注æ„:这里一定è¦æ”¹å†™ä¸€ä¸‹æœ¬æœºçš„IP地å€, å¦åˆ™ä¼šå‡ºé”™ - - docker run --name jms_guacamole -d \ - -p 8081:8080 -v /opt/guacamole/key:/config/guacamole/key \ - -e JUMPSERVER_KEY_DIR=/config/guacamole/key \ - -e JUMPSERVER_SERVER=http://<填写本机的IP地å€>:8080 \ - registry.jumpserver.org/public/guacamole:latest - -这里所需è¦æ³¨æ„的是 guacamole 暴露出æ¥çš„端å£æ˜¯ 8081,若与主机上其他端å£å†²çªè¯·è‡ªå®šä¹‰ä¸€ä¸‹ã€‚ - -å†æ¬¡å¼ºè°ƒï¼šä¿®æ”¹ JUMPSERVER_SERVER 环境å˜é‡çš„é…置,填上 Jumpserver 的内网地å€, 这时 -去 Jumpserver-会è¯ç®¡ç†-ç»ˆç«¯ç®¡ç† æŽ¥å—[Gua]开头的一个注册 - - - -å…. é…ç½® Nginx æ•´åˆå„组件 -~~~~~~~~~~~~~~~~~~~~~~~~~ - -6.1 安装 Nginx æ ¹æ®å–œå¥½é€‰æ‹©å®‰è£…æ–¹å¼å’Œç‰ˆæœ¬ - -.. code:: shell - - yum -y install nginx - - -6.2 准备é…置文件 修改 /etc/nginx/nginx.conf - - -:: - - server { - listen 80; - - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - - location /luna/ { - try_files $uri / /index.html; - alias /opt/luna/; - } - - location /media/ { - add_header Content-Encoding gzip; - root /opt/jumpserver/data/; - } - - location /static/ { - root /opt/jumpserver/data/; - } - - 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://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 / { - proxy_pass http://localhost:8080; - } - } - -6.3 è¿è¡Œ Nginx - -:: - - nginx -t - service nginx start - - -6.4 访问 http://192.168.244.144 diff --git a/docs/upgrade.rst b/docs/upgrade.rst deleted file mode 100644 index 2b423dfd52a7ebe7866a5529e6c66ef5529e5e58..0000000000000000000000000000000000000000 --- a/docs/upgrade.rst +++ /dev/null @@ -1,142 +0,0 @@ -æ›´æ–°å‡çº§ -------------- - -1. å‡çº§ Jumpserver - -:: - - $ git pull && pip install -r requirements/requirements.txt && cd utils && sh make_migrations.sh - -2. å‡çº§ Coco - -:: - - $ git pull && cd requirements && pip install -r requirements.txt # ä¸è¦æŒ‡å®š -iå‚æ•° - -3. å‡çº§ Luna - -é‡æ–°ä¸‹è½½ release 包(https://github.com/jumpserver/luna/releases) - -4. å‡çº§ guacamole - -:: - - $ docker pull registry.jumpserver.org/public/guacamole:latest - $ docker stop jms_guacamole # 或者写guacamole的容器ID - $ docker run --name jms_guacamole -d \ - -p 8081:8080 -v /opt/guacamole/key:/config/guacamole/key \ - -e JUMPSERVER_KEY_DIR=/config/guacamole/key \ - -e JUMPSERVER_SERVER=http://<填写本机的IP地å€>:8080 \ - registry.jumpserver.org/public/guacamole:latest - - -切æ¢åˆ†æ”¯æˆ–离线å‡çº§ -------------------------------- - - -**Jumpserver** - -说明: 以下æ“作,都在jumpserver所在目录è¿è¡Œ - -1. 备份é…置文件 - -:: - - $ jumpserver_backup=/tmp/jumpserver_backup - $ mkdir -p $jumpserver_backup - $ cp config.py $jumpserver_backup - -2. 备份migrations migrationsä¸å˜çš„是数æ®åº“表结构的å˜æ›´ï¼Œåˆ‡æ¢åˆ†æ”¯ä¼šä¸¢å¤± - -:: - - $ for app in common users assets ops perms terminal;do - mkdir -p $jumpserver_backup/${app}_migrations - cp apps/${app}/migrations/*.py $jumpserver_backup/${app}_migrations - done - - -3. 备份数æ®åº“,已被ä¸æ—¶ä¹‹éœ€ - -:: - - $ mysqldump -uä½ çš„æ•°æ®åº“è´¦å· -hæ•°æ®åº“åœ°å€ -p æ•°æ®åº“å称 > $jumpserver_backup/db_backup.sql - -4. 备份录åƒæ–‡ä»¶ - -:: - - $ cp -r data/media $jumpserver_backup/ - -5. 切æ¢åˆ†æ”¯æˆ–下载离线包, 更新代ç - -:: - - $ git checkout master # or other branch - - -6. 还原é…置文件 - -:: - - $ cp $jumpserver_backup/config.py . - -7. 还原数æ®åº“表结构记录 - -:: - - $ for app in common users assets ops perms terminal;do - cp $jumpserver_backup/${app}_migrations/*.py ${app}/migrations/ - done - -8. 还原录åƒæ–‡ä»¶ - -:: - - $ cp -r $jumpserver_backup/media/* data/media/ - -9. æ›´æ–°ä¾èµ–或表结构 - -:: - $ pip install -r requirements/requirements.txt && cd utils && sh make_migrations.sh - - -**Coco** - -说明: 以下æ“作都在 coco 项目所在目录 - -cocoæ˜¯æ— çŠ¶æ€çš„,备份 keys 目录å³å¯ - -1. 备份keys - -:: - - $ cp -r keys $jumpserver_backup/ - - -2. 离线更新å‡çº§coco - -3. 还原 keys目录 - -:: - - $ mv keys keys_backup - $ cp -r $jumpserver_backup/keys . - -4. å‡çº§ä¾èµ– - -:: - - $ git pull && cd requirements && pip install -r requirements.txt - - -**Luna** - -直接下载最新Release包替æ¢å³å¯ - - -**Guacamole** - -直接å‚考上é¢çš„å‡çº§å³å¯, 需è¦æ³¨æ„的是如果更æ¢æœºå™¨ï¼Œè¯·å¤‡ä»½ - - diff --git a/docs/user.rst b/docs/user.rst deleted file mode 100644 index c3bb1f61f71acf4a15f3ceebd050518281b0e4be..0000000000000000000000000000000000000000 --- a/docs/user.rst +++ /dev/null @@ -1,51 +0,0 @@ -用户列表 -======== - -这里介ç»ç”¨æˆ·åˆ—表的功能。 - -点击页é¢å·¦ä¾§â€œç”¨æˆ·åˆ—表â€èœå•ä¸‹çš„“用户列表“,进入用户列表页é¢ã€‚ - -.. 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_asset.rst b/docs/user_asset.rst deleted file mode 100644 index 71855f76e8dc7bdf982e9033db9c3806580bd2cc..0000000000000000000000000000000000000000 --- a/docs/user_asset.rst +++ /dev/null @@ -1,27 +0,0 @@ -个人资产 -========= - -这里介ç»ç”¨æˆ·ä¸ªäººèµ„产相关的功能。 - -.. contents:: Topics - -.. _view_personal_assets: - -查看个人资产 -```````````` - -登录个人用户,默认展示个人资产列表。点击主机å,查看资产的详细信æ¯ã€‚ - -.. _host_login: - -主机登录 -````````` - -点解页é¢å·¦ä¾§çš„"Web终端",进入主机登录页,然åŽç‚¹å‡»é¡µé¢å³ä¾§çš„主机IP地å€ï¼Œè¿žæŽ¥ä¸»æœºï¼Œé¡µé¢å³ä¾§ä¼šå±•ç¤ºå½“å‰è¿žæŽ¥çš„终端信æ¯ã€‚ - -.. _host_logout: - -主机登出 -````````` - -在主机登录页é¢ï¼Œé€‰æ‹©å·¦ä¸Šè§’的“æœåŠ¡å™¨â€æŒ‰é’®ï¼Œå‡ºçŽ°ä¸¤ä¸ªé€‰é¡¹ï¼Œä¸€ä¸ªâ€œæ–开链接“按钮,æ–开当å‰è¿žæŽ¥çš„主机;å¦ä¸€ä¸ªâ€æ–开所有链接“,æ–开当å‰æ‰€æœ‰è¿žæŽ¥çš„主机。 \ No newline at end of file diff --git a/docs/user_group.rst b/docs/user_group.rst deleted file mode 100644 index 90aca6c052d724819012540b46bc7356d681ef93..0000000000000000000000000000000000000000 --- a/docs/user_group.rst +++ /dev/null @@ -1,29 +0,0 @@ -用户组列表 -============ - -这里介ç»ç”¨æˆ·ç»„列表的功能。 - -点击页é¢å·¦ä¾§â€œç”¨æˆ·ç®¡ç†â€èœå•ä¸‹çš„â€ç”¨æˆ·ç»„“,进入用户组列表页é¢ã€‚ - -.. contents:: Topics - -.. _create_user_group: - -创建用户组 -`````````` - -点击页é¢å·¦ä¸Šè§’“创建用户组â€æŒ‰é’®ï¼Œè¿›å…¥åˆ›å»ºç”¨æˆ·ç»„页é¢ï¼Œå¡«å†™ç”¨æˆ·ç»„ä¿¡æ¯ï¼Œç‚¹å‡»â€œæ交â€æŒ‰é’®ï¼Œåˆ›å»ºç”¨æˆ·å®Œæˆã€‚ - -.. _update_user_group: - -更新用户组 -`````````` - -点击页é¢å³è¾¹çš„“更新â€æŒ‰é’®ï¼Œè¿›å…¥ç¼–辑用户组页é¢ï¼Œç¼–辑用户组信æ¯ï¼Œç‚¹å‡»â€œç¡®è®¤â€æŒ‰é’®ï¼Œæ›´æ–°ç”¨æˆ·ç»„完æˆã€‚ - -.. _delete_user_group: - -åˆ é™¤ç”¨æˆ·ç»„ -```````````` - -点击页é¢å³è¾¹çš„â€œåˆ é™¤â€æŒ‰é’®ï¼Œå¼¹å‡ºåˆ 除确认框,点击“确认â€æŒ‰é’®ï¼Œåˆ 除用户组完æˆã€‚ \ No newline at end of file diff --git a/docs/user_guide.rst b/docs/user_guide.rst deleted file mode 100644 index 97d9810b3caaf29e1fe76112c88e0c753bc3561a..0000000000000000000000000000000000000000 --- a/docs/user_guide.rst +++ /dev/null @@ -1,10 +0,0 @@ -用户使用文档 -============= - -这部分给您介ç»Jumpserver的用户管ç†æ¨¡å—的使用方法。 - -.. toctree:: - :maxdepth: 1 - - user_asset - user_info \ No newline at end of file diff --git a/docs/user_info.rst b/docs/user_info.rst deleted file mode 100644 index 23feb47541bd1eeb647e18076802941086dd835e..0000000000000000000000000000000000000000 --- a/docs/user_info.rst +++ /dev/null @@ -1,34 +0,0 @@ -ä¸ªäººä¿¡æ¯ -========= - -这里介ç»ä¸ªäººä¿¡æ¯ç›¸å…³çš„功能。 - -.. contents:: Topics - -.. _view_personal_info: - -æŸ¥çœ‹ä¸ªäººä¿¡æ¯ -```````````` - -点击页é¢å·¦ä¾§çš„“个人信æ¯â€ï¼ŒæŸ¥çœ‹ç”¨æˆ·çš„个人信æ¯ã€SSH密钥。 - -.. _modify_personal_info: - -ä¿®æ”¹ä¸ªäººä¿¡æ¯ -```````````` - -在个人信æ¯é¡µï¼Œç‚¹å‡»é¡µé¢å³ä¸Šè§’的“设置â€æŒ‰é’®ï¼Œè¿›å…¥ä¸ªäººä¿¡æ¯ä¿®æ”¹é¡µé¢ï¼Œå¡«å†™ä¸ªäººä¿¡æ¯ï¼Œç‚¹å‡»â€œæ交â€æŒ‰é’®ï¼Œå®Œæˆä¸ªäººä¿¡æ¯ä¿®æ”¹ã€‚ - -.. _update_password: - -更新密ç -````````` - -在个人信æ¯é¡µï¼Œç‚¹å‡»é¡µé¢å³ä¸Šè§’的“é‡ç½®å¯†ç “按钮,进入密ç 更新页é¢ï¼Œå¡«å†™åŽŸæ¥å¯†ç ã€æ–°å¯†ç ç‰ä¿¡æ¯ï¼Œç‚¹å‡»â€œæ交â€æŒ‰é’®ï¼Œå®Œæˆå¯†ç 更新。 - -.. _update_ssh_key: - -密钥更新 -````````` - -在个人信æ¯é¡µï¼Œç‚¹å‡»é¡µé¢å·¦ä¸Šè§’的“é‡ç½®SSH密钥“按钮,进入密钥更新页é¢ï¼Œå¡«å†™SSH公钥,点击“æ交â€æŒ‰é’®ï¼Œå®Œæˆå¯†é’¥æ›´æ–°ã€‚ \ No newline at end of file diff --git a/docs/work_center_list.rst b/docs/work_center_list.rst deleted file mode 100644 index 2ba982676a012b04763dc5e7f9fa75a7ce1f02c8..0000000000000000000000000000000000000000 --- a/docs/work_center_list.rst +++ /dev/null @@ -1,35 +0,0 @@ -任务列表 -========= - -这里介ç»ä»»åŠ¡åˆ—表的相关的功能。 - -.. contents:: Topics - -.. _view_asset_works: - -查看任务列表 -```````````` - -任务列表页é¢é»˜è®¤å±•ç¤ºä¸€å‘¨å†…æ‰€æœ‰ä»»åŠ¡ã€‚ç‚¹å‡»æ ‡é¢˜å¯æ ¹æ®å½“å‰å—段进行排åºã€‚ - -.. _invoke_asset_work: - -手动执行任务 -```````````` - -在任务列表ä¸æ‰¾åˆ°è¦æ‰‹åŠ¨æ‰§è¡Œçš„任务,点击“动作â€æ ‡é¢˜ä¸‹çš„“执行â€æŒ‰é’®ï¼Œå®Œæˆæ‰‹åŠ¨æ‰§è¡Œå½“å‰ä»»åŠ¡ã€‚ - -.. _delete_asset_work: - -åˆ é™¤ä»»åŠ¡ -````````` - -在任务列表ä¸æ‰¾åˆ°è¦åˆ 除的任务,点击“动作â€æ ‡é¢˜ä¸‹çš„â€œåˆ é™¤â€æŒ‰é’®ï¼Œå®Œæˆåˆ 除当å‰ä»»åŠ¡ã€‚ - -.. _detial_asset_work: - -查看任务详情 -````````````` - -在任务列表ä¸æ‰¾åˆ°è¦æŸ¥çœ‹çš„任务,点击è¦æŸ¥çœ‹çš„任务å称,å³å¯è¿›å…¥ä»»åŠ¡è¯¦æƒ…页é¢ã€‚ -