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 simple_history.models import HistoricalRecords
|
||||||
|
|
||||||
from common.utils import lazyproperty
|
from common.utils import lazyproperty
|
||||||
from .base import BaseAccount
|
from .base import BaseAccount, AbsConnectivity
|
||||||
|
|
||||||
__all__ = ['Account', 'AccountTemplate']
|
__all__ = ['Account', 'AccountTemplate']
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ class AccountHistoricalRecords(HistoricalRecords):
|
||||||
return super().fields_included(model)
|
return super().fields_included(model)
|
||||||
|
|
||||||
|
|
||||||
class Account(BaseAccount):
|
class Account(AbsConnectivity, BaseAccount):
|
||||||
class InnerAccount(models.TextChoices):
|
class InnerAccount(models.TextChoices):
|
||||||
INPUT = '@INPUT', '@INPUT'
|
INPUT = '@INPUT', '@INPUT'
|
||||||
USER = '@USER', '@USER'
|
USER = '@USER', '@USER'
|
||||||
|
|
|
@ -86,7 +86,7 @@ class Protocol(models.Model):
|
||||||
return '{}/{}'.format(self.name, self.port)
|
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)
|
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
|
||||||
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
name = models.CharField(max_length=128, verbose_name=_('Name'))
|
||||||
address = models.CharField(max_length=128, verbose_name=_('IP'), db_index=True)
|
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"))
|
labels = models.ManyToManyField('assets.Label', blank=True, related_name='assets', verbose_name=_("Labels"))
|
||||||
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
|
comment = models.TextField(default='', blank=True, verbose_name=_('Comment'))
|
||||||
info = models.JSONField(verbose_name='Info', default=dict, blank=True)
|
info = models.JSONField(verbose_name='Info', default=dict, blank=True)
|
||||||
|
|
||||||
objects = AssetManager.from_queryset(AssetQuerySet)()
|
objects = AssetManager.from_queryset(AssetQuerySet)()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|
|
@ -87,10 +87,6 @@ class JMSBaseModel(BaseCreateUpdateModel):
|
||||||
abstract = True
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
def concated_display(name1, name2):
|
|
||||||
return Concat(F(name1), Value('('), F(name2), Value(')'))
|
|
||||||
|
|
||||||
|
|
||||||
def output_as_string(field_name):
|
def output_as_string(field_name):
|
||||||
return ExpressionWrapper(F(field_name), output_field=models.CharField())
|
return ExpressionWrapper(F(field_name), output_field=models.CharField())
|
||||||
|
|
||||||
|
|
|
@ -1102,7 +1102,7 @@ msgstr "立刻推送"
|
||||||
|
|
||||||
#: assets/serializers/account/account.py:18
|
#: assets/serializers/account/account.py:18
|
||||||
msgid "Has secret"
|
msgid "Has secret"
|
||||||
msgstr "有密码"
|
msgstr "存在密码"
|
||||||
|
|
||||||
#: assets/serializers/account/account.py:25
|
#: assets/serializers/account/account.py:25
|
||||||
msgid "Account template not found"
|
msgid "Account template not found"
|
||||||
|
|
|
@ -15,4 +15,5 @@ class OpsConfig(AppConfig):
|
||||||
from .celery import signal_handler
|
from .celery import signal_handler
|
||||||
from . import signal_handlers
|
from . import signal_handlers
|
||||||
from . import notifications
|
from . import notifications
|
||||||
|
from . import tasks
|
||||||
super().ready()
|
super().ready()
|
||||||
|
|
|
@ -164,7 +164,7 @@ class BuiltinRole:
|
||||||
@classmethod
|
@classmethod
|
||||||
def sync_to_db(cls, show_msg=False):
|
def sync_to_db(cls, show_msg=False):
|
||||||
roles = cls.get_roles()
|
roles = cls.get_roles()
|
||||||
print("\n\tUpdate builtin roles")
|
print(" - Update builtin roles")
|
||||||
|
|
||||||
for pre_role in roles.values():
|
for pre_role in roles.values():
|
||||||
role, created = pre_role.update_or_create_role()
|
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 后执行, 更新内置角色的权限
|
# 最后一个 app migrations 后执行, 更新内置角色的权限
|
||||||
last_app = list(apps.get_app_configs())[-1]
|
last_app = list(apps.get_app_configs())[-1]
|
||||||
if app_config.name == last_app.name:
|
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()
|
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 .session import *
|
||||||
from .status import *
|
from .component import *
|
||||||
from .storage import *
|
from .applet import *
|
||||||
from .task import *
|
|
||||||
from .terminal import *
|
|
||||||
from .sharing import *
|
|
||||||
from .replay import *
|
|
||||||
from .endpoint 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.db import models
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.core.validators import MinValueValidator, MaxValueValidator
|
from django.core.validators import MinValueValidator, MaxValueValidator
|
||||||
|
|
||||||
from common.db.models import JMSBaseModel
|
from common.db.models import JMSBaseModel
|
||||||
from common.db.fields import PortField
|
from common.db.fields import PortField
|
||||||
from common.utils.ip import contains_ip
|
from common.utils.ip import contains_ip
|
|
@ -1,22 +1,21 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import copy
|
import copy
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
|
|
||||||
import jms_storage
|
import jms_storage
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
from common.mixins import CommonModelMixin
|
from common.mixins import CommonModelMixin
|
||||||
from common.utils import get_logger
|
from common.utils import get_logger
|
||||||
from common.db.fields import EncryptJsonDictTextField
|
from common.db.fields import EncryptJsonDictTextField
|
||||||
from common.utils.timezone import local_now_date_display
|
from common.utils.timezone import local_now_date_display
|
||||||
from terminal.backends import TYPE_ENGINE_MAPPING
|
from terminal.backends import TYPE_ENGINE_MAPPING
|
||||||
from .terminal import Terminal
|
from .terminal import Terminal
|
||||||
from .command import Command
|
from ..session.command import Command
|
||||||
from .. import const
|
from terminal import const
|
||||||
|
|
||||||
|
|
||||||
logger = get_logger(__file__)
|
logger = get_logger(__file__)
|
|
@ -9,9 +9,9 @@ from common.utils import get_logger
|
||||||
from users.models import User
|
from users.models import User
|
||||||
from orgs.utils import tmp_to_root_org
|
from orgs.utils import tmp_to_root_org
|
||||||
from .status import Status
|
from .status import Status
|
||||||
from .. import const
|
from terminal import const
|
||||||
from ..const import ComponentStatusChoices as StatusChoice
|
from terminal.const import ComponentStatusChoices as StatusChoice
|
||||||
from .session import Session
|
from ..session import Session
|
||||||
|
|
||||||
|
|
||||||
logger = get_logger(__file__)
|
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.db.models.signals import post_save
|
||||||
from django.utils.translation import ugettext_lazy as _
|
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):
|
class CommandManager(models.Manager):
|
|
@ -16,7 +16,7 @@ from users.models import User
|
||||||
from orgs.mixins.models import OrgModelMixin
|
from orgs.mixins.models import OrgModelMixin
|
||||||
from django.db.models import TextChoices
|
from django.db.models import TextChoices
|
||||||
from common.utils import get_object_or_none, lazyproperty
|
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):
|
class Session(OrgModelMixin):
|
Loading…
Reference in New Issue