feat: 添加远程应用

pull/8991/head
ibuler 2022-10-22 11:17:02 +08:00
parent 3e7004d784
commit 943b130035
24 changed files with 213 additions and 27 deletions

View File

@ -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'),
),
]

View File

@ -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'

View File

@ -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):

View File

@ -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())

View File

@ -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"

View File

@ -15,4 +15,5 @@ class OpsConfig(AppConfig):
from .celery import signal_handler
from . import signal_handlers
from . import notifications
from . import tasks
super().ready()

View File

@ -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()

View File

@ -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()

View File

@ -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'),
),
]

View File

@ -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 *

View File

@ -0,0 +1,2 @@
from .applet import *
from .provider import *

View File

@ -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')

View File

@ -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

View File

@ -0,0 +1,5 @@
from .terminal import *
from .task import *
from .endpoint import *
from .status import *
from .storage import *

View File

@ -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

View File

@ -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__)

View 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__)

View File

@ -0,0 +1,4 @@
from .command import *
from .session import *
from .replay import *
from .sharing import *

View File

@ -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):

View File

@ -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):