!312 冒烟测试历史冗余文件删除

Merge pull request !312 from 严学舟/master
This commit is contained in:
openharmony_ci
2024-03-29 02:52:26 +00:00
committed by Gitee
5 changed files with 0 additions and 1305 deletions
View File
@@ -1,498 +0,0 @@
#-*- coding:utf-8 -*-
import uuid
import sys
import subprocess
import os
import serial
from core.base import BaseApp, dec_stepmsg
from util.file_locker import FileLock
from util.log_info import logger
from util.time_info import get_now_time_str_info, get_now_time_info, Timeout, timeout
from aw.Telnet.TelnetClient import TelConnect
from aw.Common.Constant import CONSTANT
from aw.Download.Download import *
from aw.Common.Common import getHostIp, copyFile, copyDirectory
from aw.ExtractFile.ExtractFile import *
from aw.poweronoff.serial_power_on_off import usbPowerOnOff
lock_suffix = CONSTANT.File.LOCK_SUFFIX #通过文件锁实现并发下载
suc_file = CONSTANT.File.SUC_FILE #通过本文件是区分版本是否成功下载
failed_file = CONSTANT.File.FAILED_FILE #通过本文件是标记文件下载失败
READ_MAXTIMEOUT = 120
READ_TIMEOUT = 30
READ_MINITIMEOUT = 5
uboot_finish = 'hisilicon #'
cmd_finish = ' #'
class liteOsUpgrade_L1_shequ_dv(BaseApp):
'''
@author: w00278233
'''
def __init__(self, param_file):
super().__init__(param_file)
self.param_List = ["deploy_com",
"usb_port",
"upgrade_upgradeLocation"]
@dec_stepmsg("hongmeng L1 flash")
def excute(self):
'''
#===================================================================================
# @Method: excute(self)
# @Precondition: none
# @Func: 升级执行入口
# @PostStatus: none
# @eg: excute()
# @return: True or Flase
#===================================================================================
'''
step_index = self.params_dict.get("step_list").index("liteOsUpgrade_L1_shequ_dv_app")
# 执行下载
try:
if not self.download():
CONSTANT.ENVERRMESSAGE = "image download fail"
logger.printLog(CONSTANT.ENVERRMESSAGE)
return False
except Exception as e:
raise e
# 执行升级
try:
if not self.upgrade():
CONSTANT.ENVERRMESSAGE = "board upgrade fail"
logger.printLog(CONSTANT.ENVERRMESSAGE)
return False
return True
except Exception as e:
raise e
@dec_stepmsg("download")
@timeout(1800)
def download(self):
'''
#===================================================================================
# @Method: download(self)
# @Precondition: none
# @Func: 构建下载到本地的路径,执行相应包的下载
# @PostStatus: none
# @eg: download()
# @return: True or Flase
#===================================================================================
'''
global version_savepath, version_name
dir_path = CONSTANT.Path.getDirPath()
if self.params_dict.get("pbiid"):
version_path = self.params_dict.get("pbiid")
version_name = str(uuid.uuid5(uuid.NAMESPACE_URL, str(self.params_dict.get("pbiid")) + "FASTBOOT"))
version_savepath = os.path.join(dir_path, self.params_dict.get("flash_type"), version_name)
else:
version_path = self.params_dict.get("upgrade_upgradeLocation")
version_name = str(uuid.uuid5(uuid.NAMESPACE_URL, (self.params_dict.get("upgrade_upgradeLocation"))))
version_savepath = os.path.join(dir_path, version_name)
if self.params_dict.get("isDownload") == "True":
logger.printLog("不需要做下载,直接返回")
return True
#执行img下载
import hashlib
save_file_str = version_path.replace("/", "").replace("\\", "")
save_file_name = hashlib.sha1(save_file_str.encode("utf-8")).hexdigest()
logger.info("download hash string:%s, hash value:%s" % (save_file_str, save_file_name))
save_path_file = os.path.join(dir_path, "record", "%s%s" % (save_file_name, ".txt"))
if not self.excutedown(version_path, os.path.join(version_savepath, "img"), save_path_file, False):
logger.error("download img fail")
return False
#保存本地版本路径给devicetest去版本路径下取用例
saveVersion(save_path_file, os.path.join(version_savepath, "img"))
#将本地版本push到远程tftp服务器
tftp_ip = self.params_dict.get("Tftpserver_IP")
if tftp_ip:
box_ip = subprocess.getoutput("ipconfig")
logger.info("current box ip is: %s" % box_ip)
if not tftp_ip in box_ip:
logger.info("start to send file")
return self.pushFileToTftpServer(tftp_ip, os.path.join(version_savepath, "img"), version_name)
return True
def pushFileToTftpServer(self, tftp_ip, local_file_path, dis_path, username="root", passwd="devicetest@2012"):
push_suc = os.path.join(local_file_path, "push_succ.txt")
push_fail = os.path.join(local_file_path, "push_fail.txt")
push_lock = os.path.join(local_file_path, "push.lock")
if os.path.isfile(push_suc):
logger.info("push file to tftpserver by other process.")
return True
elif os.path.isfile(push_fail):
logger.info("%s exists. Other process has push package and failed. It will push by self" % push_fail)
os.remove(push_fail)
else:
if os.path.isfile(push_lock):
logger.info("wait for other process send succ")
ret = waitotherdown(push_suc)
return ret
file_lock = FileLock()
file_lock.lockFile(push_lock)
try:
import paramiko
logger.info("ip: %s, source_path: %s" % (tftp_ip, local_file_path))
#client = paramiko.Transport((tftp_ip,22), default_window_size=3072)
client = paramiko.Transport((tftp_ip,22))
client.connect(username=username,password=passwd)
sftp = paramiko.SFTPClient.from_transport(client)
#检查tftp服务器根目录,/data或/data/data
ret = sftp.listdir(r"/data")
server_base_dir = "/data/MobileUpgrade/local_img"
if "data" in ret:
server_base_dir = "/data/data/MobileUpgrade/local_img"
logger.info("server base dir is : %s " % server_base_dir)
#检查tftp服务器上有没有本次的版本目录,如果没有则创建文件夹
ret = sftp.listdir(server_base_dir)
server_des_path = "%s/%s" % (server_base_dir, dis_path)
if not dis_path in ret:
logger.info("mkdir in tftpserver: %s " % server_des_path)
sftp.mkdir(server_des_path)
server_img_path = "%s/%s/img" % (server_base_dir, dis_path)
logger.info("mkdir in tftpserver: %s " % server_img_path)
sftp.mkdir(server_img_path)
remote_path = "%s/%s/img" % (server_base_dir, dis_path)
logger.info("%s exists." % remote_path)
ret = sftp.listdir(remote_path)
#如果tftp服务器上有push_succ文件夹,则说明已经由其它进程或box把版本上传成功了。
if "push_succ" in ret:
logger.info("send file succ by other process")
with open(push_suc, "a+") as fp:
fp.write("")
return True
#如果tftp服务器上有push.lock文件夹,则说明有其它进程在向tftp服务器发送版本,等待其它进程发送完毕。
elif "push.lock" in ret:
logger.info("wait for other process")
i = 0
while True:
time.sleep(10)
ret = sftp.listdir(remote_path)
if "push_succ" in ret:
logger.info("other process succ")
return True
if i > 6:
logger.info("wait 60s, other process failed")
break
i = i + 1
#由本进程向tftp服务器发送版本,先创建push.lock占用上传资源
logger.info("mkdir in tftpserver: %s/push.lock " % remote_path)
sftp.mkdir("%s/push.lock" % remote_path)
pushfilelist = ["OHOS_Image.bin", "rootfs.img", "userfs.img", "rootfs_vfat.img", "userfs_vfat.img", "rootfs_jffs2.img", "userfs_jffs2.img"]
for filename in pushfilelist:
if not os.path.exists(os.path.join(local_file_path, filename)):
continue
logger.info("copy %s to %s" % (os.path.join(local_file_path, filename), "%s/%s" % (remote_path, filename)))
try:
sftp.put(os.path.join(local_file_path, filename), "%s/%s" % (remote_path, filename))
except Exception as e:
logger.info("retry, copy %s to %s" % (os.path.join(local_file_path, filename), "%s/%s" % (remote_path, filename)))
sftp.put(os.path.join(local_file_path, filename), "%s/%s" % (remote_path, filename))
#创建上传成功标识
logger.info("mkdir in tftpserver: %s/push_succ " % remote_path)
sftp.mkdir("%s/push_succ" % remote_path)
#删除占用标识
logger.info("del %s/push.lock " % remote_path)
sftp.rmdir("%s/push.lock" % remote_path)
with open(push_suc, "a+") as fp:
fp.write("")
time.sleep(10)
return True
except (OSError, Exception) as exception:
logger.error("copy to file to tftp server failed with error {}".format(exception))
logger.info("del %s/%s " % (server_base_dir, dis_path))
sftp.rmdir("%s/%s" % (server_base_dir, dis_path))
client.close()
with open(push_fail, "a+") as fp:
fp.write("")
return False
finally:
logger.info("close client")
client.close()
def excutedown(self, source_path, download_dir, suc_mark, is_file):
'''
#===================================================================================
# @Method: excutedown(source_path, download_dir, is_file)
# @Precondition: none
# @Func: 执行下载动作
# @PostStatus: none
# @Param: source_path:资源文件路径
# download_dir:文件下载到本地的文件夹路径
# is_file:是否是文件
#
# @eg: excutedown("xxxx", "D:\\local\\image", Flase os_method)
# @return: True or Flase
#===================================================================================
'''
failed_mark = os.path.join(download_dir, failed_file)
lock_path = os.path.join(download_dir, lock_suffix)
file_lock = FileLock()
if isDownLoadSuccess(download_dir, suc_mark, failed_mark):
return True
try:
nowtime = get_now_time_str_info()
logger.printLog("%s Downloading, please wait" % nowtime)
file_lock.lockFile(lock_path)
ret = ""
logger.info("Get lock. Start to ")
if self.params_dict.get("bt_enable") and self.params_dict.get("bt_enable") == "True":
ret = downloadByBitComet(source_path, download_dir, os_method)
elif source_path.startswith('\\\\'):
ret = downloadByCopy(source_path, download_dir, is_file)
elif self.params_dict.get("pbiid"):
ret = downlaodByDownloadTool(version_savepath, self.params_dict.get("version_type"), "FASTBOOT", self.params_dict.get("pbiid"))
elif source_path.startswith("http"):
ret = downloadFileFromDevCloud(source_path, "", "", download_dir)
if source_path.endswith(".zip"):
zip_name = os.path.basename(source_path)
ret = extractZipFile(os.path.join(download_dir, zip_name), download_dir)
if source_path.endswith(".tar.gz") or (source_path.startswith("http") and ("file_id=" in source_path)):
if source_path.startswith("http") and ("file_id=" in source_path):
if source_path.endswith(".tar.gz"):
zip_name = source_path.split('=')[-1]
else:
zip_name = "out.tar.gz"
else:
zip_name = os.path.basename(source_path)
ret = unTarFile(os.path.join(download_dir, zip_name), download_dir)
nowtime = get_now_time_str_info()
logger.printLog("%s download to %s end" % (nowtime, download_dir))
if not ret:
with open(failed_mark, "a+") as fp:
fp.write("")
return ret
except Exception as e:
logger.printLog(e)
raise Exception(e)
finally:
file_lock.releaseFile()
@dec_stepmsg("upgrade")
#@timeout(900)
def upgrade(self):
'''
#===================================================================================
# @Method: upgrade(self)
# @Precondition: none
# @Func: 升级相关业务逻辑
# @PostStatus: none
# @eg: upgrade()
# @return: True or Flase
#===================================================================================
'''
deploy_com = self.params_dict.get("deploy_com")
usb_port = self.params_dict.get("usb_port")
baudrate = self.params_dict.get("baudrate")
tftp_ip = self.params_dict.get("Tftpserver_IP")
device_ip = self.params_dict.get("Device_IP")
device_Mac = self.params_dict.get("Device_MAC")
device_netmask = self.params_dict.get("Device_Netmask")
device_gatewayip = self.params_dict.get("Device_GatewayIP")
#芯片类型,根据芯片类型获取对应的刷机命令
flash_type = self.params_dict.get("flash_type")
if not deploy_com:
logger.error("deploy_com is NULL !!")
return False
if not baudrate:
baudrate = 115200
if not device_netmask:
device_netmask = "255.255.252.0"
if not device_Mac:
device_Mac = "3a:82:d0:08:f4:99"
local_image_path = "%s/%s" % (version_name, "img")
scriptpath = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))))
scriptfile = os.path.join(scriptpath, "resource", "L1", "dv300_shequ", "update.txt")
logger.info("upgrade scriptfile is: %s" % scriptfile)
if not os.path.exists(scriptfile):
logger.error("%s is not exit" % scriptfile)
return False
logger.info("open com")
ser = serial.Serial(deploy_com, int(baudrate), timeout=1)
try:
logger.info("打开serial")
if ser.is_open == False:
ser.open()
logger.info("获取单板状态")
board_type = getBoardType(ser)
if board_type != "uboot":
sendResetCmd(ser, READ_TIMEOUT)
board_type = getBoardType(ser)
if board_type == "bootrom":
if not recoveryBoard(ser, usb_port):
logger.error("recovery board fail, please check board")
return False
with open(scriptfile, "r") as fp:
lines = fp.readlines()
for line in lines:
#line = line.strip()
if not line:
logger.info("cmd is: %s " % line)
continue
if "%Tftpserver_IP%" in line:
line = line.replace("%Tftpserver_IP%", tftp_ip)
if "%Device_IP%" in line:
line = line.replace("%Device_IP%", device_ip)
if "%Device_MAC%" in line:
line = line.replace("%Device_MAC%", device_Mac)
if "%Device_Netmask%" in line:
line = line.replace("%Device_Netmask%", device_netmask)
if "%Device_GatewayIP%" in line:
line = line.replace("%Device_GatewayIP%", device_gatewayip)
if "userfs.img" in line:
if not os.path.exists(os.path.join(version_savepath, "img", "userfs.img")):
line = line.replace("userfs.img", "userfs_vfat.img")
if "rootfs.img" in line:
if not os.path.exists(os.path.join(version_savepath, "img", "rootfs.img")):
line = line.replace("rootfs.img", "rootfs_vfat.img")
if "tftp" in line:
packagefile_path = "/%s" % flash_type
new_packagefile_path = "/%s" % local_image_path
line = line.replace(packagefile_path, new_packagefile_path)
ret = sendCmd(ser, line, "hisilicon #", READ_MAXTIMEOUT)
if "retry count exceeded; starting again" in ret.lower():
logger.info("tftp cmd retry again!!")
ret = sendCmd(ser, line, "hisilicon #", READ_MAXTIMEOUT)
if "error:" in ret.lower():
logger.error("tftp fail")
return False
continue
if "reset" in line:
ret = sendCmd(ser, line, "OHOS #", READ_TIMEOUT)
continue
ret = sendCmd(ser, line, " #", READ_MINITIMEOUT)
board_type = getBoardType(ser)
if board_type == "OHOS":
logger.info("upgrade success")
init_cmd = "ifconfig eth0 %s netmask %s gateway %s \r" % (device_ip, device_netmask, device_gatewayip)
sendCmd(ser, init_cmd, "OHOS #", READ_MINITIMEOUT)
sendCmd(ser, 'ifconfig\r', "OHOS #", READ_MINITIMEOUT)
return True
else:
logger.info("upgrade fail")
return False
except Exception as e:
logger.printLog(e)
return False
finally:
ser.close()
logger.info("close serial")
def boardPowerOn(usb_port):
logger.info("board power on start")
#对端口下电
if not usbPowerOnOff('127.0.0.1', '7788', usb_port, "off"):
logger.error("board power off failed")
return False
#对端口上电
if not usbPowerOnOff('127.0.0.1', '7788', usb_port, "on"):
logger.error("board power on failed")
return False
logger.info("board power on end")
def getBoardType(ser):
ret = sendCmd(ser, '\r', " #", READ_MINITIMEOUT)
if 'HMOS' in ret or 'OHOS' in ret:
ostype = 'OHOS'
elif 'hisilicon' in ret:
ostype = 'uboot'
elif ' #' in ret:
ostype = 'linux'
else:
ostype = 'bootrom'
logger.info("board type is: %s" % ostype)
return ostype
def sendCmd(ser, cmd, endtag, timeout):
ser.reset_input_buffer()
logger.info("cmd is: %s " % cmd)
ser.write((cmd + '\n').encode())
time.sleep(0.5)
i = 0
ret = ''
while True:
out = ser.read(ser.inWaiting())
ret = ret + out.decode(encoding="utf-8", errors="ignore")
if endtag in ret:
logger.info("cmd end")
break
time.sleep(1)
i = i + 1
if i > timeout:
logger.info("cmd timeout")
break
logger.info("result is: %s " % ret)
return ret
def sendResetCmd(ser, timeout):
logger.info("send reset")
ser.reset_input_buffer()
ser.write(b"reset \r\n")
ret = ser.read(ser.inWaiting())
time.sleep(3)
#logger.info("result is: %s " % ret)
ser.write(b"\r\n")
ret = ser.read(ser.inWaiting())
logger.info("result is: %s " % ret)
ser.write(b"\r\n")
ret = ser.read(ser.inWaiting())
logger.info("result is: %s " % ret)
ser.write(b"\r\n")
ret = ser.read(ser.inWaiting())
logger.info("result is: %s " % ret)
return ret
def recoveryBoard(ser, usb_port):
logger.info("start recovery board")
boardPowerOn(usb_port)
#再发送回车
ser.write(b"\r\n")
time.sleep(0.5)
ret = ser.read(ser.inWaiting())
logger.info("result is: %s " % ret)
ser.write(b"\r\n")
time.sleep(0.5)
ret = ser.read(ser.inWaiting())
logger.info("result is: %s " % ret)
board_type = getBoardType(ser)
if board_type == "bootrom":
logger.error("recovery board failed")
return False
logger.info("recovery board succ")
return True
if __name__ == "__main__":
param_file = sys.argv[1]
if not param_file:
logger.printLog("Missing params file")
sys.exit(-1)
try:
uphandle = liteOsUpgrade_L1(param_file)
uphandle._excuteApp()
except Exception as e:
logger.printLog(e)
sys.exit(-1)
@@ -1,443 +0,0 @@
#-*- coding:utf-8 -*-
import uuid
import sys
import subprocess
import os
import serial
from core.base import BaseApp, dec_stepmsg
from util.file_locker import FileLock
from util.log_info import logger
from util.time_info import get_now_time_str_info, get_now_time_info, Timeout, timeout
from aw.Telnet.TelnetClient import TelConnect
from aw.Common.Constant import CONSTANT
from aw.Download.Download import *
from aw.Common.Common import getHostIp, copyFile, copyDirectory
from aw.ExtractFile.ExtractFile import *
from aw.poweronoff.serial_power_on_off import usbPowerOnOff
lock_suffix = CONSTANT.File.LOCK_SUFFIX #通过文件锁实现并发下载
suc_file = CONSTANT.File.SUC_FILE #通过本文件是区分版本是否成功下载
failed_file = CONSTANT.File.FAILED_FILE #通过本文件是标记文件下载失败
READ_MAXTIMEOUT = 60
READ_TIMEOUT = 30
READ_MINITIMEOUT = 5
uboot_finish = 'hisilicon #'
cmd_finish = ' #'
class liteOsUpgrade_L1_shequ_test(BaseApp):
'''
@author: w00278233
'''
def __init__(self, param_file):
super().__init__(param_file)
self.param_List = ["deploy_com",
"usb_port",
"upgrade_upgradeLocation"]
@dec_stepmsg("hongmeng L1 flash")
def excute(self):
'''
#===================================================================================
# @Method: excute(self)
# @Precondition: none
# @Func: 升级执行入口
# @PostStatus: none
# @eg: excute()
# @return: True or Flase
#===================================================================================
'''
step_index = self.params_dict.get("step_list").index("liteOsUpgrade_L1_shequ_test_app")
# 执行下载
try:
if not self.download():
CONSTANT.ENVERRMESSAGE = "image download fail"
logger.printLog(CONSTANT.ENVERRMESSAGE)
return False
except Exception as e:
raise e
# 执行升级
try:
if not self.upgrade():
CONSTANT.ENVERRMESSAGE = "board upgrade fail"
logger.printLog(CONSTANT.ENVERRMESSAGE)
return False
return True
except Exception as e:
raise e
@dec_stepmsg("download")
@timeout(1800)
def download(self):
'''
#===================================================================================
# @Method: download(self)
# @Precondition: none
# @Func: 构建下载到本地的路径,执行相应包的下载
# @PostStatus: none
# @eg: download()
# @return: True or Flase
#===================================================================================
'''
global version_savepath, version_name
dir_path = CONSTANT.Path.getDirPath()
if self.params_dict.get("pbiid"):
version_path = self.params_dict.get("pbiid")
version_name = str(uuid.uuid5(uuid.NAMESPACE_URL, str(self.params_dict.get("pbiid")) + "FASTBOOT"))
version_savepath = os.path.join(dir_path, self.params_dict.get("flash_type"), version_name)
else:
version_path = self.params_dict.get("upgrade_upgradeLocation")
version_name = str(uuid.uuid5(uuid.NAMESPACE_URL, (self.params_dict.get("upgrade_upgradeLocation"))))
version_savepath = os.path.join(dir_path, version_name)
if self.params_dict.get("isDownload") == "True":
logger.printLog("不需要做下载,直接返回")
return True
#执行img下载
import hashlib
save_file_str = version_path.replace("/", "").replace("\\", "")
save_file_name = hashlib.sha1(save_file_str.encode("utf-8")).hexdigest()
logger.info("download hash value:%s" % (save_file_name))
save_path_file = os.path.join(dir_path, "record", "%s%s" % (save_file_name, ".txt"))
if not self.excutedown(version_path, os.path.join(version_savepath, "img"), save_path_file, False):
logger.error("download img fail")
return False
#保存本地版本路径给devicetest去版本路径下取用例
saveVersion(save_path_file, os.path.join(version_savepath, "img"))
return True
def excutedown(self, source_path, download_dir, suc_mark, is_file):
'''
#===================================================================================
# @Method: excutedown(source_path, download_dir, is_file)
# @Precondition: none
# @Func: 执行下载动作
# @PostStatus: none
# @Param: source_path:资源文件路径
# download_dir:文件下载到本地的文件夹路径
# is_file:是否是文件
#
# @eg: excutedown("xxxx", "D:\\local\\image", Flase os_method)
# @return: True or Flase
#===================================================================================
'''
failed_mark = os.path.join(download_dir, failed_file)
lock_path = os.path.join(download_dir, lock_suffix)
file_lock = FileLock()
if isDownLoadSuccess(download_dir, suc_mark, failed_mark):
return True
try:
nowtime = get_now_time_str_info()
logger.printLog("%s Downloading, please wait" % nowtime)
file_lock.lockFile(lock_path)
ret = ""
logger.info("Get lock. Start to ")
if self.params_dict.get("bt_enable") and self.params_dict.get("bt_enable") == "True":
ret = downloadByBitComet(source_path, download_dir, os_method)
elif source_path.startswith('\\\\'):
ret = downloadByCopy(source_path, download_dir, is_file)
elif self.params_dict.get("pbiid"):
ret = downlaodByDownloadTool(version_savepath, self.params_dict.get("version_type"), "FASTBOOT", self.params_dict.get("pbiid"))
elif source_path.startswith("http"):
ret = downloadFileFromDevCloud(source_path, "", "", download_dir)
if source_path.endswith(".zip"):
zip_name = os.path.basename(source_path)
ret = extractZipFile(os.path.join(download_dir, zip_name), download_dir)
if source_path.endswith(".tar.gz") or (source_path.startswith("http") and ("file_id=" in source_path)):
if source_path.startswith("http") and ("file_id=" in source_path):
if source_path.endswith(".tar.gz"):
zip_name = source_path.split('=')[-1]
else:
zip_name = "out.tar.gz"
else:
zip_name = os.path.basename(source_path)
ret = unTarFile(os.path.join(download_dir, zip_name), download_dir)
nowtime = get_now_time_str_info()
logger.printLog("%s download to %s end" % (nowtime, download_dir))
if not ret:
with open(failed_mark, "a+") as fp:
fp.write("")
return ret
except Exception as e:
logger.printLog(e)
raise Exception(e)
finally:
file_lock.releaseFile()
@dec_stepmsg("upgrade")
#@timeout(900)
def upgrade(self):
'''
#===================================================================================
# @Method: upgrade(self)
# @Precondition: none
# @Func: 升级相关业务逻辑
# @PostStatus: none
# @eg: upgrade()
# @return: True or Flase
#===================================================================================
'''
logger.printLog('开始升级')
deploy_com = self.params_dict.get("deploy_com")
usb_port = self.params_dict.get("usb_port")
baudrate = self.params_dict.get("baudrate")
#芯片类型,根据芯片类型获取对应的刷机命令
flash_type = self.params_dict.get("flash_type")
burn_usbport = self.params_dict.get("hiburn_usbport")
device_ip = self.params_dict.get("Device_IP")
device_netmask = self.params_dict.get("Device_Netmask")
device_gatewayip = self.params_dict.get("Device_GatewayIP")
chip_version = self.params_dict.get('chip_version')
chip_version = chip_version.lower() if chip_version else chip_version
if not deploy_com:
logger.error("deploy_com is NULL !!")
return False
if not burn_usbport:
logger.error("hiburn_usbport is NULL !!")
return False
if not baudrate:
baudrate = 115200
scriptpath = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))))
#升级需要的工具归档
logger.printLog('归档工具')
toolworkspace = CONSTANT.OSType.getworkspace()
hiburntoolpath = os.path.join(toolworkspace, "HiBurnCmdLine", "usb%s_tool" % burn_usbport)
logger.info("hiburn tool path is: %s" % hiburntoolpath)
if not os.path.exists(hiburntoolpath):
if not burn_usbport:
logger.error("hiburn_usbport is NULL !!")
return False
os.makedirs(hiburntoolpath)
toolpath = os.path.join(scriptpath, "resource", "HiBurnCmdLine.zip")
logger.info("copy %s to %s" % (toolpath, hiburntoolpath))
copyFile(toolpath, hiburntoolpath)
zip_name = os.path.basename(toolpath)
ret = extractZipFile(os.path.join(hiburntoolpath, zip_name), hiburntoolpath)
if ret:
logger.info("unzip to %s succ" % (hiburntoolpath))
#修改burn.config中的usb口
configpath = os.path.join(hiburntoolpath, "config", "burn.config")
all_data = ""
with open(configpath, "r", encoding="utf-8") as cf:
for line in cf:
if "usbDeviceNumber=" in line:
old_str = line
line = line.replace(old_str, "usbDeviceNumber=%s\r\n" % burn_usbport)
logger.info("replace line: %s " % line)
all_data += line
with open(configpath, "w", encoding="utf-8") as wf:
wf.write(all_data)
else:
logger.error("%s is not exit" % hiburntoolpath)
return False
#将升级需要的文件拷贝到镜像里面
logger.printLog('拷贝镜像')
local_image_path = os.path.join(version_savepath, "img")
old_xml_path = os.path.join(scriptpath, "resource", "L1", flash_type, "usb-burn.xml")
xml_path = os.path.join(local_image_path, "usb-burn.xml")
if chip_version == 'hi3518':
old_xml_path = os.path.join(scriptpath, "resource", "L1", flash_type, "usb-burn-jffs2.xml")
elif chip_version == 'hi3516':
old_xml_path = os.path.join(scriptpath, "resource", "L1", flash_type, "usb-burn-vfat.xml")
copyFile(old_xml_path, xml_path)
if flash_type.lower() == "ev300":
chip_type = "Hi3518EV300"
ubootpath = os.path.join(scriptpath, "resource", "L1", flash_type.lower(), "u-boot-hi3518ev300.bin")
elif flash_type.lower() == "dv300":
chip_type = "Hi3516DV300"
ubootpath = os.path.join(scriptpath, "resource", "L1", flash_type.lower(), "u-boot-hi3516dv300.bin")
else:
logger.error("flash_type is : %s " % flash_type)
return False
copyFile(ubootpath, local_image_path)
scriptfile = os.path.join(scriptpath, "resource", "L1", flash_type.lower(), "update.txt")
from threading import Thread
thread = Thread(target=boardPowerOn, args=[usb_port, 10])
thread.start()
current_path = os.getcwd()
logger.info("before excute hiburn,current path is: %s" % current_path)
os.chdir(hiburntoolpath)
logger.info("excute hiburn path is: %s" % os.getcwd())
#擦除fastboot
logger.printLog('擦除fastboot')
flash_uboot_xml = os.path.join(scriptpath, "resource", "L1", flash_type.lower(), "flash_fastboot.xml")
cmd = ".\jre\\bin\java -jar hiburn.jar --erase -n %s -m serial %s -x %s" % (chip_type, deploy_com.upper(), flash_uboot_xml)
logger.info("cmd is: %s" % cmd)
ret, outpri = subprocess.getstatusoutput(cmd)
logger.info("flash fastboot result: %s " % ret)
logger.info("print console: %s " % outpri)
retry = 0
while retry < 2:
#usb刷机
logger.printLog('开始刷机')
cmd = ".\jre\\bin\java -jar hiburn.jar --burn -n %s -m USBBootrom -x %s" % (chip_type, xml_path)
logger.info("cmd is: %s" % cmd)
ret, outpri = subprocess.getstatusoutput(cmd)
logger.info("usb upgrade result: %s " % ret)
logger.info("print console: %s " % outpri)
if ret != 0:
if ret == 4:
time.sleep(10)
retry = retry + 1
logger.printLog('刷机未成功再刷一次')
continue
logger.printLog(ret)
logger.error("hiburn usb upgrade failed!!")
return False
retry = retry + 3
os.chdir(current_path)
logger.info("hiburn upgrade end, check board status")
time.sleep(5)
ser = serial.Serial(deploy_com, int(baudrate), timeout=1)
reset_count = 0
try:
while reset_count < 2:
logger.info("打开serial")
if ser.is_open == False:
ser.open()
logger.info("获取单板状态")
board_type = getBoardType(ser)
logger.printLog('before reset')
logger.printLog(f'board_type:{board_type}')
if board_type == "uboot":
with open(scriptfile, "r") as fp:
lines = fp.readlines()
for line in lines:
if not line:
logger.info("cmd is: %s " % line)
continue
if "reset" in line:
ret = sendCmd(ser, line, READ_MAXTIMEOUT)
continue
ret = sendCmd(ser, line, READ_MINITIMEOUT)
board_type = getBoardType(ser)
logger.printLog('after reset')
logger.printLog(f'board_type:{board_type}')
if True:
reset_count += 1
logger.printLog('再次重启')
continue
time.sleep(1000)
if flash_type.lower() == "dv300":
logger.info("upgrade success")
init_cmd = "ifconfig eth0 %s netmask %s gateway %s \r" % (device_ip, device_netmask, device_gatewayip)
sendCmd(ser, init_cmd, READ_MINITIMEOUT)
sendCmd(ser, 'ifconfig\r', READ_MINITIMEOUT)
return True
elif flash_type.lower() == "ev300":
logger.info("setup wifi")
cmd = 'ls\r'
ret = sendCmd(ser, cmd, READ_MINITIMEOUT)
if not "sdcard" in ret.lower():
cmd = 'mkdir /sdcard\r'
ret = sendCmd(ser, cmd, READ_MINITIMEOUT)
if "error:" in ret.lower():
logger.error("mkdir /sdcard fail")
return False
cmd = 'mount /dev/mmcblk0p0 /sdcard vfat\r'
ret = sendCmd(ser, cmd, READ_MINITIMEOUT)
cmd = 'ls /sdcard\r'
ret = sendCmd(ser, cmd, READ_MINITIMEOUT)
cmd = 'cd /sdcard/wpa\r'
ret = sendCmd(ser, cmd, READ_MINITIMEOUT)
cmd = 'exec wpa_supplicant -i wlan0 -c wpa_supplicant.conf \r'
ret = sendCmd(ser, cmd, READ_MAXTIMEOUT)
if "error:" in ret.lower():
logger.error("setup wifi fail")
return False
cmd = 'ifconfig\r'
ret = sendCmd(ser, cmd, READ_MINITIMEOUT)
if "error:" in ret.lower():
logger.error("ifconfig fail")
return False
logger.info("upgrade success")
return True
else:
logger.error("upgrade fail")
return False
except Exception as e:
logger.printLog(e)
return False
finally:
ser.close()
logger.info("close serial")
def boardPowerOn(usb_port, waittime):
logger.info("board power on start")
time.sleep(waittime)
#对端口下电
if not usbPowerOnOff('127.0.0.1', '7788', usb_port, "off"):
logger.error("board power off failed")
return False
#对端口上电
if not usbPowerOnOff('127.0.0.1', '7788', usb_port, "on"):
logger.error("board power on failed")
return False
logger.info("board power on end")
def getBoardType(ser):
ret = sendCmd(ser, '\r', READ_TIMEOUT)
if 'HMOS' in ret or 'OHOS' in ret:
ostype = 'OHOS'
elif 'hisilicon' in ret:
ostype = 'uboot'
elif ' #' in ret:
ostype = 'linux'
else:
ostype = 'bootrom'
logger.info("board type is: %s" % ostype)
return ostype
def sendCmd(ser, cmd, timeout):
logger.info("cmd is: %s " % cmd)
ser.write((cmd + '\n').encode())
time.sleep(0.5)
ret = ''
i = 0
while True:
out = ser.read(ser.inWaiting())
if not out:
break
if i > 2:
break
ret = ret + out.decode(encoding="utf-8", errors="ignore")
time.sleep(timeout)
i = i + 1
logger.info("result is: %s " % ret)
return ret
if __name__ == "__main__":
param_file = sys.argv[1]
if not param_file:
logger.printLog("Missing params file")
sys.exit(-1)
try:
uphandle = liteOsUpgrade_L1(param_file)
uphandle._excuteApp()
except Exception as e:
logger.printLog(e)
sys.exit(-1)
@@ -1,364 +0,0 @@
#-*- coding:utf-8 -*-
import uuid
import sys
import subprocess
import os
import serial
from core.base import BaseApp, dec_stepmsg
from util.file_locker import FileLock
from util.log_info import logger
from util.time_info import get_now_time_str_info, get_now_time_info, Timeout, timeout
from aw.Telnet.TelnetClient import TelConnect
from aw.Common.Constant import CONSTANT
from aw.Download.Download import *
from aw.Common.Common import getHostIp, copyFile, copyDirectory
from aw.ExtractFile.ExtractFile import *
from aw.poweronoff.serial_power_on_off import usbPowerOnOff
from threading import Thread
lock_suffix = CONSTANT.File.LOCK_SUFFIX #通过文件锁实现并发下载
suc_file = CONSTANT.File.SUC_FILE #通过本文件是区分版本是否成功下载
failed_file = CONSTANT.File.FAILED_FILE #通过本文件是标记文件下载失败
READ_MAXTIMEOUT = 20
READ_TIMEOUT = 30
READ_MINITIMEOUT = 5
uboot_finish = 'hisilicon #'
cmd_finish = ' #'
class liteOsUpgrade_L2(BaseApp):
def __init__(self, param_file):
super().__init__(param_file)
self.param_List = ["deploy_com",
"usb_port",
"upgrade_upgradeLocation"]
@dec_stepmsg("hongmeng L2 flash")
def excute(self):
'''
#===================================================================================
# @Method: excute(self)
# @Precondition: none
# @Func: 升级执行入口
# @PostStatus: none
# @eg: excute()
# @return: True or Flase
#===================================================================================
'''
step_index = self.params_dict.get("step_list").index("liteOsUpgrade_L2_app")
# 执行下载
try:
if not self.download():
CONSTANT.ENVERRMESSAGE = "image download fail"
logger.printLog(CONSTANT.ENVERRMESSAGE)
return False
except Exception as e:
raise e
# 执行升级
try:
if not self.upgrade():
CONSTANT.ENVERRMESSAGE = "board upgrade fail"
logger.printLog(CONSTANT.ENVERRMESSAGE)
return False
return True
except Exception as e:
raise e
@dec_stepmsg("download")
@timeout(18000)
def download(self):
'''
#===================================================================================
# @Method: download(self)
# @Precondition: none
# @Func: 构建下载到本地的路径,执行相应包的下载
# @PostStatus: none
# @eg: download()
# @return: True or Flase
#===================================================================================
'''
global version_savepath, version_name
dir_path = CONSTANT.Path.getDirPath()
if self.params_dict.get("pbiid"):
version_path = self.params_dict.get("pbiid")
version_name = str(uuid.uuid5(uuid.NAMESPACE_URL, str(self.params_dict.get("pbiid")) + "FASTBOOT"))
version_savepath = os.path.join(dir_path, self.params_dict.get("flash_type"), version_name)
else:
version_path = self.params_dict.get("upgrade_upgradeLocation")
version_name = str(uuid.uuid5(uuid.NAMESPACE_URL, (self.params_dict.get("upgrade_upgradeLocation"))))
version_savepath = os.path.join(dir_path, version_name)
if self.params_dict.get("isDownload") == "True":
logger.printLog("不需要做下载,直接返回")
return True
#执行img下载
import hashlib
save_file_str = version_path.replace("/", "").replace("\\", "")
save_file_name = hashlib.sha1(save_file_str.encode("utf-8")).hexdigest()
logger.info("download hash value:%s" % (save_file_name))
save_path_file = os.path.join(dir_path, "record", "%s%s" % (save_file_name, ".txt"))
logger.printLog('save_path_file: %s' % save_path_file)
if not self.excutedown(version_path, os.path.join(version_savepath, "img"), save_path_file, False):
logger.error("download img fail")
return False
#保存本地版本路径给devicetest去版本路径下取用例
saveVersion(save_path_file, os.path.join(version_savepath, "img"))
return True
def excutedown(self, source_path, download_dir, suc_mark, is_file):
'''
#===================================================================================
# @Method: excutedown(source_path, download_dir, is_file)
# @Precondition: none
# @Func: 执行下载动作
# @PostStatus: none
# @Param: source_path:资源文件路径
# download_dir:文件下载到本地的文件夹路径
# is_file:是否是文件
#
# @eg: excutedown("xxxx", "D:\\local\\image", Flase os_method)
# @return: True or Flase
#===================================================================================
'''
failed_mark = os.path.join(download_dir, failed_file)
lock_path = os.path.join(download_dir, lock_suffix)
file_lock = FileLock()
if isDownLoadSuccess(download_dir, suc_mark, failed_mark):
return True
try:
nowtime = get_now_time_str_info()
logger.printLog("%s Downloading, please wait" % nowtime)
file_lock.lockFile(lock_path)
ret = ""
logger.info("Get lock. Start to ")
if self.params_dict.get("bt_enable") and self.params_dict.get("bt_enable") == "True":
ret = downloadByBitComet(source_path, download_dir, os_method)
elif source_path.startswith('\\\\'):
ret = downloadByCopy(source_path, download_dir, is_file)
elif self.params_dict.get("pbiid"):
ret = downlaodByDownloadTool(version_savepath, self.params_dict.get("version_type"), "FASTBOOT", self.params_dict.get("pbiid"))
elif source_path.startswith("http"):
ret = downloadFileFromDevCloud(source_path, "", "", download_dir)
if source_path.endswith(".zip"):
zip_name = os.path.basename(source_path)
ret = extractZipFile(os.path.join(download_dir, zip_name), download_dir)
if source_path.endswith(".tar.gz") or (source_path.startswith("http") and ("file_id=" in source_path)):
if source_path.startswith("http") and ("file_id=" in source_path):
if source_path.endswith(".tar.gz"):
zip_name = source_path.split('=')[-1]
else:
zip_name = "out.tar.gz"
else:
zip_name = os.path.basename(source_path)
logger.printLog(f'tar_file:{os.path.join(download_dir, zip_name)},dest_file:{download_dir}')
ret = unTarFile(os.path.join(download_dir, zip_name), download_dir)
nowtime = get_now_time_str_info()
logger.printLog("%s download to %s end" % (nowtime, download_dir))
if not ret:
with open(failed_mark, "a+") as fp:
fp.write("")
return ret
except Exception as e:
logger.printLog(e)
raise Exception(e)
finally:
file_lock.releaseFile()
@dec_stepmsg("upgrade")
#@timeout(900)
def upgrade(self):
'''
#===================================================================================
# @Method: upgrade(self)
# @Precondition: none
# @Func: 升级相关业务逻辑
# @PostStatus: none
# @eg: upgrade()
# @return: True or Flase
#===================================================================================
'''
logger.printLog('开始升级')
deploy_com = self.params_dict.get("deploy_com")
usb_port = self.params_dict.get("usb_port")
baudrate = self.params_dict.get("baudrate")
#芯片类型,根据芯片类型获取对应的刷机命令
flash_type = self.params_dict.get("flash_type")
burn_usbport = self.params_dict.get("hiburn_usbport")
device_ip = self.params_dict.get("Device_IP")
device_netmask = self.params_dict.get("Device_Netmask")
device_gatewayip = self.params_dict.get("Device_GatewayIP")
chip_version = self.params_dict.get('chip_version')
chip_version = chip_version.lower() if chip_version else chip_version
if not deploy_com:
logger.error("deploy_com is NULL !!")
return False
if not burn_usbport:
logger.error("hiburn_usbport is NULL !!")
return False
if not baudrate:
baudrate = 115200
scriptpath = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))))
#升级需要的工具归档
toolworkspace = CONSTANT.OSType.getworkspace()
hiburntoolpath = os.path.join(toolworkspace, "HiBurnCmdLine", "usb%s_tool" % burn_usbport)
logger.info("hiburn tool path is: %s" % hiburntoolpath)
if not os.path.exists(hiburntoolpath):
if not burn_usbport:
logger.error("hiburn_usbport is NULL !!")
return False
os.makedirs(hiburntoolpath)
toolpath = os.path.join(scriptpath, "resource", "HiBurnCmdLine.zip")
logger.info("copy %s to %s" % (toolpath, hiburntoolpath))
copyFile(toolpath, hiburntoolpath)
zip_name = os.path.basename(toolpath)
ret = extractZipFile(os.path.join(hiburntoolpath, zip_name), hiburntoolpath)
if ret:
logger.info("unzip to %s succ" % (hiburntoolpath))
#修改burn.config中的usb口
configpath = os.path.join(hiburntoolpath, "config", "burn.config")
all_data = ""
with open(configpath, "r", encoding="utf-8") as cf:
for line in cf:
if "usbDeviceNumber=" in line:
old_str = line
line = line.replace(old_str, "usbDeviceNumber=%s\r\n" % burn_usbport)
logger.info("replace line: %s " % line)
all_data += line
with open(configpath, "w", encoding="utf-8") as wf:
wf.write(all_data)
else:
logger.error("%s is not exit" % hiburntoolpath)
return False
#将升级需要的文件拷贝到镜像里面
local_image_path = os.path.join(version_savepath, "img")
old_xml_path = os.path.join(scriptpath, "resource", "L2", flash_type, "Hi3516DV300-emmc.xml")
xml_path = os.path.join(local_image_path, "Hi3516DV300-emmc.xml")
copyFile(old_xml_path, xml_path)
if flash_type.lower() == "ev300":
chip_type = "Hi3518EV300"
elif flash_type.lower() == "dv300":
chip_type = "Hi3516DV300"
else:
logger.error("flash_type is : %s " % flash_type)
return False
# copyFile(ubootpath, local_image_path)
scriptfile = os.path.join(scriptpath, "resource", "L2", f'{flash_type.lower()}', "update.txt")
logger.info(f'scriptfile:{scriptfile}')
current_path = os.getcwd()
logger.info("before excute hiburn,current path is: %s" % current_path)
os.chdir(hiburntoolpath)
logger.info("excute hiburn path is: %s" % os.getcwd())
#擦除fastboot
logger.printLog('erase fastboot')
flash_uboot_xml = os.path.join(scriptpath, "resource", "L2", flash_type.lower(), "flash_fastboot.xml")
erase_retry = 0
while erase_retry < 3:
# 通电
PowerOnByThread(usb_port)
cmd = ".\jre\\bin\java -jar hiburn.jar --erase -n %s -m serial %s -x %s" % (chip_type, deploy_com.upper(), flash_uboot_xml)
logger.info("cmd is: %s" % cmd)
ret, outpri = subprocess.getstatusoutput(cmd)
logger.info("flash fastboot result: %s " % ret)
logger.info("print console: %s " % outpri)
if ret == 0 and 'Unknown' not in outpri and erase_retry < 2:
break
elif 'Unknown' in outpri:
logger.info('串口问题 重新上下电 重新檫除')
erase_retry += 1
time.sleep(5)
continue
else:
logger.info('other error')
return False
else:
return False
retry = 0
while retry < 3:
#usb刷机
cmd = ".\jre\\bin\java -jar hiburn.jar --burn -n %s -m USBBootrom -x %s" % (chip_type, xml_path)
logger.info("cmd is: %s" % cmd)
ret, outpri = subprocess.getstatusoutput(cmd)
logger.info("usb upgrade result: %s " % ret)
logger.info("print console: %s " % outpri)
if ret != 0:
if ret == 4 and retry < 2:
time.sleep(10)
retry = retry + 1
logger.info('flash fail,so flash once again')
continue
logger.info(ret)
logger.error("hiburn usb upgrade failed!!")
return False
retry = retry + 3
os.chdir(current_path)
logger.info("hiburn upgrade end, check board status")
return True
def PowerOnByThread(usb_port,wait_time=10):
thread = Thread(target=boardPowerOn, args=[usb_port, wait_time])
thread.start()
logger.info("thread board power on start")
def boardPowerOn(usb_port, waittime):
logger.info("board power on start")
time.sleep(waittime)
#对端口下电
if not usbPowerOnOff('127.0.0.1', '7788', usb_port, "off"):
logger.error("board power off failed")
return False
#对端口上电
if not usbPowerOnOff('127.0.0.1', '7788', usb_port, "on"):
logger.error("board power on failed")
return False
logger.info("board power on end")
def getBoardType(ser):
ret = sendCmd(ser, '\r', READ_TIMEOUT)
if 'HMOS' in ret or 'OHOS' in ret:
ostype = 'OHOS'
elif 'hisilicon' in ret:
ostype = 'uboot'
elif ' #' in ret:
ostype = 'linux'
else:
ostype = 'bootrom'
logger.info("board type is: %s" % ostype)
return ostype
def sendCmd(ser, cmd, timeout):
logger.info("cmd is: %s " % cmd)
ser.write((cmd + '\n').encode())
time.sleep(0.5)
ret = ''
i = 0
while True:
out = ser.read(ser.inWaiting())
if not out:
break
if i > 2:
break
ret = ret + out.decode(encoding="utf-8", errors="ignore")
time.sleep(timeout)
i = i + 1
logger.info("result is: %s " % ret)
return ret
View File