1ba991379Sopenharmony_ci#-*- coding:utf-8 -*- 2ba991379Sopenharmony_ciimport uuid 3ba991379Sopenharmony_ciimport sys 4ba991379Sopenharmony_ciimport subprocess 5ba991379Sopenharmony_ciimport os 6ba991379Sopenharmony_ciimport serial 7ba991379Sopenharmony_ci 8ba991379Sopenharmony_cifrom core.base import BaseApp, dec_stepmsg 9ba991379Sopenharmony_cifrom util.file_locker import FileLock 10ba991379Sopenharmony_cifrom util.log_info import logger 11ba991379Sopenharmony_cifrom util.time_info import get_now_time_str_info, get_now_time_info, Timeout, timeout 12ba991379Sopenharmony_cifrom aw.Telnet.TelnetClient import TelConnect 13ba991379Sopenharmony_cifrom aw.Common.Constant import CONSTANT 14ba991379Sopenharmony_cifrom aw.Download.Download import * 15ba991379Sopenharmony_cifrom aw.Common.Common import getHostIp 16ba991379Sopenharmony_cifrom aw.ExtractFile.ExtractFile import * 17ba991379Sopenharmony_cifrom aw.poweronoff.serial_power_on_off import serialPowerOnOff 18ba991379Sopenharmony_ci 19ba991379Sopenharmony_cilock_suffix = CONSTANT.File.LOCK_SUFFIX #通过文件锁实现并发下载 20ba991379Sopenharmony_cisuc_file = CONSTANT.File.SUC_FILE #通过本文件是区分版本是否成功下载 21ba991379Sopenharmony_cifailed_file = CONSTANT.File.FAILED_FILE #通过本文件是标记文件下载失败 22ba991379Sopenharmony_ciREAD_MAXTIMEOUT = 600 23ba991379Sopenharmony_ciREAD_TIMEOUT = 30 24ba991379Sopenharmony_ciREAD_MINITIMEOUT = 5 25ba991379Sopenharmony_ciuboot_finish = 'hisilicon #' 26ba991379Sopenharmony_cicmd_finish = ' #' 27ba991379Sopenharmony_ci 28ba991379Sopenharmony_ciclass liteOsUpgrade_L3(BaseApp): 29ba991379Sopenharmony_ci ''' 30ba991379Sopenharmony_ci @author: w00278233 31ba991379Sopenharmony_ci ''' 32ba991379Sopenharmony_ci 33ba991379Sopenharmony_ci def __init__(self, param_file): 34ba991379Sopenharmony_ci super().__init__(param_file) 35ba991379Sopenharmony_ci self.param_List = ["upgrade_upgradeLocation"] 36ba991379Sopenharmony_ci 37ba991379Sopenharmony_ci @dec_stepmsg("hongmeng L3 flash") 38ba991379Sopenharmony_ci def excute(self): 39ba991379Sopenharmony_ci ''' 40ba991379Sopenharmony_ci #=================================================================================== 41ba991379Sopenharmony_ci # @Method: excute(self) 42ba991379Sopenharmony_ci # @Precondition: none 43ba991379Sopenharmony_ci # @Func: 升级执行入口 44ba991379Sopenharmony_ci # @PostStatus: none 45ba991379Sopenharmony_ci # @eg: excute() 46ba991379Sopenharmony_ci # @return: True or Flase 47ba991379Sopenharmony_ci #=================================================================================== 48ba991379Sopenharmony_ci ''' 49ba991379Sopenharmony_ci step_index = self.params_dict.get("step_list").index("liteOsUpgrade_L3_app") 50ba991379Sopenharmony_ci 51ba991379Sopenharmony_ci # 执行下载 52ba991379Sopenharmony_ci try: 53ba991379Sopenharmony_ci if not self.download(): 54ba991379Sopenharmony_ci CONSTANT.ENVERRMESSAGE = "image download fail" 55ba991379Sopenharmony_ci logger.printLog(CONSTANT.ENVERRMESSAGE) 56ba991379Sopenharmony_ci return False 57ba991379Sopenharmony_ci except Exception as e: 58ba991379Sopenharmony_ci raise e 59ba991379Sopenharmony_ci 60ba991379Sopenharmony_ci # 执行升级 61ba991379Sopenharmony_ci try: 62ba991379Sopenharmony_ci status = self.upgrade() 63ba991379Sopenharmony_ci logger.info(status) 64ba991379Sopenharmony_ci logger.info(type(status)) 65ba991379Sopenharmony_ci logger.info(f'升级状态:{str(status)}') 66ba991379Sopenharmony_ci if not status: 67ba991379Sopenharmony_ci CONSTANT.ENVERRMESSAGE = "board upgrade fail" 68ba991379Sopenharmony_ci logger.printLog(CONSTANT.ENVERRMESSAGE) 69ba991379Sopenharmony_ci return False 70ba991379Sopenharmony_ci return True 71ba991379Sopenharmony_ci except Exception as e: 72ba991379Sopenharmony_ci raise e 73ba991379Sopenharmony_ci 74ba991379Sopenharmony_ci @dec_stepmsg("download") 75ba991379Sopenharmony_ci @timeout(1800) 76ba991379Sopenharmony_ci def download(self): 77ba991379Sopenharmony_ci ''' 78ba991379Sopenharmony_ci #=================================================================================== 79ba991379Sopenharmony_ci # @Method: download(self) 80ba991379Sopenharmony_ci # @Precondition: none 81ba991379Sopenharmony_ci # @Func: 构建下载到本地的路径,执行相应包的下载 82ba991379Sopenharmony_ci # @PostStatus: none 83ba991379Sopenharmony_ci # @eg: download() 84ba991379Sopenharmony_ci # @return: True or Flase 85ba991379Sopenharmony_ci #=================================================================================== 86ba991379Sopenharmony_ci ''' 87ba991379Sopenharmony_ci global version_savepath, version_name 88ba991379Sopenharmony_ci dir_path = CONSTANT.Path.getDirPath() 89ba991379Sopenharmony_ci if self.params_dict.get("pbiid"): 90ba991379Sopenharmony_ci version_path = self.params_dict.get("pbiid") 91ba991379Sopenharmony_ci version_name = str(uuid.uuid5(uuid.NAMESPACE_URL, str(self.params_dict.get("pbiid")) + "FASTBOOT")) 92ba991379Sopenharmony_ci version_savepath = os.path.join(dir_path, self.params_dict.get("flash_type"), version_name) 93ba991379Sopenharmony_ci else: 94ba991379Sopenharmony_ci version_path = self.params_dict.get("upgrade_upgradeLocation") 95ba991379Sopenharmony_ci version_name = str(uuid.uuid5(uuid.NAMESPACE_URL, (self.params_dict.get("upgrade_upgradeLocation")))) 96ba991379Sopenharmony_ci version_savepath = os.path.join(dir_path, version_name) 97ba991379Sopenharmony_ci logger.printLog(version_savepath) 98ba991379Sopenharmony_ci 99ba991379Sopenharmony_ci if self.params_dict.get("isDownload") == "True": 100ba991379Sopenharmony_ci logger.printLog("不需要做下载,直接返回") 101ba991379Sopenharmony_ci return True 102ba991379Sopenharmony_ci 103ba991379Sopenharmony_ci #执行img下载 104ba991379Sopenharmony_ci import hashlib 105ba991379Sopenharmony_ci save_file_str = version_path.replace("/", "").replace("\\", "") 106ba991379Sopenharmony_ci save_file_name = hashlib.sha1(save_file_str.encode("utf-8")).hexdigest() 107ba991379Sopenharmony_ci logger.info("download hash string:%s, hash value:%s" % (save_file_str, save_file_name)) 108ba991379Sopenharmony_ci save_path_file = os.path.join(dir_path, "record", "%s%s" % (save_file_name, ".txt")) 109ba991379Sopenharmony_ci if not self.excutedown(version_path, os.path.join(version_savepath, "img"), save_path_file, False): 110ba991379Sopenharmony_ci logger.error("download img fail") 111ba991379Sopenharmony_ci return False 112ba991379Sopenharmony_ci 113ba991379Sopenharmony_ci #保存本地版本路径给devicetest去版本路径下取用例 114ba991379Sopenharmony_ci saveVersion(save_path_file, os.path.join(version_savepath, "img")) 115ba991379Sopenharmony_ci 116ba991379Sopenharmony_ci # 执行升级脚本下载 117ba991379Sopenharmony_ci if self.params_dict.get("upgrade_script"): 118ba991379Sopenharmony_ci suc_mark = os.path.join(version_savepath, "scriptfile", suc_file) 119ba991379Sopenharmony_ci if not self.excutedown(self.params_dict.get("upgrade_script"), 120ba991379Sopenharmony_ci os.path.join(version_savepath, "scriptfile"), suc_mark, True): 121ba991379Sopenharmony_ci logger.error("download upgrade script fail") 122ba991379Sopenharmony_ci return False 123ba991379Sopenharmony_ci with open(suc_mark, "a+") as fp: 124ba991379Sopenharmony_ci fp.write("") 125ba991379Sopenharmony_ci 126ba991379Sopenharmony_ci return True 127ba991379Sopenharmony_ci 128ba991379Sopenharmony_ci def excutedown(self, source_path, download_dir, suc_mark, is_file): 129ba991379Sopenharmony_ci ''' 130ba991379Sopenharmony_ci #=================================================================================== 131ba991379Sopenharmony_ci # @Method: excutedown(source_path, download_dir, is_file) 132ba991379Sopenharmony_ci # @Precondition: none 133ba991379Sopenharmony_ci # @Func: 执行下载动作 134ba991379Sopenharmony_ci # @PostStatus: none 135ba991379Sopenharmony_ci # @Param: source_path:资源文件路径 136ba991379Sopenharmony_ci # download_dir:文件下载到本地的文件夹路径 137ba991379Sopenharmony_ci # is_file:是否是文件 138ba991379Sopenharmony_ci # 139ba991379Sopenharmony_ci # @eg: excutedown("xxxx", "D:\\local\\image", Flase, os_method) 140ba991379Sopenharmony_ci # @return: True or Flase 141ba991379Sopenharmony_ci #=================================================================================== 142ba991379Sopenharmony_ci ''' 143ba991379Sopenharmony_ci failed_mark = os.path.join(download_dir, failed_file) 144ba991379Sopenharmony_ci lock_path = os.path.join(download_dir, lock_suffix) 145ba991379Sopenharmony_ci file_lock = FileLock() 146ba991379Sopenharmony_ci if isDownLoadSuccess(download_dir, suc_mark, failed_mark): 147ba991379Sopenharmony_ci return True 148ba991379Sopenharmony_ci try: 149ba991379Sopenharmony_ci nowtime = get_now_time_str_info() 150ba991379Sopenharmony_ci logger.printLog("%s Downloading, please wait" % nowtime) 151ba991379Sopenharmony_ci file_lock.lockFile(lock_path) 152ba991379Sopenharmony_ci ret = "" 153ba991379Sopenharmony_ci logger.info("Get lock. Start to ") 154ba991379Sopenharmony_ci if self.params_dict.get("bt_enable") and self.params_dict.get("bt_enable") == "True": 155ba991379Sopenharmony_ci ret = downloadByBitComet(source_path, download_dir, os_method) 156ba991379Sopenharmony_ci elif source_path.startswith('\\\\'): 157ba991379Sopenharmony_ci ret = downloadByCopy(source_path, download_dir, is_file) 158ba991379Sopenharmony_ci elif self.params_dict.get("pbiid"): 159ba991379Sopenharmony_ci ret = downlaodByDownloadTool(version_savepath, self.params_dict.get("version_type"), "FASTBOOT", self.params_dict.get("pbiid")) 160ba991379Sopenharmony_ci elif source_path.startswith("http"): 161ba991379Sopenharmony_ci # 临时修改下载链接 162ba991379Sopenharmony_ci source_path = self.modifyHttpLink(source_path) 163ba991379Sopenharmony_ci logger.info(f'modify path:{source_path}') 164ba991379Sopenharmony_ci ret = downloadFileFromDevCloud(source_path, "", "", download_dir) 165ba991379Sopenharmony_ci 166ba991379Sopenharmony_ci if source_path.endswith(".zip"): 167ba991379Sopenharmony_ci zip_name = os.path.basename(source_path) 168ba991379Sopenharmony_ci ret = extractZipFile(os.path.join(download_dir, zip_name), download_dir) 169ba991379Sopenharmony_ci if source_path.endswith(".tar.gz") or (source_path.startswith("http") and ("file_id=" in source_path)): 170ba991379Sopenharmony_ci if source_path.startswith("http") and ("file_id=" in source_path): 171ba991379Sopenharmony_ci if source_path.endswith(".tar.gz"): 172ba991379Sopenharmony_ci zip_name = source_path.split('=')[-1] 173ba991379Sopenharmony_ci else: 174ba991379Sopenharmony_ci zip_name = "out.tar.gz" 175ba991379Sopenharmony_ci else: 176ba991379Sopenharmony_ci zip_name = os.path.basename(source_path) 177ba991379Sopenharmony_ci ret = unTarFile(os.path.join(download_dir, zip_name), download_dir) 178ba991379Sopenharmony_ci nowtime = get_now_time_str_info() 179ba991379Sopenharmony_ci logger.printLog("%s download to %s end" % (nowtime, download_dir)) 180ba991379Sopenharmony_ci 181ba991379Sopenharmony_ci if not ret: 182ba991379Sopenharmony_ci with open(failed_mark, "a+") as fp: 183ba991379Sopenharmony_ci fp.write("") 184ba991379Sopenharmony_ci return ret 185ba991379Sopenharmony_ci except Exception as e: 186ba991379Sopenharmony_ci logger.printLog(e) 187ba991379Sopenharmony_ci raise Exception(e) 188ba991379Sopenharmony_ci finally: 189ba991379Sopenharmony_ci file_lock.releaseFile() 190ba991379Sopenharmony_ci 191ba991379Sopenharmony_ci def modifyHttpLink(self,link): 192ba991379Sopenharmony_ci try: 193ba991379Sopenharmony_ci base_link = 'https://hm-verify.obs.cn-north-4.myhuaweicloud.com/' 194ba991379Sopenharmony_ci filename = link.split('&')[-1].split('=')[-1] 195ba991379Sopenharmony_ci names = filename.split('-') 196ba991379Sopenharmony_ci link_1 = '/'.join(names[0:-1]) 197ba991379Sopenharmony_ci link_2 = f'/{filename}' 198ba991379Sopenharmony_ci final_link = base_link + link_1 + link_2 199ba991379Sopenharmony_ci return final_link 200ba991379Sopenharmony_ci except Exception as e: 201ba991379Sopenharmony_ci logger.info('path is errror.check the link_path is right,please') 202ba991379Sopenharmony_ci logger.info(str(e)) 203ba991379Sopenharmony_ci 204ba991379Sopenharmony_ci 205ba991379Sopenharmony_ci @dec_stepmsg("upgrade") 206ba991379Sopenharmony_ci @timeout(900) 207ba991379Sopenharmony_ci def upgrade(self): 208ba991379Sopenharmony_ci ''' 209ba991379Sopenharmony_ci #=================================================================================== 210ba991379Sopenharmony_ci # @Method: upgrade(self) 211ba991379Sopenharmony_ci # @Precondition: none 212ba991379Sopenharmony_ci # @Func: 升级相关业务逻辑 213ba991379Sopenharmony_ci # @PostStatus: none 214ba991379Sopenharmony_ci # @eg: upgrade() 215ba991379Sopenharmony_ci # @return: True or Flase 216ba991379Sopenharmony_ci #=================================================================================== 217ba991379Sopenharmony_ci ''' 218ba991379Sopenharmony_ci try: 219ba991379Sopenharmony_ci #time.sleep(1000) 220ba991379Sopenharmony_ci logger.printLog('开始升级') 221ba991379Sopenharmony_ci self.enterTheDevice() 222ba991379Sopenharmony_ci time.sleep(5) 223ba991379Sopenharmony_ci self.flashSystemImg() 224ba991379Sopenharmony_ci time.sleep(5) 225ba991379Sopenharmony_ci self.rebootDevice() 226ba991379Sopenharmony_ci return True 227ba991379Sopenharmony_ci except Exception as e: 228ba991379Sopenharmony_ci logger.error('***********************************') 229ba991379Sopenharmony_ci logger.error(str(e)) 230ba991379Sopenharmony_ci logger.error('flash fail') 231ba991379Sopenharmony_ci logger.error('***********************************') 232ba991379Sopenharmony_ci return False 233ba991379Sopenharmony_ci 234ba991379Sopenharmony_ci #@timeout(30*3) 235ba991379Sopenharmony_ci def enterTheDevice(self): 236ba991379Sopenharmony_ci logger.info('enter fastboot status'.center(50,'*')) 237ba991379Sopenharmony_ci devices_status_count = 0 238ba991379Sopenharmony_ci while devices_status_count < 3 : 239ba991379Sopenharmony_ci if self.isFastbootStatus(): 240ba991379Sopenharmony_ci break 241ba991379Sopenharmony_ci devices_status_count += 1 242ba991379Sopenharmony_ci time.sleep(20) 243ba991379Sopenharmony_ci else: 244ba991379Sopenharmony_ci logger.error(f'device {self.params_dict.get("sn")} is not exist ,please make sure the sn is True') 245ba991379Sopenharmony_ci raise Exception('ERROR_SN_DEVICE_NOT_EXIST') 246ba991379Sopenharmony_ci 247ba991379Sopenharmony_ci #@timeout(20) 248ba991379Sopenharmony_ci def isFastbootStatus(self): 249ba991379Sopenharmony_ci adb_retcode, adb_output = subprocess.getstatusoutput('adb devices') 250ba991379Sopenharmony_ci 251ba991379Sopenharmony_ci fastboot_retcode, fastboot_output = subprocess.getstatusoutput('fastboot devices') 252ba991379Sopenharmony_ci 253ba991379Sopenharmony_ci if self.params_dict.get('sn') in adb_output: 254ba991379Sopenharmony_ci retcode, output = subprocess.getstatusoutput('adb -s %s reboot fastboot' % self.params_dict.get('sn')) 255ba991379Sopenharmony_ci logger.info('adb -s %s reboot fastboot retcode: %s'% (self.params_dict.get('sn'),str(retcode))) 256ba991379Sopenharmony_ci logger.info('adb -s %s reboot fastboot output: %s'% (self.params_dict.get('sn'),output)) 257ba991379Sopenharmony_ci logger.info('device from adb mode to fastboot mode,please wait') 258ba991379Sopenharmony_ci time.sleep(30) 259ba991379Sopenharmony_ci retcode, output = subprocess.getstatusoutput('fastboot devices') 260ba991379Sopenharmony_ci logger.info('fastboot devices fastboot_retcode: %s'% str(fastboot_retcode)) 261ba991379Sopenharmony_ci logger.info('fastboot devices fastboot_output: %s'% fastboot_output) 262ba991379Sopenharmony_ci if self.params_dict.get('sn') in output: 263ba991379Sopenharmony_ci logger.info('device enter fastboot mode success') 264ba991379Sopenharmony_ci return True 265ba991379Sopenharmony_ci else: 266ba991379Sopenharmony_ci logger.info('device enter fastboot mode fail') 267ba991379Sopenharmony_ci return False 268ba991379Sopenharmony_ci elif self.params_dict.get('sn') in fastboot_output: 269ba991379Sopenharmony_ci logger.info('device has been in fastboot mode') 270ba991379Sopenharmony_ci return True 271ba991379Sopenharmony_ci else: 272ba991379Sopenharmony_ci logger.info('设备未找到,重新尝试') 273ba991379Sopenharmony_ci return False 274ba991379Sopenharmony_ci 275ba991379Sopenharmony_ci @timeout(60*2*3) 276ba991379Sopenharmony_ci def flashSystemImg(self): 277ba991379Sopenharmony_ci logger.info('flash system.img '.center(50,'*')) 278ba991379Sopenharmony_ci flash_count = 0 279ba991379Sopenharmony_ci while flash_count < 3: 280ba991379Sopenharmony_ci status = self.isFlashSuccess() 281ba991379Sopenharmony_ci logger.info(status) 282ba991379Sopenharmony_ci if status: 283ba991379Sopenharmony_ci break 284ba991379Sopenharmony_ci flash_count +=1 285ba991379Sopenharmony_ci time.sleep(3) 286ba991379Sopenharmony_ci else: 287ba991379Sopenharmony_ci logger.error('system.img镜像刷写失败') 288ba991379Sopenharmony_ci raise Exception('[ERROR] ERROR_FLASH_SYSTEM.IMG_FAIL') 289ba991379Sopenharmony_ci 290ba991379Sopenharmony_ci @timeout(60*2) 291ba991379Sopenharmony_ci def isFlashSuccess(self): 292ba991379Sopenharmony_ci #local_image_path = os.path.join(version_savepath, 'img', r'aosp\target\product\generic_arm64', 'system.img') 293ba991379Sopenharmony_ci local_image_path = os.path.join(version_savepath, 'img', 'system.img') 294ba991379Sopenharmony_ci logger.info(f'flash img path: {local_image_path}') 295ba991379Sopenharmony_ci if os.path.exists(local_image_path): 296ba991379Sopenharmony_ci retcode, output = subprocess.getstatusoutput('fastboot -s %s flash system %s' % (self.params_dict.get('sn'), local_image_path)) 297ba991379Sopenharmony_ci logger.info('fastboot -s %s flash system %s retcode: %s'% (self.params_dict.get('sn'),local_image_path,str(retcode))) 298ba991379Sopenharmony_ci logger.info('fastboot -s %s flash system %s output: %s'% (self.params_dict.get('sn'),local_image_path,output)) 299ba991379Sopenharmony_ci if retcode == 0: 300ba991379Sopenharmony_ci logger.info('flash system.img success') 301ba991379Sopenharmony_ci return True 302ba991379Sopenharmony_ci else: 303ba991379Sopenharmony_ci flash_count += 1 304ba991379Sopenharmony_ci logger.info('再次尝试刷system.img镜像') 305ba991379Sopenharmony_ci 306ba991379Sopenharmony_ci else: 307ba991379Sopenharmony_ci logger.error('镜像文件路径不对') 308ba991379Sopenharmony_ci raise Exception('[ERROR] ERROR_IMG_PATH_NOT_EXIST') 309ba991379Sopenharmony_ci 310ba991379Sopenharmony_ci def rebootDevice(self): 311ba991379Sopenharmony_ci logger.info('reboot the device '.center(50,'*')) 312ba991379Sopenharmony_ci reboot_count = 0 313ba991379Sopenharmony_ci while reboot_count < 3 : 314ba991379Sopenharmony_ci logger.info('start reboot') 315ba991379Sopenharmony_ci if self.isRebootSuccess(): 316ba991379Sopenharmony_ci break 317ba991379Sopenharmony_ci else: 318ba991379Sopenharmony_ci reboot_count +=1 319ba991379Sopenharmony_ci time.sleep(10) 320ba991379Sopenharmony_ci else: 321ba991379Sopenharmony_ci raise Exception('[ERROR] ERROR_REBOOT_DEVICE_FAIL') 322ba991379Sopenharmony_ci 323ba991379Sopenharmony_ci def isRebootSuccess(self): 324ba991379Sopenharmony_ci retcode, output = subprocess.getstatusoutput('fastboot -s %s reboot' % self.params_dict.get('sn')) 325ba991379Sopenharmony_ci logger.info('fastboot -s %s reboot retcode: %s'% (self.params_dict.get('sn'),str(retcode))) 326ba991379Sopenharmony_ci logger.info('fastboot -s %s reboot output: %s'% (self.params_dict.get('sn'),output)) 327ba991379Sopenharmony_ci time.sleep(50) 328ba991379Sopenharmony_ci retcode, output = subprocess.getstatusoutput('adb devices') 329ba991379Sopenharmony_ci logger.info('adb devices: %s'% str(retcode)) 330ba991379Sopenharmony_ci logger.info('adb devices: %s'% output) 331ba991379Sopenharmony_ci if self.params_dict.get('sn') in output: 332ba991379Sopenharmony_ci logger.info('reboot success') 333ba991379Sopenharmony_ci return True 334ba991379Sopenharmony_ci else: 335ba991379Sopenharmony_ci logger.info('reboot fail') 336ba991379Sopenharmony_ci return False 337ba991379Sopenharmony_ci 338ba991379Sopenharmony_ci 339ba991379Sopenharmony_ci 340ba991379Sopenharmony_ciif __name__ == '__main__': 341ba991379Sopenharmony_ci liteOsUpgrade_L3.modifyHttpLink(liteOsUpgrade_L3, 342ba991379Sopenharmony_ci 'https://devrepo.devcloud.cn-north-4.huaweicloud.com/DevRepoServer/v1/files/download?file_id=0fe39c430a364f59bd040c53e7a3ef1c&type=archive&filename=Daily_Version#2021-05-19_06-38-31#L35_aosp_arm64.tar.gz')