From 6feae5bd810459fae924863f52cd8ad258baf5b4 Mon Sep 17 00:00:00 2001 From: RogerWork Date: Sat, 14 Feb 2026 18:01:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC=E7=9A=84=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dingxin_toolbox_drf/settings.py | 7 + update/migrations/0030_cinema_is_check.py | 18 +++ ...lease_deploy_id_clientrelease_is_cached.py | 23 ++++ ...se_file_name_clientrelease_md5_and_more.py | 28 ++++ .../0033_alter_clientrelease_md5.py | 18 +++ update/models.py | 8 +- update/utils/client_util_custom.py | 122 ++++++++++++++++++ update/utils/dingxin_sql.py | 9 +- update/views.py | 3 + 9 files changed, 232 insertions(+), 4 deletions(-) create mode 100644 update/migrations/0030_cinema_is_check.py create mode 100644 update/migrations/0031_clientrelease_deploy_id_clientrelease_is_cached.py create mode 100644 update/migrations/0032_clientrelease_file_name_clientrelease_md5_and_more.py create mode 100644 update/migrations/0033_alter_clientrelease_md5.py create mode 100644 update/utils/client_util_custom.py diff --git a/dingxin_toolbox_drf/settings.py b/dingxin_toolbox_drf/settings.py index ecf9309..c85e740 100644 --- a/dingxin_toolbox_drf/settings.py +++ b/dingxin_toolbox_drf/settings.py @@ -62,6 +62,13 @@ CONFIG = { "PASSWORD": "cine123456", "NAME": "dingxin_toolbox", }, + # 'DB': { + # "HOST": '172.16.1.63', + # "PORT": 3306, + # "USER": "root", + # "PASSWORD": "Cine123456", + # "NAME": "dingxin_toolbox", + # }, 'REDIS_IP': '127.0.0.1', 'ECARD_DB': { "HOST": '10.10.0.61', diff --git a/update/migrations/0030_cinema_is_check.py b/update/migrations/0030_cinema_is_check.py new file mode 100644 index 0000000..a63910b --- /dev/null +++ b/update/migrations/0030_cinema_is_check.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2026-01-06 07:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('update', '0029_cinema_comments_cinema_is_online'), + ] + + operations = [ + migrations.AddField( + model_name='cinema', + name='is_check', + field=models.BooleanField(default=False, help_text='是否需要拉取版本', verbose_name='是否在线'), + ), + ] diff --git a/update/migrations/0031_clientrelease_deploy_id_clientrelease_is_cached.py b/update/migrations/0031_clientrelease_deploy_id_clientrelease_is_cached.py new file mode 100644 index 0000000..f081d61 --- /dev/null +++ b/update/migrations/0031_clientrelease_deploy_id_clientrelease_is_cached.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.7 on 2026-02-14 06:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('update', '0030_cinema_is_check'), + ] + + operations = [ + migrations.AddField( + model_name='clientrelease', + name='deploy_id', + field=models.IntegerField(default=0, help_text='打包服务器版本ID', null=True, verbose_name='打包服务器版本ID'), + ), + migrations.AddField( + model_name='clientrelease', + name='is_cached', + field=models.BooleanField(default=False, help_text='是否本地缓存', verbose_name='是否本地缓存'), + ), + ] diff --git a/update/migrations/0032_clientrelease_file_name_clientrelease_md5_and_more.py b/update/migrations/0032_clientrelease_file_name_clientrelease_md5_and_more.py new file mode 100644 index 0000000..5398c24 --- /dev/null +++ b/update/migrations/0032_clientrelease_file_name_clientrelease_md5_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2.7 on 2026-02-14 09:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('update', '0031_clientrelease_deploy_id_clientrelease_is_cached'), + ] + + operations = [ + migrations.AddField( + model_name='clientrelease', + name='file_name', + field=models.CharField(help_text='smb上的名称', max_length=500, null=True, verbose_name='文件名称'), + ), + migrations.AddField( + model_name='clientrelease', + name='md5', + field=models.CharField(default='', help_text='md5', max_length=30, null=True, verbose_name='md5'), + ), + migrations.AlterField( + model_name='clientrelease', + name='origin_name', + field=models.CharField(help_text='deploy上的名称', max_length=500, verbose_name='原始名称'), + ), + ] diff --git a/update/migrations/0033_alter_clientrelease_md5.py b/update/migrations/0033_alter_clientrelease_md5.py new file mode 100644 index 0000000..0a66fd2 --- /dev/null +++ b/update/migrations/0033_alter_clientrelease_md5.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2026-02-14 09:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('update', '0032_clientrelease_file_name_clientrelease_md5_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='clientrelease', + name='md5', + field=models.CharField(default='', help_text='md5', max_length=50, null=True, verbose_name='md5'), + ), + ] diff --git a/update/models.py b/update/models.py index fccabf1..86a6e45 100644 --- a/update/models.py +++ b/update/models.py @@ -79,7 +79,7 @@ class ClientRelease(BaseModels): 鼎新客户端版本 """ id = models.AutoField(primary_key=True) - origin_name = models.CharField(verbose_name='原始名称', max_length=500, null=False, help_text='smb上的名称') + origin_name = models.CharField(verbose_name='原始名称', max_length=500, null=False, help_text='deploy上的名称') client_ver = models.CharField(verbose_name='客户端版本', max_length=100, null=False, default='', help_text='客户端版本') main_ver = models.CharField(verbose_name='主版本', max_length=100, null=False, default='', help_text='主版本') @@ -89,8 +89,10 @@ class ClientRelease(BaseModels): client_type = models.CharField(verbose_name='类型', max_length=10, default='test', help_text='类型 test 测试 prd 线上') is_delete = models.BooleanField(verbose_name='是否有效', default=False, help_text='是否有效') - # dev_id = models.IntegerField(verbose_name='打包服务器版本ID', null=True, default=0, help_text='打包服务器版本ID') - # is_cached = models.BooleanField(verbose_name='是否本地缓存', default=False, help_text='是否本地缓存') + deploy_id = models.IntegerField(verbose_name='打包服务器版本ID', null=True, default=0, help_text='打包服务器版本ID') + is_cached = models.BooleanField(verbose_name='是否本地缓存', default=False, help_text='是否本地缓存') + file_name = models.CharField(verbose_name='文件名称', max_length=500, null=True, help_text='smb上的名称') + md5 = models.CharField(verbose_name='md5', max_length=50, null=True, default='', help_text='md5') def __str__(self): return self.upload_name diff --git a/update/utils/client_util_custom.py b/update/utils/client_util_custom.py new file mode 100644 index 0000000..41e563c --- /dev/null +++ b/update/utils/client_util_custom.py @@ -0,0 +1,122 @@ +import os +import json +import paramiko +from smb.SMBConnection import SMBConnection +from update.models import ClientRelease, Cinema +import pymysql +from pymysql.cursors import DictCursor +from django.db.models import Q, Max +from dingxin_toolbox_drf.settings import BASE_DIR +from update.utils.dingxin_sql import * + +# 定义客户端读取路径 +TEST_CLIENT_PATH = r'/客户端/测试专用/' +TEST_HISTORY_CLIENT_PATH = r'/客户端/测试专用/历史测试测客户端/' +PRD_CLIENT_PATH = r'/客户端/结测常用客户端/' +PRD_HISTORY_CLIENT_PATH = r'/客户端/结测常用客户端/历史客户端——通用/' + + +class ClientUtilCustom: + def __init__(self): + self.smb_conn = SMBConnection('admin', 'admin', '', '', use_ntlm_v2=True) + self.smb_host = '172.16.3.68' + self.local_path = os.path.join(BASE_DIR, 'dx', 'client') + self.deploy_db_config = {'host': '10.10.0.80', 'port': 3306, 'user': 'clientdeploy', + 'password': 'clientdeploy123456', 'database': 'yhz_tool'} + self.deploy_id = 0 + self.client_data = [] + self.client_file_list = [] + + def smb_connect(self): + self.smb_conn.connect(self.smb_host, 445) + + def smb_disconnect(self): + self.smb_conn.close() + + def sync_client_db(self): + # 获取本地数据库最大的同步ID + self.deploy_id = ClientRelease.objects.all().aggregate(Max('deploy_id'))['deploy_id__max'] + print('deploy_id', self.deploy_id) + # 连接到deploy库获取大于deploy_id的数据 + db_conn = pymysql.connect(**self.deploy_db_config) + cursor = db_conn.cursor(cursor=DictCursor) + cursor.execute(GET_NEW_DEPLOY_CLIENT_INFO, (self.deploy_id,)) + cursor.close() + # 获取未同步的客户端信息 + client_info_list = cursor.fetchall() + print(client_info_list) + # 将客户端信息转化为本地数据库格式 + self.handle_client_data_format(client_info_list) + # 启动smb服务 + self.smb_connect() + # 获取smb服务器上的文件列表 + self.get_client_file_list() + # 将文件写入本地服务器 + self.get_client_file() + # 将数据信息写人本地数据库 + self.update_client_db() + # 关闭smb服务 + self.smb_disconnect() + # 关闭数据库 + db_conn.close() + + + def handle_client_data_format(self, client_data_list): + print('handle_client_data_format') + for data in client_data_list: + print(data) + main_ver = data['version_full'][:-5] + upload_name = data['zip_full_name'][0:23] + '.7z' + ver_id = int(data['version_full'][7:10]) + self.client_data.append( + {'origin_name': data['zip_full_name'], + 'main_ver': main_ver, + 'sub_ver': data['version_revise'], + 'upload_name': upload_name, + 'client_ver': data['version_full'], + 'ver_id': ver_id, + 'deploy_id': data['id'], + 'is_cached': '0', + 'file_name': '', + 'md5': data['zip_md5'], + } + ) + print(self.client_data) + + def update_client_db(self): + for d in self.client_data: + if not ClientRelease.objects.filter(deploy_id=d['deploy_id']).exists(): + ClientRelease.objects.create(**d) + + def get_client_file_list(self): + print('get_client_file_list') + path_list = [TEST_CLIENT_PATH, TEST_HISTORY_CLIENT_PATH, PRD_CLIENT_PATH, PRD_HISTORY_CLIENT_PATH] + for path in path_list: + smb_files = self.smb_conn.listPath('data1', path, pattern=r'client_v*.7z') + for file in smb_files: + self.client_file_list.append({'path': path, 'name': file.filename}) + print(json.dumps(self.client_file_list)) + + def get_client_file(self): + print('get_client_file') + local_file_list = list(os.walk(self.local_path))[0][2] + for client in self.client_data: + for file in self.client_file_list: + if client['origin_name'][:23] == file['name'][:23]: + # 查看本地是否有此版本客户端 + if file['name'] in local_file_list: + print('找到本地文件:', file['name']) + continue + # 下载文件到本地 + with open(os.path.join(self.local_path, file['name']), 'wb') as local_file: + # 接收文件并写入本地文件 + print('从共享下载客户端文件到服务器 共享路径:', rf"{file['path']}{file['name']}", '服务器路径:', + os.path.join(self.local_path, file['name'])) + self.smb_conn.retrieveFile('data1', rf"{file['path']}{file['name']}", local_file) + # 更新数据 + client['is_cached'] = '1' + client['file_name'] = file['name'] + # 关闭本地文件 + local_file.close() + + print(self.client_data) diff --git a/update/utils/dingxin_sql.py b/update/utils/dingxin_sql.py index d638c37..0ad8b1b 100644 --- a/update/utils/dingxin_sql.py +++ b/update/utils/dingxin_sql.py @@ -4,4 +4,11 @@ FROM client_deploy_log cdl WHERE publish_type = '通用' AND id > 162 AND SUBSTRING(cdl.version_full, 1, 10) = %s -ORDER BY sub_version DESC LIMIT 1;""" \ No newline at end of file +ORDER BY sub_version DESC LIMIT 1;""" + +GET_NEW_DEPLOY_CLIENT_INFO = """ + SELECT id, version_full, version_revise, zip_full_name, zip_md5 + FROM client_deploy_log + WHERE publish_type = '通用' + AND id > %s; \ + """ \ No newline at end of file diff --git a/update/views.py b/update/views.py index a05ffb2..8ae9551 100644 --- a/update/views.py +++ b/update/views.py @@ -23,6 +23,7 @@ from update.utils.git_util import GitUtil, GitDbUtil from update.utils.cmd_extcute import UpdateCommandUtil, UpdateConfigUtil from update.utils.db_compare import DbCompare from update.utils.client_util import ClientUtil +from update.utils.client_util_custom import ClientUtilCustom from django.utils import timezone @@ -52,6 +53,8 @@ class CinemaViewSet(CacheResponseMixin, viewsets.ModelViewSet): # filter_fields = ('ip',) filterset_fields = ('ip',) GetVersion().main_process() # 修改数据model时需要注释调 + client_custom = ClientUtilCustom() + client_custom.sync_client_db() @action(methods=['get'], detail=False) @method_decorator(cache_page(60 * 1))