jumpserver/apps/assets/migrations/0100_auto_20220711_1413.py

88 lines
2.9 KiB
Python
Raw Normal View History

2022-07-12 02:54:23 +00:00
# Generated by Django 3.2.12 on 2022-07-11 06:13
2022-07-13 08:36:49 +00:00
import time
2022-07-12 02:54:23 +00:00
from django.db import migrations
from assets.models import Platform
2022-07-12 02:54:23 +00:00
def migrate_accounts(apps, schema_editor):
auth_book_model = apps.get_model('assets', 'AuthBook')
account_model = apps.get_model('assets', 'Account')
2022-07-13 08:36:49 +00:00
count = 0
bulk_size = 1000
2022-10-19 03:39:11 +00:00
print("\n\tStart migrate accounts")
2022-07-13 08:36:49 +00:00
while True:
2022-07-14 02:56:09 +00:00
start = time.time()
2022-07-13 08:36:49 +00:00
auth_books = auth_book_model.objects \
2022-07-14 02:56:09 +00:00
.prefetch_related('systemuser') \
.all()[count:count+bulk_size]
2022-07-13 08:36:49 +00:00
if not auth_books:
break
2022-08-18 03:15:17 +00:00
count += len(auth_books)
2022-07-13 08:36:49 +00:00
accounts = []
2022-07-14 02:56:09 +00:00
# auth book 和 account 相同的属性
2022-07-13 08:36:49 +00:00
same_attrs = [
2022-09-20 05:54:25 +00:00
'id', 'username', 'comment', 'date_created', 'date_updated',
2022-07-13 08:36:49 +00:00
'created_by', 'asset_id', 'org_id',
]
# 认证的属性,可能是 authbook 的,可能是 systemuser 的
2022-09-20 05:54:25 +00:00
auth_attrs = ['password', 'private_key', 'token']
all_attrs = same_attrs + auth_attrs
2022-07-13 08:36:49 +00:00
for auth_book in auth_books:
2022-09-20 05:54:25 +00:00
values = {'version': 1}
2022-07-13 08:36:49 +00:00
system_user = auth_book.systemuser
2022-09-13 13:07:20 +00:00
if system_user:
2022-09-20 05:54:25 +00:00
# 更新一次系统用户的认证属性
values.update({attr: getattr(system_user, attr, '') for attr in all_attrs})
2022-07-13 08:36:49 +00:00
values['created_by'] = str(system_user.id)
2022-08-18 05:02:10 +00:00
values['privileged'] = system_user.type == 'admin'
2022-07-13 08:36:49 +00:00
2022-09-20 05:54:25 +00:00
auth_book_auth = {attr: getattr(auth_book, attr, '') for attr in all_attrs if getattr(auth_book, attr, '')}
# 最终使用 authbook 的认证属性
2022-07-13 08:36:49 +00:00
values.update(auth_book_auth)
2022-09-20 05:54:25 +00:00
auth_infos = []
username = values['username']
for attr in auth_attrs:
secret = values.pop(attr, None)
if not secret:
continue
if attr == 'private_key':
secret_type = 'ssh_key'
name = f'{username}(ssh key)'
elif attr == 'token':
secret_type = 'token'
name = f'{username}(token)'
else:
secret_type = attr
name = username
auth_infos.append((name, secret_type, secret))
if not auth_infos:
auth_infos.append((username, 'password', ''))
for name, secret_type, secret in auth_infos:
account = account_model(**values, name=name, secret=secret, secret_type=secret_type)
accounts.append(account)
2022-07-13 08:36:49 +00:00
account_model.objects.bulk_create(accounts, ignore_conflicts=True)
2022-10-19 03:39:11 +00:00
print("\t - Create accounts: {}-{} using: {:.2f}s".format(
2022-08-18 03:15:17 +00:00
count - len(auth_books), count, time.time()-start
2022-07-13 08:36:49 +00:00
))
2022-07-12 02:54:23 +00:00
class Migration(migrations.Migration):
dependencies = [
2022-08-24 08:14:32 +00:00
('assets', '0099_auto_20220711_1409'),
2022-07-12 02:54:23 +00:00
]
operations = [
migrations.RunPython(migrate_accounts),
2022-07-12 02:54:23 +00:00
]