perf: 修改 terminal session

pull/8873/head
ibuler 2022-08-24 16:14:32 +08:00
parent dca1388a67
commit 063c42b94d
29 changed files with 167 additions and 283 deletions

View File

@ -9,7 +9,7 @@ class Migration(migrations.Migration):
('applications', '0022_auto_20220817_1346'),
('perms', '0031_auto_20220816_1600'),
('ops', '0022_auto_20220817_1346'),
('assets', '0109_auto_20220817_1544'),
('assets', '0105_auto_20220817_1544'),
('tickets', '0020_auto_20220817_1346'),
]

View File

@ -5,7 +5,7 @@ from common.tree import TreeNode
__all__ = [
'Category', 'HostTypes', 'NetworkTypes', 'DatabaseTypes',
'Category', 'HostTypes', 'NetworkingTypes', 'DatabaseTypes',
'WebTypes', 'CloudTypes', 'Protocol', 'AllTypes',
]
@ -26,7 +26,7 @@ class PlatformMixin:
class Category(PlatformMixin, ChoicesMixin, models.TextChoices):
HOST = 'host', _('Host')
NETWORK = 'network', _("NetworkDevice")
NETWORKING = 'networking', _("NetworkDevice")
DATABASE = 'database', _("Database")
CLOUD = 'cloud', _("Clouding")
WEB = 'web', _("Web")
@ -42,7 +42,7 @@ class Category(PlatformMixin, ChoicesMixin, models.TextChoices):
'has_create_account': True,
'_protocols': ['ssh', 'telnet']
},
cls.NETWORK: {
cls.NETWORKING: {
'has_domain': True,
'_protocols': ['ssh', 'telnet']
},
@ -84,7 +84,7 @@ class HostTypes(PlatformMixin, ChoicesMixin, models.TextChoices):
}
class NetworkTypes(PlatformMixin, ChoicesMixin, models.TextChoices):
class NetworkingTypes(PlatformMixin, ChoicesMixin, models.TextChoices):
SWITCH = 'switch', _("Switch")
ROUTER = 'router', _("Router")
FIREWALL = 'firewall', _("Firewall")
@ -121,7 +121,7 @@ class CloudTypes(PlatformMixin, ChoicesMixin, models.TextChoices):
class AllTypes(ChoicesMixin, metaclass=IncludesTextChoicesMeta):
choices: list
includes = [
HostTypes, NetworkTypes, DatabaseTypes,
HostTypes, NetworkingTypes, DatabaseTypes,
WebTypes, CloudTypes
]
@ -150,7 +150,7 @@ class AllTypes(ChoicesMixin, metaclass=IncludesTextChoicesMeta):
def category_types(cls):
return (
(Category.HOST, HostTypes),
(Category.NETWORK, NetworkTypes),
(Category.NETWORKING, NetworkingTypes),
(Category.DATABASE, DatabaseTypes),
(Category.WEB, WebTypes),
(Category.CLOUD, CloudTypes)
@ -217,6 +217,8 @@ class Protocol(ChoicesMixin, models.TextChoices):
mongodb = 'mongodb', 'MongoDB'
k8s = 'k8s', 'K8S'
http = 'http', 'HTTP'
https = 'https', 'HTTPS'
@classmethod
def host_protocols(cls):
@ -245,6 +247,9 @@ class Protocol(ChoicesMixin, models.TextChoices):
cls.mongodb: 27017,
cls.redis: 6379,
cls.k8s: 0
cls.k8s: 0,
cls.http: 80,
cls.https: 443
}

View File

@ -1,26 +0,0 @@
# Generated by Django 3.1.14 on 2022-04-06 07:41
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('assets', '0094_auto_20220402_1736'),
]
operations = [
migrations.AddField(
model_name='asset',
name='category',
field=models.CharField(choices=[('host', 'Host'), ('network', 'Networking'), ('database', 'Database'), ('remote_app', 'Remote app'), ('cloud', 'Clouding')], default='host', max_length=16, verbose_name='Category'),
preserve_default=False,
),
migrations.AddField(
model_name='asset',
name='type',
field=models.CharField(choices=[('linux', 'Linux'), ('windows', 'Windows'), ('unix', 'Unix'), ('bsd', 'BSD'), ('macos', 'MacOS'), ('mainframe', 'Mainframe'), ('other_host', 'Other host'), ('switch', 'Switch'), ('router', 'Router'), ('firewall', 'Firewall'), ('other_network', 'Other device'), ('mysql', 'MySQL'), ('mariadb', 'MariaDB'), ('postgresql', 'PostgreSQL'), ('oracle', 'Oracle'), ('sqlserver', 'SQLServer'), ('mongodb', 'MongoDB'), ('redis', 'Redis'), ('chrome', 'Chrome'), ('vmware_client', 'vSphere client'), ('mysql_workbench', 'MySQL workbench'), ('general_remote_app', 'Custom'), ('k8s', 'Kubernetes')], max_length=128, verbose_name='Type'),
preserve_default=False,
),
]

View File

@ -14,7 +14,7 @@ def migrate_platform_type_to_lower(apps, *args):
class Migration(migrations.Migration):
dependencies = [
('assets', '0096_auto_20220406_1546'),
('assets', '0094_auto_20220402_1736'),
]
operations = [
@ -26,8 +26,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='platform',
name='category',
field=models.CharField(default='host', max_length=16, verbose_name='Category'),
preserve_default=False,
field=models.CharField(default='host', max_length=32, verbose_name='Category'),
),
migrations.AlterField(
model_name='platform',

View File

@ -1,15 +0,0 @@
# Generated by Django 3.1.14 on 2022-04-06 07:46
from itertools import groupby
from django.db import migrations
from django.db.models import F
class Migration(migrations.Migration):
dependencies = [
('assets', '0095_auto_20220406_1541'),
]
operations = [
]

View File

@ -7,7 +7,7 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('assets', '0097_auto_20220407_1726'),
('assets', '0095_auto_20220407_1726'),
]
operations = [
@ -23,7 +23,7 @@ class Migration(migrations.Migration):
bases=('assets.asset',),
),
migrations.CreateModel(
name='Network',
name='Networking',
fields=[
('asset_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.asset')),
],
@ -32,19 +32,6 @@ class Migration(migrations.Migration):
},
bases=('assets.asset',),
),
migrations.CreateModel(
name='RemoteApp',
fields=[
('asset_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.asset')),
('connect_host', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.host')),
('app_path', models.CharField(max_length=1024, verbose_name='App path')),
('attrs', models.JSONField(default=dict, verbose_name='Attrs')),
],
options={
'abstract': False,
},
bases=('assets.asset',),
),
migrations.CreateModel(
name='Cloud',
fields=[
@ -56,4 +43,15 @@ class Migration(migrations.Migration):
},
bases=('assets.asset',),
),
migrations.CreateModel(
name='Web',
fields=[
('asset_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.asset')),
('url', models.CharField(max_length=1024, verbose_name='url')),
],
options={
'abstract': False,
},
bases=('assets.asset',),
),
]

View File

@ -57,7 +57,6 @@ def migrate_database_to_asset(apps, *args):
db = db_model(
id=app.id, hostname=app.name, ip=attrs['host'],
protocols='{}/{}'.format(app.type, attrs['port']),
category='database', type=app.type,
db_name=attrs['database'] or '',
platform=platforms_map[app.type],
org_id=app.org_id
@ -69,48 +68,48 @@ def migrate_database_to_asset(apps, *args):
failed_apps.append(app)
pass
def migrate_remote_app_to_asset(apps, *args):
app_model = apps.get_model('applications', 'Application')
remote_app_model = apps.get_model('assets', 'RemoteApp')
host_model = apps.get_model('assets', 'Host')
platform_model = apps.get_model('assets', 'Platform')
applications = app_model.objects.filter(category='remote_app')
platforms = platform_model.objects.filter(category='remote_app')
platforms_map = {p.type: p for p in platforms}
connect_host_map = {}
for app in applications:
attrs = app.attrs
connect_host = attrs.pop('asset')
if connect_host:
connect_host = host_model.objects.filter(asset_ptr_id=connect_host).first()
connect_host_map[app.id] = connect_host
for app in applications:
tp = app.type
app_path = attrs.pop('path', '')
if tp == 'custom':
tp = 'general_remote_app'
print("Create remote app: {}".format(app.name))
remote_app = remote_app_model(
id=app.id, hostname=app.name, ip='',
protocols='',
category='remote_app', type=tp,
platform=platforms_map[tp],
org_id=app.org_id,
app_path=app_path,
connect_host=connect_host_map.get(app.id),
attrs=attrs,
)
try:
remote_app.save()
except Exception as e:
print("Error: ", e)
# remote_app.hostname = 'RemoteApp-' + remote_app.hostname
#
# def migrate_remote_app_to_asset(apps, *args):
# app_model = apps.get_model('applications', 'Application')
# remote_app_model = apps.get_model('assets', 'Web')
# host_model = apps.get_model('assets', 'Host')
# platform_model = apps.get_model('assets', 'Platform')
# applications = app_model.objects.filter(category='remote_app')
# platforms = platform_model.objects.filter(category='remote_app')
# platforms_map = {p.type: p for p in platforms}
#
# connect_host_map = {}
#
# for app in applications:
# attrs = app.attrs
# connect_host = attrs.pop('asset')
# if connect_host:
# connect_host = host_model.objects.filter(asset_ptr_id=connect_host).first()
# connect_host_map[app.id] = connect_host
#
# for app in applications:
# tp = app.type
# attrs = app.attrs
# app_path = attrs.pop('path', '')
# if tp == 'custom':
# tp = 'general_remote_app'
#
# print("Create remote app: {}".format(app.name))
# remote_app = remote_app_model(
# id=app.id, hostname=app.name, ip='',
# protocols='',
# platform=platforms_map[tp],
# org_id=app.org_id,
# app_path=app_path,
# connect_host=connect_host_map.get(app.id),
# attrs=attrs,
# )
# try:
# remote_app.save()
# except Exception as e:
# print("Error: ", e)
# # remote_app.hostname = 'RemoteApp-' + remote_app.hostname
#
def migrate_cloud_to_asset(apps, *args):
@ -126,7 +125,6 @@ def migrate_cloud_to_asset(apps, *args):
print("Create cloud: {}".format(app.name))
cloud = cloud_model(
id=app.id, hostname=app.name, ip='',
category='remote_app', type='k8s',
protocols='',
platform=platform,
org_id=app.org_id,
@ -176,7 +174,7 @@ def migrate_to_nodes(apps, *args):
for org in orgs:
node = create_app_nodes(apps, org.id)
assets = asset_model.objects.filter(
category__in=['remote_app', 'database', 'cloud'],
platform__category__in=['remote_app', 'database', 'cloud'],
org_id=org.id
)
if not node:
@ -192,14 +190,13 @@ def migrate_to_nodes(apps, *args):
class Migration(migrations.Migration):
dependencies = [
('assets', '0098_auto_20220426_1550'),
('assets', '0096_auto_20220426_1550'),
('applications', '0020_auto_20220316_2028')
]
operations = [
migrations.RunPython(create_app_platform),
migrations.RunPython(migrate_database_to_asset),
migrations.RunPython(migrate_remote_app_to_asset),
migrations.RunPython(migrate_cloud_to_asset),
migrations.RunPython(migrate_to_nodes)
]

View File

@ -7,7 +7,7 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('assets', '0099_auto_20220426_1558'),
('assets', '0097_auto_20220426_1558'),
]
operations = [
@ -73,7 +73,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='platform',
name='su_enabled',
field=models.BooleanField(default=False),
field=models.BooleanField(default=False, verbose_name='Su enabled'),
),
migrations.AddField(
model_name='platform',
@ -90,14 +90,4 @@ class Migration(migrations.Migration):
name='verify_account_method',
field=models.TextField(blank=True, max_length=32, null=True, verbose_name='Verify account method'),
),
migrations.AlterField(
model_name='asset',
name='category',
field=models.CharField(choices=[('host', 'Host'), ('network', 'NetworkDevice'), ('database', 'Database'), ('remote_app', 'Remote app'), ('cloud', 'Clouding')], max_length=16, verbose_name='Category'),
),
migrations.AlterField(
model_name='platform',
name='category',
field=models.CharField(choices=[('host', 'Host'), ('network', 'NetworkDevice'), ('database', 'Database'), ('remote_app', 'Remote app'), ('cloud', 'Clouding')], max_length=16, verbose_name='Category'),
),
]

View File

@ -13,7 +13,7 @@ class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('assets', '0100_auto_20220430_2126'),
('assets', '0098_auto_20220430_2126'),
]
operations = [

View File

@ -55,7 +55,7 @@ def migrate_accounts(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('assets', '0101_auto_20220711_1409'),
('assets', '0099_auto_20220711_1409'),
]
operations = [

View File

@ -6,7 +6,7 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('assets', '0102_auto_20220711_1413'),
('assets', '0100_auto_20220711_1413'),
]
operations = [

View File

@ -44,7 +44,7 @@ def migrate_asset_protocols(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('assets', '0103_auto_20220803_1448'),
('assets', '0101_auto_20220803_1448'),
]
operations = [

View File

@ -1,15 +1,37 @@
# Generated by Django 3.2.14 on 2022-08-11 07:11
import assets.models.platform
import django.db.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('assets', '0106_auto_20220811_1449'),
('assets', '0102_auto_20220803_1859'),
]
operations = [
migrations.AlterField(
model_name='asset',
name='platform',
field=models.ForeignKey(default=assets.models.platform.Platform.default, on_delete=django.db.models.deletion.PROTECT, related_name='assets', to='assets.platform', verbose_name='Platform'),
),
migrations.RemoveField(
model_name='asset',
name='_protocols',
),
migrations.RemoveField(
model_name='asset',
name='admin_user',
),
migrations.RemoveField(
model_name='asset',
name='number',
),
migrations.RemoveField(
model_name='asset',
name='public_ip',
),
migrations.AlterModelOptions(
name='asset',
options={'ordering': ['name'], 'permissions': [('refresh_assethardwareinfo', 'Can refresh asset hardware info'), ('test_assetconnectivity', 'Can test asset connectivity'), ('push_assetsystemuser', 'Can push system user to asset'), ('match_asset', 'Can match asset'), ('add_assettonode', 'Add asset to node'), ('move_assettonode', 'Move asset to node')], 'verbose_name': 'Asset'},

View File

@ -46,7 +46,7 @@ def migrate_command_filter_apps(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('assets', '0107_auto_20220811_1511'),
('assets', '0103_auto_20220811_1511'),
]
operations = [

View File

@ -1,46 +0,0 @@
# Generated by Django 3.2.14 on 2022-08-10 06:49
import assets.models.platform
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
('assets', '0104_auto_20220803_1859'),
]
operations = [
migrations.AlterField(
model_name='asset',
name='category',
field=models.CharField(choices=[('host', 'Host'), ('network', 'NetworkDevice'), ('database', 'Database'), ('cloud', 'Clouding'), ('web', 'Web')], max_length=16, verbose_name='Category'),
),
migrations.AlterField(
model_name='asset',
name='platform',
field=models.ForeignKey(default=assets.models.platform.Platform.default, on_delete=django.db.models.deletion.PROTECT, related_name='assets', to='assets.platform', verbose_name='Platform'),
),
migrations.AlterField(
model_name='asset',
name='type',
field=models.CharField(choices=[('linux', 'Linux'), ('windows', 'Windows'), ('unix', 'Unix'), ('bsd', 'BSD'), ('macos', 'MacOS'), ('mainframe', 'Mainframe'), ('other_host', 'Other host'), ('switch', 'Switch'), ('router', 'Router'), ('firewall', 'Firewall'), ('other_network', 'Other device'), ('mysql', 'MySQL'), ('mariadb', 'MariaDB'), ('postgresql', 'PostgreSQL'), ('oracle', 'Oracle'), ('sqlserver', 'SQLServer'), ('mongodb', 'MongoDB'), ('redis', 'Redis'), ('general', 'General'), ('k8s', 'Kubernetes')], max_length=128, verbose_name='Type'),
),
migrations.AlterField(
model_name='platform',
name='category',
field=models.CharField(choices=[('host', 'Host'), ('network', 'NetworkDevice'), ('database', 'Database'), ('cloud', 'Clouding'), ('web', 'Web')], default='host', max_length=16, verbose_name='Category'),
),
migrations.AlterField(
model_name='platform',
name='type',
field=models.CharField(choices=[('linux', 'Linux'), ('windows', 'Windows'), ('unix', 'Unix'), ('bsd', 'BSD'), ('macos', 'MacOS'), ('mainframe', 'Mainframe'), ('other_host', 'Other host'), ('switch', 'Switch'), ('router', 'Router'), ('firewall', 'Firewall'), ('other_network', 'Other device'), ('mysql', 'MySQL'), ('mariadb', 'MariaDB'), ('postgresql', 'PostgreSQL'), ('oracle', 'Oracle'), ('sqlserver', 'SQLServer'), ('mongodb', 'MongoDB'), ('redis', 'Redis'), ('general', 'General'), ('k8s', 'Kubernetes')], default='Linux', max_length=32, verbose_name='Type'),
),
migrations.AlterField(
model_name='platform',
name='su_enabled',
field=models.BooleanField(default=False, verbose_name='Su enabled'),
),
]

View File

@ -6,7 +6,7 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('assets', '0108_auto_20220816_1022'),
('assets', '0104_auto_20220816_1022'),
]
operations = [
@ -41,4 +41,22 @@ class Migration(migrations.Migration):
model_name='systemuser',
name='users',
),
migrations.AlterUniqueTogether(
name='authbook',
unique_together=None,
),
migrations.RemoveField(
model_name='authbook',
name='asset',
),
migrations.RemoveField(
model_name='authbook',
name='systemuser',
),
migrations.DeleteModel(
name='HistoricalAuthBook',
),
migrations.DeleteModel(
name='AuthBook',
),
]

View File

@ -1,37 +0,0 @@
# Generated by Django 3.2.14 on 2022-08-11 06:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('assets', '0105_auto_20220810_1449'),
]
operations = [
migrations.RemoveField(
model_name='asset',
name='_protocols',
),
migrations.RemoveField(
model_name='asset',
name='admin_user',
),
migrations.RemoveField(
model_name='asset',
name='category',
),
migrations.RemoveField(
model_name='asset',
name='number',
),
migrations.RemoveField(
model_name='asset',
name='public_ip',
),
migrations.RemoveField(
model_name='asset',
name='type',
),
]

View File

@ -9,7 +9,7 @@ import uuid
class Migration(migrations.Migration):
dependencies = [
('assets', '0110_auto_20220817_1716'),
('assets', '0105_auto_20220817_1544'),
]
operations = [

View File

@ -1,32 +0,0 @@
# Generated by Django 3.2.14 on 2022-08-17 09:16
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('assets', '0109_auto_20220817_1544'),
('applications', '0022_auto_20220817_1346'),
]
operations = [
migrations.AlterUniqueTogether(
name='authbook',
unique_together=None,
),
migrations.RemoveField(
model_name='authbook',
name='asset',
),
migrations.RemoveField(
model_name='authbook',
name='systemuser',
),
migrations.DeleteModel(
name='HistoricalAuthBook',
),
migrations.DeleteModel(
name='AuthBook',
),
]

View File

@ -1,6 +1,6 @@
from .common import *
from .host import *
from .database import *
from .network import *
from .remote_app import *
from .networking import *
from .web import *
from .cloud import *

View File

@ -2,5 +2,5 @@
from .common import Asset
class Network(Asset):
class Networking(Asset):
pass

View File

@ -1,10 +0,0 @@
from django.utils.translation import gettext_lazy as _
from django.db import models
from .common import Asset
class RemoteApp(Asset):
app_path = models.CharField(max_length=1024, verbose_name=_("App path"))
connect_host = models.ForeignKey('assets.Host', null=True, on_delete=models.SET_NULL)
attrs = models.JSONField(default=dict, verbose_name=_('Attrs'))

View File

@ -0,0 +1,8 @@
from django.utils.translation import gettext_lazy as _
from django.db import models
from .common import Asset
class Web(Asset):
url = models.CharField(max_length=1024, verbose_name=_("url"))

View File

@ -24,8 +24,8 @@ class Platform(models.Model):
('gbk', 'GBK'),
)
name = models.SlugField(verbose_name=_("Name"), unique=True, allow_unicode=True)
category = models.CharField(max_length=16, choices=Category.choices, default=Category.HOST, verbose_name=_("Category"))
type = models.CharField(choices=AllTypes.choices, max_length=32, default='Linux', verbose_name=_("Type"))
category = models.CharField(default='host', max_length=32, verbose_name=_("Category"))
type = models.CharField(max_length=32, default='linux', verbose_name=_("Type"))
charset = models.CharField(default='utf8', choices=CHARSET_CHOICES, max_length=8, verbose_name=_("Charset"))
meta = JsonDictTextField(blank=True, null=True, verbose_name=_("Meta"))
internal = models.BooleanField(default=False, verbose_name=_("Internal"))

View File

@ -1,11 +1,11 @@
from rest_framework import serializers
from assets.models import DeviceInfo, Host, Database, Network, Cloud
from assets.models import DeviceInfo, Host, Database, Networking, Cloud
from .common import AssetSerializer
__all__ = [
'DeviceSerializer', 'HostSerializer', 'DatabaseSerializer',
'NetworkSerializer', 'CloudSerializer',
'NetworkingSerializer', 'CloudSerializer',
]
@ -34,9 +34,9 @@ class DatabaseSerializer(AssetSerializer):
fields = AssetSerializer.Meta.fields + ['db_name']
class NetworkSerializer(AssetSerializer):
class NetworkingSerializer(AssetSerializer):
class Meta(AssetSerializer.Meta):
model = Network
model = Networking
class CloudSerializer(AssetSerializer):

View File

@ -55,7 +55,7 @@ class SessionViewSet(OrgBulkModelViewSet):
'display': serializers.SessionDisplaySerializer,
}
search_fields = [
"user", "asset", "system_user", "remote_addr",
"user", "asset", "account", "remote_addr",
"protocol", "is_finished", 'login_from',
]
filterset_fields = search_fields + ['terminal']

View File

@ -13,6 +13,20 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='session',
name='protocol',
field=models.CharField(choices=[('ssh', 'SSH'), ('rdp', 'RDP'), ('telnet', 'Telnet'), ('vnc', 'VNC'), ('mysql', 'MySQL'), ('mariadb', 'MariaDB'), ('oracle', 'Oracle'), ('postgresql', 'PostgreSQL'), ('sqlserver', 'SQLServer'), ('redis', 'Redis'), ('mongodb', 'MongoDB'), ('k8s', 'K8S')], db_index=True, default='ssh', max_length=16),
field=models.CharField(db_index=True, default='ssh', max_length=16),
),
migrations.RenameField(
model_name='session',
old_name='system_user',
new_name='account',
),
migrations.RemoveField(
model_name='session',
name='system_user_id',
),
migrations.AlterField(
model_name='session',
name='account',
field=models.CharField(db_index=True, max_length=128, verbose_name='Account'),
),
]

View File

@ -31,8 +31,8 @@ class Session(OrgModelMixin):
user_id = models.CharField(blank=True, default='', max_length=36, db_index=True)
asset = models.CharField(max_length=128, verbose_name=_("Asset"), db_index=True)
asset_id = models.CharField(blank=True, default='', max_length=36, db_index=True)
system_user = models.CharField(max_length=128, verbose_name=_("System user"), db_index=True)
system_user_id = models.CharField(blank=True, default='', max_length=36, db_index=True)
account = models.CharField(max_length=128, verbose_name=_("Account"), db_index=True)
protocol = models.CharField(default='ssh', max_length=16, db_index=True)
login_from = models.CharField(max_length=2, choices=LOGIN_FROM.choices, default="ST", verbose_name=_("Login from"))
remote_addr = models.CharField(max_length=128, verbose_name=_("Remote addr"), blank=True, null=True)
is_success = models.BooleanField(default=True, db_index=True)
@ -40,7 +40,6 @@ class Session(OrgModelMixin):
has_replay = models.BooleanField(default=False, verbose_name=_("Replay"))
has_command = models.BooleanField(default=False, verbose_name=_("Command"))
terminal = models.ForeignKey('terminal.Terminal', null=True, on_delete=models.DO_NOTHING, db_constraint=False)
protocol = models.CharField(choices=Protocol.choices, default='ssh', max_length=16, db_index=True)
date_start = models.DateTimeField(verbose_name=_("Date start"), db_index=True, default=timezone.now)
date_end = models.DateTimeField(verbose_name=_("Date end"), null=True)
@ -123,9 +122,9 @@ class Session(OrgModelMixin):
return False
if self.login_from == self.LOGIN_FROM.RT:
return False
if Protocol in [
Protocol.SSH, Protocol.VNC, Protocol.RDP,
Protocol.TELNET, Protocol.K8S
if self.protocol in [
Protocol.ssh, Protocol.vnc, Protocol.rdp,
Protocol.telnet, Protocol.k8s
]:
return True
else:

View File

@ -2,6 +2,8 @@ from rest_framework import serializers
from django.utils.translation import ugettext_lazy as _
from orgs.mixins.serializers import BulkOrgResourceModelSerializer
from assets.const import Protocol
from ..models import Session
__all__ = [
@ -13,16 +15,15 @@ __all__ = [
class SessionSerializer(BulkOrgResourceModelSerializer):
org_id = serializers.CharField(allow_blank=True)
terminal_display = serializers.CharField(read_only=True, label=_('Terminal display'))
protocol = serializers.ChoiceField(choices=Protocol.choices, label=_("Protocol"))
class Meta:
model = Session
fields_mini = ["id"]
fields_small = fields_mini + [
"user", "asset", "system_user",
"user_id", "asset_id", "system_user_id",
"login_from", "login_from_display", "remote_addr", "protocol",
"is_success", "is_finished", "has_replay",
"date_start", "date_end",
"user", "asset", "user_id", "asset_id", 'account', "protocol",
"login_from", "login_from_display", "remote_addr", "is_success",
"is_finished", "has_replay", "date_start", "date_end",
]
fields_fk = ["terminal", ]
fields_custom = ["can_replay", "can_join", "can_terminate", 'terminal_display']
@ -31,7 +32,6 @@ class SessionSerializer(BulkOrgResourceModelSerializer):
"protocol": {'label': _('Protocol')},
'user_id': {'label': _('User ID')},
'asset_id': {'label': _('Asset ID')},
'system_user_id': {'label': _('System user ID')},
'login_from_display': {'label': _('Login from display')},
'is_success': {'label': _('Is success')},
'can_replay': {'label': _('Can replay')},