mirror of https://github.com/jumpserver/jumpserver
				
				
				
			feat: 添加远程应用
							parent
							
								
									3e7004d784
								
							
						
					
					
						commit
						943b130035
					
				| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
# Generated by Django 3.2.14 on 2022-10-21 07:06
 | 
			
		||||
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('assets', '0109_auto_20221019_2040'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.AddField(
 | 
			
		||||
            model_name='account',
 | 
			
		||||
            name='connectivity',
 | 
			
		||||
            field=models.CharField(choices=[('unknown', 'Unknown'), ('ok', 'Ok'), ('failed', 'Failed')], default='unknown', max_length=16, verbose_name='Connectivity'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AddField(
 | 
			
		||||
            model_name='account',
 | 
			
		||||
            name='date_verified',
 | 
			
		||||
            field=models.DateTimeField(null=True, verbose_name='Date verified'),
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			@ -3,7 +3,7 @@ from django.utils.translation import gettext_lazy as _
 | 
			
		|||
from simple_history.models import HistoricalRecords
 | 
			
		||||
 | 
			
		||||
from common.utils import lazyproperty
 | 
			
		||||
from .base import BaseAccount
 | 
			
		||||
from .base import BaseAccount, AbsConnectivity
 | 
			
		||||
 | 
			
		||||
__all__ = ['Account', 'AccountTemplate']
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +37,7 @@ class AccountHistoricalRecords(HistoricalRecords):
 | 
			
		|||
        return super().fields_included(model)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Account(BaseAccount):
 | 
			
		||||
class Account(AbsConnectivity, BaseAccount):
 | 
			
		||||
    class InnerAccount(models.TextChoices):
 | 
			
		||||
        INPUT = '@INPUT', '@INPUT'
 | 
			
		||||
        USER = '@USER', '@USER'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,7 +86,7 @@ class Protocol(models.Model):
 | 
			
		|||
        return '{}/{}'.format(self.name, self.port)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Asset(AbsConnectivity, NodesRelationMixin, JMSOrgBaseModel):
 | 
			
		||||
class Asset(NodesRelationMixin, AbsConnectivity, JMSOrgBaseModel):
 | 
			
		||||
    id = models.UUIDField(default=uuid.uuid4, primary_key=True)
 | 
			
		||||
    name = models.CharField(max_length=128, verbose_name=_('Name'))
 | 
			
		||||
    address = models.CharField(max_length=128, verbose_name=_('IP'), db_index=True)
 | 
			
		||||
| 
						 | 
				
			
			@ -100,6 +100,7 @@ class Asset(AbsConnectivity, NodesRelationMixin, JMSOrgBaseModel):
 | 
			
		|||
    labels = models.ManyToManyField('assets.Label', blank=True, related_name='assets', verbose_name=_("Labels"))
 | 
			
		||||
    comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
 | 
			
		||||
    info = models.JSONField(verbose_name='Info', default=dict, blank=True)
 | 
			
		||||
 | 
			
		||||
    objects = AssetManager.from_queryset(AssetQuerySet)()
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,10 +87,6 @@ class JMSBaseModel(BaseCreateUpdateModel):
 | 
			
		|||
        abstract = True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def concated_display(name1, name2):
 | 
			
		||||
    return Concat(F(name1), Value('('), F(name2), Value(')'))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def output_as_string(field_name):
 | 
			
		||||
    return ExpressionWrapper(F(field_name), output_field=models.CharField())
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1102,7 +1102,7 @@ msgstr "立刻推送"
 | 
			
		|||
 | 
			
		||||
#: assets/serializers/account/account.py:18
 | 
			
		||||
msgid "Has secret"
 | 
			
		||||
msgstr "有密码"
 | 
			
		||||
msgstr "存在密码"
 | 
			
		||||
 | 
			
		||||
#: assets/serializers/account/account.py:25
 | 
			
		||||
msgid "Account template not found"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,4 +15,5 @@ class OpsConfig(AppConfig):
 | 
			
		|||
        from .celery import signal_handler
 | 
			
		||||
        from . import signal_handlers
 | 
			
		||||
        from . import notifications
 | 
			
		||||
        from . import tasks
 | 
			
		||||
        super().ready()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -164,7 +164,7 @@ class BuiltinRole:
 | 
			
		|||
    @classmethod
 | 
			
		||||
    def sync_to_db(cls, show_msg=False):
 | 
			
		||||
        roles = cls.get_roles()
 | 
			
		||||
        print("\n\tUpdate builtin roles")
 | 
			
		||||
        print("  - Update builtin roles")
 | 
			
		||||
 | 
			
		||||
        for pre_role in roles.values():
 | 
			
		||||
            role, created = pre_role.update_or_create_role()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,7 @@ def after_migrate_update_builtin_role_permissions(sender, app_config, **kwargs):
 | 
			
		|||
    # 最后一个 app migrations 后执行, 更新内置角色的权限
 | 
			
		||||
    last_app = list(apps.get_app_configs())[-1]
 | 
			
		||||
    if app_config.name == last_app.name:
 | 
			
		||||
        print("\tAfter migration, update builtin role permissions")
 | 
			
		||||
        print("\nAfter migration, update builtin role permissions")
 | 
			
		||||
        BuiltinRole.sync_to_db()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,96 @@
 | 
			
		|||
# Generated by Django 3.2.14 on 2022-10-21 06:33
 | 
			
		||||
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
import django.db.models.deletion
 | 
			
		||||
import uuid
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('terminal', '0053_auto_20220830_1244'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.CreateModel(
 | 
			
		||||
            name='Applet',
 | 
			
		||||
            fields=[
 | 
			
		||||
                ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')),
 | 
			
		||||
                ('updated_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Updated by')),
 | 
			
		||||
                ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
 | 
			
		||||
                ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
 | 
			
		||||
                ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
 | 
			
		||||
                ('name', models.CharField(max_length=128, unique=True, verbose_name='Name')),
 | 
			
		||||
                ('version', models.CharField(max_length=16, verbose_name='Version')),
 | 
			
		||||
                ('type', models.CharField(choices=[('app', 'App'), ('web', 'Web')], max_length=16, verbose_name='Type')),
 | 
			
		||||
                ('icon', models.ImageField(upload_to='applet/icon', verbose_name='Icon')),
 | 
			
		||||
                ('author', models.CharField(max_length=128, verbose_name='Author')),
 | 
			
		||||
                ('protocols', models.JSONField(default=list, verbose_name='Protocol')),
 | 
			
		||||
                ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
 | 
			
		||||
            ],
 | 
			
		||||
            options={
 | 
			
		||||
                'abstract': False,
 | 
			
		||||
            },
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.CreateModel(
 | 
			
		||||
            name='AppletProvider',
 | 
			
		||||
            fields=[
 | 
			
		||||
                ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')),
 | 
			
		||||
                ('updated_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Updated by')),
 | 
			
		||||
                ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
 | 
			
		||||
                ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
 | 
			
		||||
                ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
 | 
			
		||||
                ('name', models.CharField(max_length=128, unique=True, verbose_name='Name')),
 | 
			
		||||
                ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
 | 
			
		||||
                ('account_automation', models.BooleanField(default=False, verbose_name='Account automation')),
 | 
			
		||||
                ('date_synced', models.DateTimeField(blank=True, null=True, verbose_name='Date synced')),
 | 
			
		||||
                ('status', models.CharField(max_length=16, verbose_name='Status')),
 | 
			
		||||
            ],
 | 
			
		||||
            options={
 | 
			
		||||
                'abstract': False,
 | 
			
		||||
            },
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.CreateModel(
 | 
			
		||||
            name='ProviderDeployment',
 | 
			
		||||
            fields=[
 | 
			
		||||
                ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')),
 | 
			
		||||
                ('updated_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Updated by')),
 | 
			
		||||
                ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
 | 
			
		||||
                ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
 | 
			
		||||
                ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
 | 
			
		||||
                ('status', models.CharField(max_length=16, verbose_name='Status')),
 | 
			
		||||
                ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
 | 
			
		||||
                ('provider', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='terminal.appletprovider', verbose_name='Provider')),
 | 
			
		||||
            ],
 | 
			
		||||
            options={
 | 
			
		||||
                'abstract': False,
 | 
			
		||||
            },
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.CreateModel(
 | 
			
		||||
            name='AppletPublication',
 | 
			
		||||
            fields=[
 | 
			
		||||
                ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')),
 | 
			
		||||
                ('updated_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Updated by')),
 | 
			
		||||
                ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
 | 
			
		||||
                ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
 | 
			
		||||
                ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
 | 
			
		||||
                ('status', models.CharField(max_length=16, verbose_name='Status')),
 | 
			
		||||
                ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
 | 
			
		||||
                ('applet', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='terminal.applet', verbose_name='Applet')),
 | 
			
		||||
                ('provider', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='terminal.appletprovider', verbose_name='Provider')),
 | 
			
		||||
            ],
 | 
			
		||||
            options={
 | 
			
		||||
                'unique_together': {('applet', 'provider')},
 | 
			
		||||
            },
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AddField(
 | 
			
		||||
            model_name='appletprovider',
 | 
			
		||||
            name='applets',
 | 
			
		||||
            field=models.ManyToManyField(through='terminal.AppletPublication', to='terminal.Applet', verbose_name='Applet'),
 | 
			
		||||
        ),
 | 
			
		||||
        migrations.AddField(
 | 
			
		||||
            model_name='appletprovider',
 | 
			
		||||
            name='asset',
 | 
			
		||||
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='assets.asset', verbose_name='Asset'),
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			@ -1,9 +1,3 @@
 | 
			
		|||
from .command import *
 | 
			
		||||
from .session import *
 | 
			
		||||
from .status import *
 | 
			
		||||
from .storage import *
 | 
			
		||||
from .task import *
 | 
			
		||||
from .terminal import *
 | 
			
		||||
from .sharing import *
 | 
			
		||||
from .replay import *
 | 
			
		||||
from .endpoint import *
 | 
			
		||||
from .component import *
 | 
			
		||||
from .applet import *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
from .applet import *
 | 
			
		||||
from .provider import *
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
from django.db import models
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from common.db.models import JMSBaseModel
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
__all__ = ['Applet', 'AppletPublication']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Applet(JMSBaseModel):
 | 
			
		||||
    class Type(models.TextChoices):
 | 
			
		||||
        app = 'app', _('App')
 | 
			
		||||
        web = 'web', _('Web')
 | 
			
		||||
    name = models.CharField(max_length=128, verbose_name=_('Name'), unique=True)
 | 
			
		||||
    version = models.CharField(max_length=16, verbose_name=_('Version'))
 | 
			
		||||
    type = models.CharField(max_length=16, choices=Type.choices, verbose_name=_('Type'))
 | 
			
		||||
    icon = models.ImageField(upload_to='applet/icon', verbose_name=_('Icon'))
 | 
			
		||||
    author = models.CharField(max_length=128, verbose_name=_('Author'))
 | 
			
		||||
    protocols = models.JSONField(default=list, verbose_name=_('Protocol'))
 | 
			
		||||
    comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.name
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AppletPublication(JMSBaseModel):
 | 
			
		||||
    applet = models.ForeignKey('Applet', on_delete=models.PROTECT, verbose_name=_('Applet'))
 | 
			
		||||
    provider = models.ForeignKey('AppletProvider', on_delete=models.PROTECT, verbose_name=_('Provider'))
 | 
			
		||||
    status = models.CharField(max_length=16, verbose_name=_('Status'))
 | 
			
		||||
    comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        unique_together = ('applet', 'provider')
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
from django.db import models
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from celery import current_app
 | 
			
		||||
 | 
			
		||||
from common.db.models import JMSBaseModel
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
__all__ = ['AppletProvider', 'ProviderDeployment']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AppletProvider(JMSBaseModel):
 | 
			
		||||
    name = models.CharField(max_length=128, verbose_name=_('Name'), unique=True)
 | 
			
		||||
    asset = models.ForeignKey('assets.Asset', on_delete=models.PROTECT, verbose_name=_('Asset'))
 | 
			
		||||
    comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
 | 
			
		||||
    account_automation = models.BooleanField(default=False, verbose_name=_('Account automation'))
 | 
			
		||||
    date_synced = models.DateTimeField(null=True, blank=True, verbose_name=_('Date synced'))
 | 
			
		||||
    status = models.CharField(max_length=16, verbose_name=_('Status'))
 | 
			
		||||
    applets = models.ManyToManyField(
 | 
			
		||||
        'Applet', verbose_name=_('Applet'),
 | 
			
		||||
        through='AppletPublication',  through_fields=('provider', 'applet'),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ProviderDeployment(JMSBaseModel):
 | 
			
		||||
    provider = models.ForeignKey('AppletProvider', on_delete=models.CASCADE, verbose_name=_('Provider'))
 | 
			
		||||
    status = models.CharField(max_length=16, verbose_name=_('Status'))
 | 
			
		||||
    comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
 | 
			
		||||
 | 
			
		||||
    def install(self):
 | 
			
		||||
        pass
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
from .terminal import *
 | 
			
		||||
from .task import *
 | 
			
		||||
from .endpoint import *
 | 
			
		||||
from .status import *
 | 
			
		||||
from .storage import *
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
from django.db import models
 | 
			
		||||
from django.utils.translation import ugettext_lazy as _
 | 
			
		||||
from django.core.validators import MinValueValidator, MaxValueValidator
 | 
			
		||||
 | 
			
		||||
from common.db.models import JMSBaseModel
 | 
			
		||||
from common.db.fields import PortField
 | 
			
		||||
from common.utils.ip import contains_ip
 | 
			
		||||
| 
						 | 
				
			
			@ -1,22 +1,21 @@
 | 
			
		|||
from __future__ import unicode_literals
 | 
			
		||||
 | 
			
		||||
import copy
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
from importlib import import_module
 | 
			
		||||
 | 
			
		||||
import jms_storage
 | 
			
		||||
from django.db import models
 | 
			
		||||
from django.utils.translation import ugettext_lazy as _
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
 | 
			
		||||
from common.mixins import CommonModelMixin
 | 
			
		||||
from common.utils import get_logger
 | 
			
		||||
from common.db.fields import EncryptJsonDictTextField
 | 
			
		||||
from common.utils.timezone import local_now_date_display
 | 
			
		||||
from terminal.backends import TYPE_ENGINE_MAPPING
 | 
			
		||||
from .terminal import Terminal
 | 
			
		||||
from .command import Command
 | 
			
		||||
from .. import const
 | 
			
		||||
from ..session.command import Command
 | 
			
		||||
from terminal import const
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
logger = get_logger(__file__)
 | 
			
		||||
| 
						 | 
				
			
			@ -9,9 +9,9 @@ from common.utils import get_logger
 | 
			
		|||
from users.models import User
 | 
			
		||||
from orgs.utils import tmp_to_root_org
 | 
			
		||||
from .status import Status
 | 
			
		||||
from .. import const
 | 
			
		||||
from ..const import ComponentStatusChoices as StatusChoice
 | 
			
		||||
from .session import Session
 | 
			
		||||
from terminal import const
 | 
			
		||||
from terminal.const import ComponentStatusChoices as StatusChoice
 | 
			
		||||
from ..session import Session
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
logger = get_logger(__file__)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
from .command import *
 | 
			
		||||
from .session import *
 | 
			
		||||
from .replay import *
 | 
			
		||||
from .sharing import *
 | 
			
		||||
| 
						 | 
				
			
			@ -4,7 +4,7 @@ from django.db import models
 | 
			
		|||
from django.db.models.signals import post_save
 | 
			
		||||
from django.utils.translation import ugettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from ..backends.command.models import AbstractSessionCommand
 | 
			
		||||
from terminal.backends.command.models import AbstractSessionCommand
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CommandManager(models.Manager):
 | 
			
		||||
| 
						 | 
				
			
			@ -16,7 +16,7 @@ from users.models import User
 | 
			
		|||
from orgs.mixins.models import OrgModelMixin
 | 
			
		||||
from django.db.models import TextChoices
 | 
			
		||||
from common.utils import get_object_or_none, lazyproperty
 | 
			
		||||
from ..backends import get_multi_command_storage
 | 
			
		||||
from terminal.backends import get_multi_command_storage
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Session(OrgModelMixin):
 | 
			
		||||
		Loading…
	
		Reference in New Issue