From 333e411743ce3256772644072fa0bcd3a67ef0c2 Mon Sep 17 00:00:00 2001 From: RogerWork Date: Wed, 11 Mar 2026 18:30:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=8C=87=E5=AE=9A=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E7=89=88=E6=9C=AC=E7=AC=AC=E4=B8=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- update/serializers.py | 2 +- update/urls.py | 1 + update/utils/client_util_custom.py | 54 ++++++++++++++++++++++++++++++ update/views.py | 22 ++++++++---- 4 files changed, 71 insertions(+), 8 deletions(-) diff --git a/update/serializers.py b/update/serializers.py index ef00188..b4a0fa2 100644 --- a/update/serializers.py +++ b/update/serializers.py @@ -31,7 +31,7 @@ class ClientReleaseSerializer(serializers.ModelSerializer): model = ClientRelease fields = ( 'id', 'origin_name', 'client_ver', 'main_ver', 'sub_ver', 'ver_id', 'upload_name', 'client_type', - 'is_delete', 'update_time') + 'is_delete', 'update_time', 'deploy_id', 'is_cached', 'file_name', 'md5') class UpdateCommandSerializer(serializers.ModelSerializer): diff --git a/update/urls.py b/update/urls.py index cdf5181..2496631 100644 --- a/update/urls.py +++ b/update/urls.py @@ -23,6 +23,7 @@ router = DefaultRouter() router.register('cinema', views.CinemaViewSet, 'cinema') router.register('user', views.CinemaUserViewSet, 'cinema_user') router.register('update_alter', views.UpdateAlterViewSet, 'update_alter') +router.register('client_release', views.ClientReleaseViewSet, 'client_release') urlpatterns = [ # path('cinema/search/', views.CinemaSearchAPIView.as_view()), diff --git a/update/utils/client_util_custom.py b/update/utils/client_util_custom.py index 41e563c..d2494c7 100644 --- a/update/utils/client_util_custom.py +++ b/update/utils/client_util_custom.py @@ -120,3 +120,57 @@ class ClientUtilCustom: local_file.close() print(self.client_data) + + # 传输客户端的方法 + + def upload(self, cine_ip, origin, target): + print('upload', cine_ip, origin, target) + # 创建Transport客户端 + trans = paramiko.Transport((cine_ip, 22)) + # 使用密码连接服务器 + trans.connect(username='root', password='cine123456') + # 创建SFTP客户端 + sftp = paramiko.SFTPClient.from_transport(trans) + # 上传文件 参数(本地文件路径, 远程文件路径) + sftp.put( + os.path.join(self.local_path, origin), + f"/data0/cine/resource/upload/client/{target}") + # 关闭客户端 + print(f'完成上传,路径/data0/cine/resource/upload/client/{target}') + trans.close() + + def upload_client(self, cinema_ip, client_ver, server_release): + print('upload_client', cinema_ip, client_ver, server_release) + # 上传操作 + print(f'开始上传操作, 目标主机 {cinema_ip}, 客户端版本 {client_ver}') + + release_ver = server_release[8:11] if server_release.startswith('2') else server_release[7:10] + if client_ver is None or client_ver == '': + print('1'*100) + client = ClientRelease.objects.filter(Q(ver_id=release_ver) & Q(is_cached=True)).order_by('-id').first() + else: + print('2' * 100) + print(client_ver[7:10]) + client = ClientRelease.objects.filter(Q(client_ver=client_ver) & Q(is_cached=True)).order_by('-id').first() + print("client", client) + print('最终上传版本:', client.file_name, client.upload_name) + if not client: + return False + self.upload(cinema_ip, client.file_name, client.upload_name) + + # 更新数据库 + cine = Cinema.objects.filter(ip=cinema_ip).first() + db_config = { + 'host': cinema_ip, + 'user': cine.db_user, + 'password': cine.db_pwd, + 'port': 3306, + 'database': 'cine' + } + db_conn = pymysql.Connect(**db_config) + db_cursor = db_conn.cursor(cursor=DictCursor) + db_cursor.execute('UPDATE cinema_version SET client_version = %s WHERE 1=1;', (client.client_ver,)) + db_conn.commit() + db_cursor.close() + db_conn.close() + return client.origin_name \ No newline at end of file diff --git a/update/views.py b/update/views.py index bf39c2f..ee6ca54 100644 --- a/update/views.py +++ b/update/views.py @@ -53,13 +53,13 @@ class CinemaViewSet(CacheResponseMixin, viewsets.ModelViewSet): # filter_fields = ('ip',) filterset_fields = ('ip',) GetVersion().main_process() # 修改数据model时需要注释调 - # client_custom = ClientUtilCustom() - # client_custom.sync_client_db() + ClientUtilCustom().sync_client_db() @action(methods=['get'], detail=False) @method_decorator(cache_page(60 * 1)) def refresh(self, request, *args, **kwargs): GetVersion().main_process() + ClientUtilCustom().sync_client_db() queryset = Cinema.objects.filter(is_delete=False).all().order_by('ip') serializer = self.get_serializer(instance=queryset, many=True) return Response(serializer.data) @@ -74,6 +74,9 @@ class UpdateAlterViewSet(CacheResponseMixin, viewsets.ModelViewSet): queryset = UpdateAlter.objects.all() serializer_class = UpdateAlterSerializer +class ClientReleaseViewSet(CacheResponseMixin, viewsets.ModelViewSet): + queryset = ClientRelease.objects.filter(is_cached=True).order_by('-id').all() + serializer_class = ClientReleaseSerializer # class CinemaSearchAPIView(APIView, CacheResponseMixin): # @method_decorator(cache_page(60 * 5)) @@ -111,6 +114,7 @@ def get_git_version(request): def update_cine(request): req = request.GET.dict() cinema_ip = req.get('ip') + client_ver = req.get('client_ver') print('-'*100) print(f'开始更新 {cinema_ip}') @@ -340,11 +344,15 @@ def update_cine(request): try: update_status['client']['result'] = 'running' redis_conn.set(redis_key, json.dumps(update_status), 5 * 60) - client_release = ClientUtil() - client_name = client_release.client_process(cinema_ip, short_release) - update_status['client']['result'] = 'success' - update_status['client']['msg'] = f'客户端上传成功: {client_name}' - redis_conn.set(redis_key, json.dumps(update_status), 5 * 60) + # client_release = ClientUtil() + # client_name = client_release.client_process(cinema_ip, short_release) + client_custom = ClientUtilCustom() + if client_custom.upload_client(cinema_ip, client_ver, short_release): + update_status['client']['result'] = 'success' + update_status['client']['msg'] = f'客户端上传成功: {client_ver}' + redis_conn.set(redis_key, json.dumps(update_status), 5 * 60) + else: + raise ValueError(f'找不到对应的客户端:{client_ver}') except Exception as e: print('第七步:传输客户端异常', e) update_status['result'] = 'fail'