import os import paramiko from smb.SMBConnection import SMBConnection from update.models import ClientRelease, Cinema import pymysql from pymysql.cursors import DictCursor class ClientUtil: def __init__(self): self.smb_conn = SMBConnection('admin', 'admin', '', '', use_ntlm_v2=True) self.smb_host = '172.16.3.68' def get_test_client_file(self): self.smb_conn.connect(self.smb_host, 445) smb_files = self.smb_conn.listPath('data1', '/客户端/测试专用', pattern=r'client_v2.033*.7z') for file in smb_files: if ClientRelease.objects.filter(origin_name=file).first(): continue local_file = open(rf'../../dx/client/{file}', 'wb') # 接收文件并写入本地文件 self.smb_conn.retrieveFile('data1', rf'/客户端/测试专用/{file}', local_file) # 关闭本地文件 local_file.close() self.write_db(file) self.smb_conn.close() return smb_files def get_prd_client_file(self): self.smb_conn.connect(self.smb_host, 445) prd_smb_files = self.smb_conn.listPath('data1', '/客户端/结测常用客户端', pattern=r'client_v2.033*.7z') for file in prd_smb_files: if ClientRelease.objects.filter(origin_name=file).first(): continue local_file = open(rf'../../dx/client/{file}', 'wb') # 接收文件并写入本地文件 self.smb_conn.retrieveFile('data1', rf'/客户端/结测常用客户端/{file}', local_file) # 关闭本地文件 local_file.close() self.write_db(file) history_smb_files = self.smb_conn.listPath('data1', '/客户端/结测常用客户端/历史客户端', pattern=r'client_v2.033*.7z') for file in history_smb_files: if ClientRelease.objects.filter(origin_name=file).first(): continue local_file = open(rf'../../dx/client/{file}', 'wb') # 接收文件并写入本地文件 self.smb_conn.retrieveFile('data1', rf'/客户端/结测常用客户端/历史客户端/{file}', local_file) # 关闭本地文件 local_file.close() self.write_db(file) self.smb_conn.close() return prd_smb_files + history_smb_files @staticmethod def write_db(_file): # 写入数据库 client_ver = _file[8:23] main_ver = _file[8:18] sub_ver = _file[19:23] upload_ver = _file[:23] + '.7z' _type = 'prd' ClientRelease.objects.update(origin_name=_file, client_ver=client_ver, main_ver=main_ver, sub_ver=sub_ver, upload_ver=upload_ver, client_type=_type) def update_client_file(self): prd_clients = self.get_prd_client_file() test_clients = self.get_test_client_file() all_clients = prd_clients + test_clients all_db_clients = ClientRelease.objects.filter(is_delete='0').all() for db_client in all_db_clients: if db_client['origin_name'] in all_clients: continue else: ClientRelease.objects.filter(pk=db_client['id']).update(is_delete='1') path = f'../../dx/client/{db_client["origin_name"]}' os.remove(path) def upload_client_file(self, cinema_ip, _release): cine = Cinema.objects.filter(ip=cinema_ip).first() db_config = { 'host': cinema_ip, 'username': cine['db_user'], 'password': cine['db_pwd'], 'port': 3306, 'database': 'cine' } db_conn = pymysql.Connect(**db_config) db_cursor = db_conn.cursor(cursor=DictCursor) # 获取客户端信息 client = ClientRelease.objects.filter(main_ver=_release).order_by('-sub_ver').first() print(client) if client: self.upload(cinema_ip, client['origin_name'], client['upload_name']) db_cursor.execute('UPDATE cinema_version SET client_version = %s WHERE 1=1;', (client['client_ver'],)) else: db_cursor.execute('SELECT client_version FROM cinema_version;') client_ver = db_cursor.fetchone()['client_version'] client = ClientRelease.objects.filter(client_ver=client_ver).order_by('-sub_ver').first() self.upload(cinema_ip, client['origin_name'], client['upload_name']) @staticmethod def 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( f"../../dx/client/{origin}", f"/data0/cine/resource/upload/client/{target}") # 关闭客户端 trans.close()