# Generated by Django 4.1.10 on 2023-07-25 06:58 from django.db import migrations import json def migrate_platforms_sftp_protocol(apps, schema_editor): platform_protocol_cls = apps.get_model('assets', 'PlatformProtocol') platform_cls = apps.get_model('assets', 'Platform') ssh_protocols = platform_protocol_cls.objects \ .filter(name='ssh', setting__sftp_enabled=True) \ .exclude(name__in=('Gateway', 'RemoteAppHost')) \ .filter(platform__type='linux') platforms_has_sftp = platform_cls.objects.filter(protocols__name='sftp') new_protocols = [] print("\nPlatform add sftp protocol: ") for protocol in ssh_protocols: protocol_setting = protocol.setting or {} if protocol.platform in platforms_has_sftp: continue kwargs = { 'name': 'sftp', 'port': protocol.port, 'primary': False, 'required': False, 'default': True, 'public': True, 'setting': { 'sftp_home': protocol_setting.get('sftp_home', '/tmp'), }, 'platform': protocol.platform, } new_protocol = platform_protocol_cls(**kwargs) new_protocols.append(new_protocol) print(" - {}".format(protocol.platform.name)) new_protocols_dict = {(protocol.name, protocol.platform): protocol for protocol in new_protocols} new_protocols = list(new_protocols_dict.values()) platform_protocol_cls.objects.bulk_create(new_protocols, ignore_conflicts=True) def migrate_assets_sftp_protocol(apps, schema_editor): asset_cls = apps.get_model('assets', 'Asset') platform_cls = apps.get_model('assets', 'Platform') protocol_cls = apps.get_model('assets', 'Protocol') sftp_platforms = list(platform_cls.objects.filter(protocols__name='sftp').values_list('id')) count = 0 print("\nAsset add sftp protocol: ") asset_ids = list(asset_cls.objects\ .filter(platform__in=sftp_platforms)\ .exclude(protocols__name='sftp')\ .distinct()\ .values_list('id', flat=True)) while True: _asset_ids = asset_ids[count:count + 1000] if not _asset_ids: break count += 1000 new_protocols = [] ssh_protocols = protocol_cls.objects.filter(name='ssh', asset_id__in=_asset_ids).distinct() ssh_protocols_map = {protocol.asset_id: protocol for protocol in ssh_protocols} for asset_id, protocol in ssh_protocols_map.items(): new_protocols.append(protocol_cls(name='sftp', port=protocol.port, asset_id=asset_id)) protocol_cls.objects.bulk_create(new_protocols, ignore_conflicts=True) print(" - Add {}".format(len(new_protocols))) def migrate_telnet_regex(apps, schema_editor): setting_cls = apps.get_model('settings', 'Setting') setting = setting_cls.objects.filter(name='TERMINAL_TELNET_REGEX').first() if not setting: print("Not found telnet regex setting, skip") return try: value = json.loads(setting.value) except Exception: print("Invalid telnet regex setting, skip") return platform_protocol_cls = apps.get_model('assets', 'PlatformProtocol') telnets = platform_protocol_cls.objects.filter(name='telnet') if telnets.count() > 0: telnets.update(setting={'success_prompt': value}) print("Migrate telnet regex setting success: ", telnets.count()) class Migration(migrations.Migration): dependencies = [ ('assets', '0120_auto_20230630_1613'), ] operations = [ migrations.RunPython(migrate_platforms_sftp_protocol), migrations.RunPython(migrate_assets_sftp_protocol), migrations.RunPython(migrate_telnet_regex), ]