|
|
|
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()
|