Files
python_tools/ftp.py
2023-05-17 08:27:57 +08:00

308 lines
9.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import paramiko
from ftplib import FTP
import os
import threading
import udp
import sys
import time
import stat
from PyQt5.QtCore import *
STR_RED="\033[1;31m"
STR_BLUE="\033[1;34m"
STR_END="\033[0m"
# 获得文件绝对路径
def getpath():
path=os.path.abspath(sys.argv[0])
list_str=path.split("\\")
return path.replace(list_str[-1],"")
class myftp(QObject):
local_path=getpath()+'file'
# print(local_path)
remot_path='/home/root'
# 进度信号ip1~100
rate_signal =pyqtSignal([str,int])
# 结束信号ip成败描述
end_signal = pyqtSignal([str,bool,str])
def __init__(self,ip,user,password):
QObject.__init__(self)
self.ip=ip
self.ssh = paramiko.SSHClient()
# 加入受信主机列表
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(ip, 22, user, password,timeout=10)
# 实例化一个 sftp对象,指定连接的通道
self.sftp=self.ssh.open_sftp()
self.invoke = self.ssh.invoke_shell()
def send_cmd(self,cmd,inputs=[],sleep_s=0.5):
# print("send cmd:",cmd)
console=""
input_list=[]
input_list=inputs.copy()
self.invoke.send(cmd+'\n') # \n很重要相当于回车
time.sleep(sleep_s)
while True:
out=self.invoke.recv(9999).decode("utf-8") # 提取数据然后解码
if(len(out)>0):
# print(out)
console+=out
else:
break
if(len(input_list)>0):
send_str=input_list.pop(0)
# print(self.ip,"|"+send_str)
self.invoke.send(send_str+'\n')
time.sleep(0.5)
else:
break
console='\n'+console
console=console.replace('\n','\n\t|')
print(self.ip,console)
# print("send cmd end")
def get_file(self,path,src_list):
lo_path=self.local_path+"\\"
if(len(path)>0):
lo_path=lo_path+path+"\\"
if not os.path.exists(lo_path):
os.makedirs(lo_path)
for i in src_list:
file_name=i.split('/')
try:
# print(file_name[-1])
if(len(file_name[-1])>0):
self.sftp.get(remotepath=i, localpath=lo_path+file_name[-1])
else:
file_list=self.scan_dir(i)
# self.sftp.get(remotepath=i, localpath=lo_path[0:-1])
self.get_file(path,file_list)
except Exception as r:
print(lo_path,"|"+str(r))
print(STR_RED,lo_path,"|get ",i,"failed.",STR_END)
return
print(STR_BLUE,lo_path,"|get ",i,"success.",STR_END)
def scan_dir(self,remotdir):
# list=self.sftp.listdir(remotdir)
attrs=self.sftp.listdir_attr(remotdir)
file_list=[]
for attr in attrs:
if not stat.S_ISDIR(attr.st_mode):
file_list.append(remotdir+attr.filename)
# print(file_list)
return file_list
# 关闭连接
def close(self):
self.ssh.close()
def put_cb(self,sent:int,all:int):
# (sended*100/data.size()+((index-1)*100))/get_addrs().size()
self.put_rate=sent*100//all
rate=(self.put_rate+(self.index)*100)//self.len_files
self.rate_signal.emit(self.ip,rate)
# print("sent={d1},all={d2}".format(d1=sent,d2=all))
# print("rate=",rate)
# 添加进度和结束信号供qt显示
def put_file(self,prefix,dst_list,src_list):
if not os.path.exists(self.local_path):
self.end_signal.emit(self.ip,False,"local path is not exists.")
return
self.len_files=len(dst_list)
self.index=0
for i in dst_list:
self.put_rate=0
file_name=i.split('/')
temp_path=self.remot_path+'/'+file_name[-1]
src_path=""
if(len(src_list)==0):
src_path=self.local_path+'\\'+file_name[-1]
else:
src_path=src_list[self.index]
if os.path.exists(src_path):
self.send_cmd("rm "+i)
# self.sftp.chmod(i.replace(file_name[-1],""),777)
self.send_cmd("chmod "+"777 "+i.replace(file_name[-1],""))
try:
self.sftp.put(localpath=src_path, remotepath=i,callback=self.put_cb)
except Exception as r:
print(prefix,"|"+str(r))
print(STR_RED,prefix,"|put ",i,"failed.",STR_END)
self.end_signal.emit(self.ip,False,str(r)+"|"+i)
return
self.index+=1
print(STR_BLUE,prefix,"|put ",i,"success.",STR_END)
# self.sftp.chmod(i,777)
self.send_cmd("chmod "+"777 "+i)
# self.rate_signal.emit(self.ip,self.index*100//self.len_files)
else:
print(STR_RED,prefix,"|file:"+src_path +" not exist.",STR_END)
self.end_signal.emit(self.ip,False,"file:"+src_path +" not exist.")
return
self.end_signal.emit(self.ip,True,"success")
# 从虚拟机下载文件
def load_file(ip,src_list):
print("load file from:",ip)
# ftp=myftp(ip,"andy","123456")
ftp=myftp(ip,"bitman","123456")
ftp.get_file("",src_list)
ftp.close()
print("load file end.")
# 保存文件到开发板
def save_file(ip,restart:bool,dst_list,src_list):
try:
ftp=myftp(ip,"root","")
if(restart==True):
print(ip,"|stop app.")
ftp.send_cmd("systemctl stop atk-qtapp-start.service")
ftp.put_file(ip,dst_list,src_list)
if(restart==True):
print(ip,"|start app.")
ftp.send_cmd("systemctl restart atk-qtapp-start.service")
ftp.send_cmd("sync")
ftp.close()
# print(ip,"|save file end.")
except Exception as r:
print(STR_RED,ip,"|"+str(r),STR_END)
# 从开发板加载文件
def get_file(ip,path,get_list):
# print("load file from:",ip)
ftp=myftp(ip,"root","")
ftp.get_file(path,get_list)
ftp.close()
# print("load file end.")
def send_cmd(ip,cmd_list):
ftp=myftp(ip,"root","")
for i in cmd_list:
ftp.send_cmd(i[0],i[1])
ftp.close()
# 定义要从虚拟机下载的文件
src_list=[]
# src_list.append("/home/bitman/linux/nfs/stm32mp157d-atk.dtb")
# src_list.append("/home/bitman/linux/nfs/QDesktop-fb")
# src_list.append("/home/bitman/QtWorkSpace/tcp_tr_can/checker_ye_cfg08.json")
src_list.append("/home/bitman/linux/nfs/")
# 定义要保存到开发板的文件
dst_list=[]
# 第一次拷贝设备树会因为权限问题不能运行
# dst_list.append("/run/media/mmcblk2p2/stm32mp157d-atk.dtb")
# dst_list.append("/usr/local/QDesktop-fb")
# dst_list.append("/home/root/config/checker_app_pre.sh")
# dst_list.append("/home/root/config/cfg.json")
# dst_list.append("/home/root/config/checker_ye_cfg11.json")
dst_list.append("/home/root/config/judge.lua")
# dst_list.append("/home/root/config/JQChecker_0008.bin")
# 定义要从开发板获取的文件
get_list=[]
# get_list.append("/home/root/comm_log/comm_log.csv")
# get_list.append("/home/root/log/debug_log.txt")
# get_list.append("/home/root/config/checker_app_pre.sh")
# get_list.append("/home/root/config/cfg.json")
# get_list.append("/home/root/config/judge.lua")
get_list.append("/home/root/comm_log/")
# 定义命令
cmd_list=[]
# cmd_list.append(("/usr/sbin/useradd -d / -g wheel andy",[]))
# cmd_list.append(("passwd andy",["123456","123456"]))
cmd_list.append(("rm ~/config/checker_app_pre.sh",[]))
# cmd_list.append(("ls ~/config/",[]))
# cmd_list.append(("ls /usr/local/",[]))
# 自动扫描从机地址,然后升级文件
# python .\ftp.py get 从开发板下载文件
# python .\ftp.py save 保存文件到开发板
# python .\ftp.py cmd 发送命令列表
def run():
if(len(sys.argv)<2):
print("argv too less")
return
print(sys.argv[0])
cmd=sys.argv[1]
ip_list=[]
u=udp.myudp(1,255)
u.find("192.168.80")
ip_list=u.dst_ip_list
if(len(ip_list)==0):
# ip_list.append(("192.168.80.120","local_id_1"))
ip_list.append(("192.168.80.81","local_id_1"))
ip_list.append(("192.168.80.82","local_id_2"))
ip_list.append(("192.168.80.83","local_id_3"))
ip_list.append(("192.168.80.84","local_id_4"))
ip_list.append(("192.168.80.85","local_id_5"))
ip_list.append(("192.168.80.86","local_id_6"))
ip_list.append(("192.168.80.87","local_id_7"))
ip_list.append(("192.168.80.88","local_id_8"))
print("find ip_list as:")
print(ip_list)
threads = []
if(cmd=="save"):
# load_file("192.168.80.188",src_list)
print('put file to ip_list.')
for i in ip_list:
t = threading.Thread(target=save_file, args=(i[0],True,dst_list ))
threads.append(t)
t.start()
elif(cmd=="get"):
print("get file from ip_list.")
for i in ip_list:
t = threading.Thread(target=get_file, args=(i[0],i[1],get_list ))
threads.append(t)
t.start()
elif(cmd=="cmd"):
print("send cmd to ip_list")
for i in ip_list:
t = threading.Thread(target=send_cmd, args=(i[0],cmd_list ))
threads.append(t)
t.start()
elif(cmd=="load"):
load_file("192.168.80.188",src_list)
#等待所有线程任务结束。
for t in threads:
t.join()
print("all task were end.")
if __name__ == "__main__":
run()