1ba991379Sopenharmony_ci#-*- coding:utf-8 -*-
2ba991379Sopenharmony_ciimport uuid
3ba991379Sopenharmony_ciimport sys
4ba991379Sopenharmony_ciimport subprocess
5ba991379Sopenharmony_ciimport os
6ba991379Sopenharmony_ciimport serial
7ba991379Sopenharmony_ciimport datetime
8ba991379Sopenharmony_ci
9ba991379Sopenharmony_cifrom core.base import BaseApp, dec_stepmsg
10ba991379Sopenharmony_cifrom util.file_locker import FileLock
11ba991379Sopenharmony_cifrom util.log_info import logger
12ba991379Sopenharmony_cifrom util.time_info import get_now_time_str_info, get_now_time_info, Timeout, timeout
13ba991379Sopenharmony_cifrom aw.Telnet.TelnetClient import TelConnect
14ba991379Sopenharmony_cifrom aw.Common.Constant import CONSTANT
15ba991379Sopenharmony_cifrom aw.Download.Download import *
16ba991379Sopenharmony_cifrom aw.Common.Common import getHostIp, copyFile, copyDirectory
17ba991379Sopenharmony_cifrom aw.ExtractFile.ExtractFile import *
18ba991379Sopenharmony_cifrom aw.poweronoff.serial_power_on_off import usbPowerOnOff, usbPowerOnOffV2
19ba991379Sopenharmony_cifrom threading import Thread
20ba991379Sopenharmony_cifrom subprocess import getstatusoutput
21ba991379Sopenharmony_ci
22ba991379Sopenharmony_cilock_suffix = CONSTANT.File.LOCK_SUFFIX  #通过文件锁实现并发下载
23ba991379Sopenharmony_cisuc_file = CONSTANT.File.SUC_FILE        #通过本文件是区分版本是否成功下载
24ba991379Sopenharmony_cifailed_file = CONSTANT.File.FAILED_FILE  #通过本文件是标记文件下载失败
25ba991379Sopenharmony_ciREAD_MAXTIMEOUT = 5
26ba991379Sopenharmony_ciREAD_TIMEOUT = 5
27ba991379Sopenharmony_ciREAD_MINITIMEOUT = 2
28ba991379Sopenharmony_ciuboot_finish = 'hisilicon #'
29ba991379Sopenharmony_cicmd_finish = ' #'
30ba991379Sopenharmony_cierror_str_list = ['Unknown', '发送起始帧失败', '发送头帧失败']
31ba991379Sopenharmony_ci
32ba991379Sopenharmony_ci_is_download_success = False
33ba991379Sopenharmony_ci
34ba991379Sopenharmony_ci
35ba991379Sopenharmony_ciclass liteOsUpgrade_L2(BaseApp):
36ba991379Sopenharmony_ci
37ba991379Sopenharmony_ci    def __init__(self, param_file):
38ba991379Sopenharmony_ci        super().__init__(param_file)
39ba991379Sopenharmony_ci        self.param_List = ["deploy_com",
40ba991379Sopenharmony_ci                        "usb_port",
41ba991379Sopenharmony_ci                           "upgrade_upgradeLocation"]
42ba991379Sopenharmony_ci
43ba991379Sopenharmony_ci    @dec_stepmsg("hongmeng L2 flash")
44ba991379Sopenharmony_ci    def excute(self):
45ba991379Sopenharmony_ci        '''
46ba991379Sopenharmony_ci        #===================================================================================
47ba991379Sopenharmony_ci        #   @Method:        excute(self)
48ba991379Sopenharmony_ci        #   @Precondition:  none
49ba991379Sopenharmony_ci        #   @Func:          升级执行入口
50ba991379Sopenharmony_ci        #   @PostStatus:    none
51ba991379Sopenharmony_ci        #   @eg:            excute()
52ba991379Sopenharmony_ci        #   @return:        True or Flase
53ba991379Sopenharmony_ci        #===================================================================================
54ba991379Sopenharmony_ci        '''
55ba991379Sopenharmony_ci        step_index = self.params_dict.get("step_list").index("liteOsUpgrade_L2_app")
56ba991379Sopenharmony_ci
57ba991379Sopenharmony_ci        # 执行下载
58ba991379Sopenharmony_ci        try:
59ba991379Sopenharmony_ci            if not self.download():
60ba991379Sopenharmony_ci                CONSTANT.ENVERRMESSAGE = "image download fail"
61ba991379Sopenharmony_ci                logger.printLog(CONSTANT.ENVERRMESSAGE)
62ba991379Sopenharmony_ci                return False
63ba991379Sopenharmony_ci        except Exception as e:
64ba991379Sopenharmony_ci            raise e
65ba991379Sopenharmony_ci
66ba991379Sopenharmony_ci
67ba991379Sopenharmony_ci        # 执行升级
68ba991379Sopenharmony_ci        try:
69ba991379Sopenharmony_ci            if not self.upgrade():
70ba991379Sopenharmony_ci                CONSTANT.ENVERRMESSAGE = "board upgrade fail"
71ba991379Sopenharmony_ci                logger.printLog(CONSTANT.ENVERRMESSAGE)
72ba991379Sopenharmony_ci                return False
73ba991379Sopenharmony_ci            return True
74ba991379Sopenharmony_ci        except Exception as e:
75ba991379Sopenharmony_ci            raise e
76ba991379Sopenharmony_ci
77ba991379Sopenharmony_ci    @dec_stepmsg("download")
78ba991379Sopenharmony_ci    @timeout(18000)
79ba991379Sopenharmony_ci    def download(self):
80ba991379Sopenharmony_ci        '''
81ba991379Sopenharmony_ci        #===================================================================================
82ba991379Sopenharmony_ci        #   @Method:        download(self)
83ba991379Sopenharmony_ci        #   @Precondition:  none
84ba991379Sopenharmony_ci        #   @Func:          构建下载到本地的路径,执行相应包的下载
85ba991379Sopenharmony_ci        #   @PostStatus:    none
86ba991379Sopenharmony_ci        #   @eg:            download()
87ba991379Sopenharmony_ci        #   @return:        True or Flase
88ba991379Sopenharmony_ci        #===================================================================================
89ba991379Sopenharmony_ci        '''
90ba991379Sopenharmony_ci        global version_savepath, version_name, _is_download_success
91ba991379Sopenharmony_ci        dir_path = CONSTANT.Path.getDirPath()
92ba991379Sopenharmony_ci        if self.params_dict.get("pbiid"):
93ba991379Sopenharmony_ci            version_path = self.params_dict.get("pbiid")
94ba991379Sopenharmony_ci            version_name = str(uuid.uuid5(uuid.NAMESPACE_URL, str(self.params_dict.get("pbiid")) + "FASTBOOT"))
95ba991379Sopenharmony_ci            version_savepath = os.path.join(dir_path, self.params_dict.get("flash_type"), version_name)
96ba991379Sopenharmony_ci        else:
97ba991379Sopenharmony_ci            version_path = self.params_dict.get("upgrade_upgradeLocation")
98ba991379Sopenharmony_ci            version_name = str(uuid.uuid5(uuid.NAMESPACE_URL, (self.params_dict.get("upgrade_upgradeLocation"))))
99ba991379Sopenharmony_ci            version_savepath = os.path.join(dir_path, version_name)
100ba991379Sopenharmony_ci
101ba991379Sopenharmony_ci        if self.params_dict.get("isDownload") == "True":
102ba991379Sopenharmony_ci            logger.printLog("不需要做下载,直接返回")
103ba991379Sopenharmony_ci            return True
104ba991379Sopenharmony_ci
105ba991379Sopenharmony_ci        #执行img下载
106ba991379Sopenharmony_ci        import hashlib
107ba991379Sopenharmony_ci        save_file_str = version_path.replace("/", "").replace("\\", "")
108ba991379Sopenharmony_ci        save_file_name = hashlib.sha1(save_file_str.encode("utf-8")).hexdigest()
109ba991379Sopenharmony_ci        logger.info("download hash value:%s" % (save_file_name))
110ba991379Sopenharmony_ci        save_path_file = os.path.join(dir_path, "record", "%s%s" % (save_file_name, ".txt"))
111ba991379Sopenharmony_ci        logger.printLog('save_path_file: %s' % save_path_file)
112ba991379Sopenharmony_ci        if not self.excutedown(version_path, os.path.join(version_savepath, "img"), save_path_file, False):
113ba991379Sopenharmony_ci            logger.error("download img fail")
114ba991379Sopenharmony_ci            return False
115ba991379Sopenharmony_ci        _is_download_success = True
116ba991379Sopenharmony_ci        #保存本地版本路径给devicetest去版本路径下取用例
117ba991379Sopenharmony_ci        saveVersion(save_path_file, os.path.join(version_savepath, "img"))
118ba991379Sopenharmony_ci
119ba991379Sopenharmony_ci        return True
120ba991379Sopenharmony_ci
121ba991379Sopenharmony_ci    def excutedown(self, source_path, download_dir, suc_mark, is_file):
122ba991379Sopenharmony_ci        '''
123ba991379Sopenharmony_ci        #===================================================================================
124ba991379Sopenharmony_ci        #   @Method:        excutedown(source_path, download_dir, is_file)
125ba991379Sopenharmony_ci        #   @Precondition:  none
126ba991379Sopenharmony_ci        #   @Func:          执行下载动作
127ba991379Sopenharmony_ci        #   @PostStatus:    none
128ba991379Sopenharmony_ci        #   @Param:         source_path:资源文件路径
129ba991379Sopenharmony_ci        #                   download_dir:文件下载到本地的文件夹路径
130ba991379Sopenharmony_ci        #                   is_file:是否是文件
131ba991379Sopenharmony_ci        #
132ba991379Sopenharmony_ci        #   @eg:            excutedown("xxxx", "D:\\local\\image", Flase, os_method)
133ba991379Sopenharmony_ci        #   @return:        True or Flase
134ba991379Sopenharmony_ci        #===================================================================================
135ba991379Sopenharmony_ci        '''
136ba991379Sopenharmony_ci        failed_mark = os.path.join(download_dir, failed_file)
137ba991379Sopenharmony_ci        lock_path = os.path.join(download_dir, lock_suffix)
138ba991379Sopenharmony_ci        file_lock = FileLock()
139ba991379Sopenharmony_ci
140ba991379Sopenharmony_ci        if isDownLoadSuccess(download_dir, suc_mark, failed_mark):
141ba991379Sopenharmony_ci            return True
142ba991379Sopenharmony_ci        try:
143ba991379Sopenharmony_ci            nowtime = get_now_time_str_info()
144ba991379Sopenharmony_ci            logger.printLog("%s Downloading, please wait" % nowtime)
145ba991379Sopenharmony_ci            file_lock.lockFile(lock_path)
146ba991379Sopenharmony_ci            ret = ""
147ba991379Sopenharmony_ci            logger.info("Get lock. Start to ")
148ba991379Sopenharmony_ci            if self.params_dict.get("bt_enable") and self.params_dict.get("bt_enable") == "True":
149ba991379Sopenharmony_ci                ret = downloadByBitComet(source_path, download_dir, os_method)
150ba991379Sopenharmony_ci            elif source_path.startswith('\\\\'):
151ba991379Sopenharmony_ci                ret = downloadByCopy(source_path, download_dir, is_file)
152ba991379Sopenharmony_ci            elif self.params_dict.get("pbiid"):
153ba991379Sopenharmony_ci                ret = downlaodByDownloadTool(version_savepath, self.params_dict.get("version_type"), "FASTBOOT", self.params_dict.get("pbiid"))
154ba991379Sopenharmony_ci            elif source_path.startswith("http"):
155ba991379Sopenharmony_ci                ret = downloadFileFromDevCloud(source_path, "", "", download_dir)
156ba991379Sopenharmony_ci
157ba991379Sopenharmony_ci            if source_path.endswith(".zip"):
158ba991379Sopenharmony_ci                zip_name = os.path.basename(source_path)
159ba991379Sopenharmony_ci                ret = extractZipFile(os.path.join(download_dir, zip_name), download_dir)
160ba991379Sopenharmony_ci            if source_path.endswith(".tar.gz") or (source_path.startswith("http") and ("file_id=" in source_path)):
161ba991379Sopenharmony_ci                if source_path.startswith("http") and ("file_id=" in source_path):
162ba991379Sopenharmony_ci                    if source_path.endswith(".tar.gz"):
163ba991379Sopenharmony_ci                        zip_name = source_path.split('=')[-1]
164ba991379Sopenharmony_ci                    else:
165ba991379Sopenharmony_ci                        zip_name = "out.tar.gz"
166ba991379Sopenharmony_ci                else:
167ba991379Sopenharmony_ci                    zip_name = os.path.basename(source_path)
168ba991379Sopenharmony_ci                logger.printLog(f'tar_file:{os.path.join(download_dir, zip_name)},dest_file:{download_dir}')
169ba991379Sopenharmony_ci                ret = unTarFile(os.path.join(download_dir, zip_name), download_dir)
170ba991379Sopenharmony_ci            nowtime = get_now_time_str_info()
171ba991379Sopenharmony_ci            logger.printLog("%s download to %s end" % (nowtime, download_dir))
172ba991379Sopenharmony_ci
173ba991379Sopenharmony_ci            if not ret:
174ba991379Sopenharmony_ci                with open(failed_mark, "a+") as fp:
175ba991379Sopenharmony_ci                    fp.write("")
176ba991379Sopenharmony_ci            return ret
177ba991379Sopenharmony_ci        except Exception as e:
178ba991379Sopenharmony_ci            logger.printLog(e)
179ba991379Sopenharmony_ci            raise Exception(e)
180ba991379Sopenharmony_ci        finally:
181ba991379Sopenharmony_ci            file_lock.releaseFile()
182ba991379Sopenharmony_ci
183ba991379Sopenharmony_ci
184ba991379Sopenharmony_ci    @dec_stepmsg("upgrade")
185ba991379Sopenharmony_ci    #@timeout(900)
186ba991379Sopenharmony_ci    def upgrade(self):
187ba991379Sopenharmony_ci        '''
188ba991379Sopenharmony_ci        #===================================================================================
189ba991379Sopenharmony_ci        #   @Method:        upgrade(self)
190ba991379Sopenharmony_ci        #   @Precondition:  none
191ba991379Sopenharmony_ci        #   @Func:          升级相关业务逻辑
192ba991379Sopenharmony_ci        #   @PostStatus:    none
193ba991379Sopenharmony_ci        #   @eg:            upgrade()
194ba991379Sopenharmony_ci        #   @return:        True or Flase
195ba991379Sopenharmony_ci        #===================================================================================
196ba991379Sopenharmony_ci        '''
197ba991379Sopenharmony_ci        global _is_download_success
198ba991379Sopenharmony_ci        logger.printLog('开始升级')
199ba991379Sopenharmony_ci        deploy_com = self.params_dict.get("deploy_com")
200ba991379Sopenharmony_ci        usb_port = self.params_dict.get("usb_port")
201ba991379Sopenharmony_ci        baudrate = self.params_dict.get("baudrate")
202ba991379Sopenharmony_ci        #芯片类型,根据芯片类型获取对应的刷机命令
203ba991379Sopenharmony_ci        flash_type = self.params_dict.get("flash_type")
204ba991379Sopenharmony_ci        burn_usbport = self.params_dict.get("hiburn_usbport")
205ba991379Sopenharmony_ci        device_ip = self.params_dict.get("Device_IP")
206ba991379Sopenharmony_ci        device_netmask = self.params_dict.get("Device_Netmask")
207ba991379Sopenharmony_ci        device_gatewayip = self.params_dict.get("Device_GatewayIP")
208ba991379Sopenharmony_ci        chip_version = self.params_dict.get('chip_version')
209ba991379Sopenharmony_ci        chip_version = chip_version.lower() if chip_version else chip_version
210ba991379Sopenharmony_ci        sn = self.params_dict.get('sn')
211ba991379Sopenharmony_ci
212ba991379Sopenharmony_ci        if not deploy_com:
213ba991379Sopenharmony_ci            logger.error("deploy_com is NULL !!")
214ba991379Sopenharmony_ci            return False
215ba991379Sopenharmony_ci        if not burn_usbport:
216ba991379Sopenharmony_ci            logger.error("hiburn_usbport is NULL !!")
217ba991379Sopenharmony_ci            return False
218ba991379Sopenharmony_ci        if not baudrate:
219ba991379Sopenharmony_ci            baudrate = 115200
220ba991379Sopenharmony_ci        #执行下载
221ba991379Sopenharmony_ci        t_download = Thread(target=self.download, args=())
222ba991379Sopenharmony_ci        t_download.start()
223ba991379Sopenharmony_ci        scriptpath = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))))
224ba991379Sopenharmony_ci        #升级需要的工具归档
225ba991379Sopenharmony_ci        toolworkspace = CONSTANT.OSType.getworkspace()
226ba991379Sopenharmony_ci        hiburntoolpath = os.path.join(toolworkspace, "HiBurnCmdLine", "usb%s_tool" % burn_usbport)
227ba991379Sopenharmony_ci        logger.info("hiburn tool path is: %s" % hiburntoolpath)
228ba991379Sopenharmony_ci        if not os.path.exists(hiburntoolpath):
229ba991379Sopenharmony_ci            if not burn_usbport:
230ba991379Sopenharmony_ci                logger.error("hiburn_usbport is NULL !!")
231ba991379Sopenharmony_ci                return False
232ba991379Sopenharmony_ci            os.makedirs(hiburntoolpath)
233ba991379Sopenharmony_ci            toolpath = os.path.join(scriptpath, "resource", "HiBurnCmdLine.zip")
234ba991379Sopenharmony_ci            logger.info("copy %s to %s" % (toolpath, hiburntoolpath))
235ba991379Sopenharmony_ci            copyFile(toolpath, hiburntoolpath)
236ba991379Sopenharmony_ci            zip_name = os.path.basename(toolpath)
237ba991379Sopenharmony_ci            ret = extractZipFile(os.path.join(hiburntoolpath, zip_name), hiburntoolpath)
238ba991379Sopenharmony_ci            if ret:
239ba991379Sopenharmony_ci                logger.info("unzip to %s succ" % (hiburntoolpath))
240ba991379Sopenharmony_ci                #修改burn.config中的usb口
241ba991379Sopenharmony_ci                configpath = os.path.join(hiburntoolpath, "config", "burn.config")
242ba991379Sopenharmony_ci                all_data = ""
243ba991379Sopenharmony_ci                with open(configpath, "r", encoding="utf-8") as cf:
244ba991379Sopenharmony_ci                    for line in cf:
245ba991379Sopenharmony_ci                        if "usbDeviceNumber=" in line:
246ba991379Sopenharmony_ci                            old_str = line
247ba991379Sopenharmony_ci                            line = line.replace(old_str, "usbDeviceNumber=%s\r\n" % burn_usbport)
248ba991379Sopenharmony_ci                            logger.info("replace line: %s " % line)
249ba991379Sopenharmony_ci                        all_data += line
250ba991379Sopenharmony_ci                with open(configpath, "w", encoding="utf-8") as wf:
251ba991379Sopenharmony_ci                    wf.write(all_data)
252ba991379Sopenharmony_ci            else:
253ba991379Sopenharmony_ci                logger.error("%s is not exit" % hiburntoolpath)
254ba991379Sopenharmony_ci                return False
255ba991379Sopenharmony_ci        os.chdir(hiburntoolpath)
256ba991379Sopenharmony_ci        if flash_type.lower() == "ev300":
257ba991379Sopenharmony_ci            chip_type = "Hi3518EV300"
258ba991379Sopenharmony_ci        elif flash_type.lower() == "dv300":
259ba991379Sopenharmony_ci            chip_type = "Hi3516DV300"
260ba991379Sopenharmony_ci        else:
261ba991379Sopenharmony_ci            logger.error("flash_type is : %s " % flash_type)
262ba991379Sopenharmony_ci            return False
263ba991379Sopenharmony_ci        #擦除fastboot
264ba991379Sopenharmony_ci        logger.printLog('erase fastboot')
265ba991379Sopenharmony_ci        flash_uboot_xml = os.path.join(scriptpath, "resource", "L2", flash_type.lower(), "flash_fastboot.xml")
266ba991379Sopenharmony_ci        cmd = ".\jre\\bin\java -jar hiburn.jar --erase -n %s -m serial %s -x %s" % (chip_type, deploy_com.upper(), flash_uboot_xml)
267ba991379Sopenharmony_ci        self.eraseDevice(cmd, usb_port)
268ba991379Sopenharmony_ci        t_download.join()
269ba991379Sopenharmony_ci        # 检查下载是否成功
270ba991379Sopenharmony_ci        if not _is_download_success:
271ba991379Sopenharmony_ci            return False
272ba991379Sopenharmony_ci
273ba991379Sopenharmony_ci        #将升级需要的文件拷贝到镜像里面
274ba991379Sopenharmony_ci        local_image_path = os.path.join(version_savepath, "img")
275ba991379Sopenharmony_ci        old_xml_path = os.path.join(scriptpath, "resource", "L2", flash_type, "Hi3516DV300-emmc.xml")
276ba991379Sopenharmony_ci        xml_path = os.path.join(local_image_path, "Hi3516DV300-emmc.xml")
277ba991379Sopenharmony_ci        copyFile(old_xml_path, xml_path)
278ba991379Sopenharmony_ci        # copyFile(ubootpath, local_image_path)
279ba991379Sopenharmony_ci        scriptfile = os.path.join(scriptpath, "resource", "L2", f'{flash_type.lower()}', "update.txt")
280ba991379Sopenharmony_ci        logger.info(f'scriptfile:{scriptfile}')
281ba991379Sopenharmony_ci
282ba991379Sopenharmony_ci        logger.printLog('进行烧写')
283ba991379Sopenharmony_ci        retry = 0
284ba991379Sopenharmony_ci        while retry < 3:
285ba991379Sopenharmony_ci            #usb刷机
286ba991379Sopenharmony_ci            cmd = ".\jre\\bin\java -jar hiburn.jar --burn -n %s -m USBBootrom -x %s" % (chip_type, xml_path)
287ba991379Sopenharmony_ci            logger.info("cmd is: %s" % cmd)
288ba991379Sopenharmony_ci            ret, outpri = subprocess.getstatusoutput(cmd)
289ba991379Sopenharmony_ci            logger.info("usb upgrade result: %s " % ret)
290ba991379Sopenharmony_ci            logger.info("print console: %s " % outpri)
291ba991379Sopenharmony_ci            if ret != 0:
292ba991379Sopenharmony_ci                if ret == 4 and retry < 2:
293ba991379Sopenharmony_ci                    time.sleep(10)
294ba991379Sopenharmony_ci                    retry = retry + 1
295ba991379Sopenharmony_ci                    logger.info('flash fail,so flash once again')
296ba991379Sopenharmony_ci                    continue
297ba991379Sopenharmony_ci                logger.info(ret)
298ba991379Sopenharmony_ci                logger.error("hiburn usb upgrade failed!!")
299ba991379Sopenharmony_ci                return False
300ba991379Sopenharmony_ci            retry = retry + 3
301ba991379Sopenharmony_ci        os.chdir(current_path)
302ba991379Sopenharmony_ci        logger.info("hiburn upgrade end, check board status")
303ba991379Sopenharmony_ci        logger.info("为保持hdc稳定性,等待60秒")
304ba991379Sopenharmony_ci        time.sleep(60)
305ba991379Sopenharmony_ci        try:
306ba991379Sopenharmony_ci            #pass
307ba991379Sopenharmony_ci            self.hdc_set_time(sn)
308ba991379Sopenharmony_ci        except Exception as e:
309ba991379Sopenharmony_ci            logger.printLog('hdc设置时间超时')
310ba991379Sopenharmony_ci            logger.printLog(str(e))
311ba991379Sopenharmony_ci        try:
312ba991379Sopenharmony_ci            logger.info("打开serial")
313ba991379Sopenharmony_ci            ser = serial.Serial(deploy_com, int(baudrate), timeout=0)
314ba991379Sopenharmony_ci            if ser.is_open == False:
315ba991379Sopenharmony_ci                ser.open()
316ba991379Sopenharmony_ci            logger.info("get device status")
317ba991379Sopenharmony_ci            board_type = getBoardType(ser)
318ba991379Sopenharmony_ci            if board_type == "OHOS" and self.checkStatus(ser):
319ba991379Sopenharmony_ci                return True
320ba991379Sopenharmony_ci
321ba991379Sopenharmony_ci                # ret = sendCmd(ser, 'sa;reset;', READ_MAXTIMEOUT)
322ba991379Sopenharmony_ci                # board_type = getBoardType(ser)
323ba991379Sopenharmony_ci                # if board_type != "OHOS":
324ba991379Sopenharmony_ci                #     logger.error("upgrade fail")
325ba991379Sopenharmony_ci                #     return False
326ba991379Sopenharmony_ci            else:
327ba991379Sopenharmony_ci                return False
328ba991379Sopenharmony_ci        except Exception as e:
329ba991379Sopenharmony_ci            logger.info(str(e))
330ba991379Sopenharmony_ci            return False
331ba991379Sopenharmony_ci        finally:
332ba991379Sopenharmony_ci            ser.close()
333ba991379Sopenharmony_ci            logger.info("close serial")
334ba991379Sopenharmony_ci
335ba991379Sopenharmony_ci    def checkStatus(self, ser):
336ba991379Sopenharmony_ci        time.sleep(180)
337ba991379Sopenharmony_ci        # print('wait 120 seconds')
338ba991379Sopenharmony_ci        ren_cmd = 'ps -elf | grep render_service'
339ba991379Sopenharmony_ci        laun_cmd = 'ps -elf | grep com.ohos.launcher'
340ba991379Sopenharmony_ci        time.sleep(10)
341ba991379Sopenharmony_ci        ren_status_1 = getPsPid(ser, ren_cmd, 'render_service')
342ba991379Sopenharmony_ci        time.sleep(5)
343ba991379Sopenharmony_ci        ren_status_2 = getPsPid(ser, ren_cmd, 'render_service')
344ba991379Sopenharmony_ci        time.sleep(5)
345ba991379Sopenharmony_ci        laun_status_1 = getPsPid(ser, laun_cmd, 'com.ohos.launcher')
346ba991379Sopenharmony_ci        time.sleep(5)
347ba991379Sopenharmony_ci        laun_status_2 = getPsPid(ser, laun_cmd, 'com.ohos.launcher')
348ba991379Sopenharmony_ci        # wes_cmd = 'pidof weston'
349ba991379Sopenharmony_ci        # laun_cmd = 'pidof com.ohos.launcher'
350ba991379Sopenharmony_ci        # time.sleep(10)
351ba991379Sopenharmony_ci        # wes_status_1 = sendCmd(ser, wes_cmd, READ_TIMEOUT)
352ba991379Sopenharmony_ci        # time.sleep(5)
353ba991379Sopenharmony_ci        # wes_status_2 = sendCmd(ser, wes_cmd, READ_TIMEOUT)
354ba991379Sopenharmony_ci        # time.sleep(5)
355ba991379Sopenharmony_ci        # laun_status_1 = sendCmd(ser, laun_cmd, READ_TIMEOUT)
356ba991379Sopenharmony_ci        # time.sleep(5)
357ba991379Sopenharmony_ci        # laun_status_2 = sendCmd(ser, laun_cmd, READ_TIMEOUT)
358ba991379Sopenharmony_ci        logger.info('ren_status_1: %s ren_status_2: %s laun_1: %s laun_2: %s '%(ren_status_1,ren_status_2,laun_status_1,laun_status_2))
359ba991379Sopenharmony_ci        if ren_status_1 and ren_status_1 == ren_status_2 and laun_status_1 and laun_status_1 == laun_status_2:
360ba991379Sopenharmony_ci            return True
361ba991379Sopenharmony_ci        if not ren_status_1 or not ren_status_2 or ren_status_1 != ren_status_2:
362ba991379Sopenharmony_ci            # and not wes_status_1.strip().isdigit() or not wes_status_2.strip().isdigit()
363ba991379Sopenharmony_ci            logger.printLog('process render_service is not exist')
364ba991379Sopenharmony_ci        if not laun_status_1 or not laun_status_2 :
365ba991379Sopenharmony_ci            # or not laun_status_1.strip().isdigit() or not laun_status_2.strip().isdigit()
366ba991379Sopenharmony_ci            logger.printLog('process com.ohos.launcher is not exist')
367ba991379Sopenharmony_ci        return False
368ba991379Sopenharmony_ci
369ba991379Sopenharmony_ci    @timeout(30)
370ba991379Sopenharmony_ci    def hdc_set_time(self,sn):
371ba991379Sopenharmony_ci        # todo
372ba991379Sopenharmony_ci        y_m_d = time.strftime('%Y-%m-%d',time.localtime())
373ba991379Sopenharmony_ci        h_m_s = time.strftime('%H:%M:%S',time.localtime())
374ba991379Sopenharmony_ci        cmd = 'hdc_std -t %s shell date -u "%sT%s"'% (sn,y_m_d,h_m_s)
375ba991379Sopenharmony_ci        logger.printLog('hdc start set time')
376ba991379Sopenharmony_ci        logger.printLog('cmd is %s'% cmd)
377ba991379Sopenharmony_ci        ret,out = subprocess.getstatusoutput(cmd)
378ba991379Sopenharmony_ci        logger.printLog('hdc end set time')
379ba991379Sopenharmony_ci        if h_m_s not in out:
380ba991379Sopenharmony_ci            logger.printLog('hdc设置时间失败')
381ba991379Sopenharmony_ci            logger.printLog(out)
382ba991379Sopenharmony_ci            return False
383ba991379Sopenharmony_ci        logger.printLog(out)
384ba991379Sopenharmony_ci
385ba991379Sopenharmony_ci    def eraseDevice(self, cmd, usb_port):
386ba991379Sopenharmony_ci        '''
387ba991379Sopenharmony_ci        ret 暂时没有作用,先使用out
388ba991379Sopenharmony_ci        '''
389ba991379Sopenharmony_ci        erase_retry = 0
390ba991379Sopenharmony_ci        while erase_retry < 3:
391ba991379Sopenharmony_ci            # 通电
392ba991379Sopenharmony_ci            PowerOnByThread(usb_port)
393ba991379Sopenharmony_ci            logger.info("cmd is: %s" % cmd)
394ba991379Sopenharmony_ci            ret, outpri = subprocess.getstatusoutput(cmd)
395ba991379Sopenharmony_ci            logger.info("flash fastboot result: %s " % ret)
396ba991379Sopenharmony_ci            logger.info("print console: %s " % outpri)
397ba991379Sopenharmony_ci            is_earse_again = any([True if item in outpri else False for item in error_str_list])
398ba991379Sopenharmony_ci            if ret == 0 and erase_retry < 2 and not is_earse_again :
399ba991379Sopenharmony_ci                logger.info('檫除成功'.center(20,'*'))
400ba991379Sopenharmony_ci                break
401ba991379Sopenharmony_ci            elif is_earse_again:
402ba991379Sopenharmony_ci                logger.info('檫除存在问题 重新上下电 重新檫除')
403ba991379Sopenharmony_ci                erase_retry += 1
404ba991379Sopenharmony_ci                time.sleep(5)
405ba991379Sopenharmony_ci                continue
406ba991379Sopenharmony_ci            else:
407ba991379Sopenharmony_ci                logger.info('other error')
408ba991379Sopenharmony_ci                return False
409ba991379Sopenharmony_ci        else:
410ba991379Sopenharmony_ci            return False
411ba991379Sopenharmony_ci
412ba991379Sopenharmony_ci    def catchEraseFail(self,cmd):
413ba991379Sopenharmony_ci        logger.printLog(datetime.datetime.now())
414ba991379Sopenharmony_ci        ret, outpri = subprocess.getstatusoutput(cmd)
415ba991379Sopenharmony_ci        logger.printLog(datetime.datetime.now())
416ba991379Sopenharmony_ci        return ret,outpri
417ba991379Sopenharmony_ci
418ba991379Sopenharmony_cidef getPsPid(ser, cmd, ps):
419ba991379Sopenharmony_ci    try:
420ba991379Sopenharmony_ci        data = sendCmd(ser, cmd, READ_TIMEOUT)
421ba991379Sopenharmony_ci        logger.info(data)
422ba991379Sopenharmony_ci        data = [item for item in data.split('\n') if 'grep' not in item and ps in item ]
423ba991379Sopenharmony_ci        if len(data) < 1:
424ba991379Sopenharmony_ci            return
425ba991379Sopenharmony_ci        elif len(data) > 1:
426ba991379Sopenharmony_ci            data = max(data, key=len, default='')
427ba991379Sopenharmony_ci        logger.info(data)
428ba991379Sopenharmony_ci        data = data[0].split()
429ba991379Sopenharmony_ci        if len(data) < 1:
430ba991379Sopenharmony_ci            return
431ba991379Sopenharmony_ci        else:
432ba991379Sopenharmony_ci            logger.info(data)
433ba991379Sopenharmony_ci            return data[1]
434ba991379Sopenharmony_ci    except Exception as e :
435ba991379Sopenharmony_ci        logger.info(str(e))
436ba991379Sopenharmony_ci        logger.info('pid 获取失败')
437ba991379Sopenharmony_ci
438ba991379Sopenharmony_cidef PowerOnByThread(usb_port,wait_time=10):
439ba991379Sopenharmony_ci    thread = Thread(target=boardPowerOn, args=[usb_port, wait_time])
440ba991379Sopenharmony_ci    thread.start()
441ba991379Sopenharmony_ci    logger.info("thread board power on start")
442ba991379Sopenharmony_ci
443ba991379Sopenharmony_ci
444ba991379Sopenharmony_ci
445ba991379Sopenharmony_cidef boardPowerOn(usb_port, waittime):
446ba991379Sopenharmony_ci    logger.info("board power on start")
447ba991379Sopenharmony_ci    time.sleep(waittime)
448ba991379Sopenharmony_ci
449ba991379Sopenharmony_ci    #对端口下电
450ba991379Sopenharmony_ci    if not usbPowerOnOff('127.0.0.1', '7788', usb_port, "off"):
451ba991379Sopenharmony_ci        logger.error("board power off failed")
452ba991379Sopenharmony_ci        return False
453ba991379Sopenharmony_ci
454ba991379Sopenharmony_ci    #对端口上电
455ba991379Sopenharmony_ci    if not usbPowerOnOff('127.0.0.1', '7788', usb_port, "on"):
456ba991379Sopenharmony_ci        logger.error("board power on failed")
457ba991379Sopenharmony_ci        return False
458ba991379Sopenharmony_ci    logger.info("board power on end")
459ba991379Sopenharmony_ci
460ba991379Sopenharmony_ci
461ba991379Sopenharmony_cidef getBoardType(ser):
462ba991379Sopenharmony_ci    ret = sendCmd(ser, '\r', READ_TIMEOUT)
463ba991379Sopenharmony_ci    if 'HMOS' in ret or 'OHOS' in ret or 'console:/ $' in ret or '#' in ret:
464ba991379Sopenharmony_ci        ostype = 'OHOS'
465ba991379Sopenharmony_ci    elif 'hisilicon' in ret:
466ba991379Sopenharmony_ci        ostype = 'uboot'
467ba991379Sopenharmony_ci    elif ' #' in ret:
468ba991379Sopenharmony_ci        ostype = 'linux'
469ba991379Sopenharmony_ci    else:
470ba991379Sopenharmony_ci        ostype = 'bootrom'
471ba991379Sopenharmony_ci    logger.info("board type is: %s" % ostype)
472ba991379Sopenharmony_ci    return ostype
473ba991379Sopenharmony_ci
474ba991379Sopenharmony_cidef sendCmd(ser, cmd, timeout):
475ba991379Sopenharmony_ci    logger.info("cmd is: %s " % cmd)
476ba991379Sopenharmony_ci    ser.write((cmd + '\n').encode())
477ba991379Sopenharmony_ci    time.sleep(0.5)
478ba991379Sopenharmony_ci    ret = ''
479ba991379Sopenharmony_ci    i = 0
480ba991379Sopenharmony_ci    while True:
481ba991379Sopenharmony_ci        out = ser.read(ser.inWaiting())
482ba991379Sopenharmony_ci        if not out:
483ba991379Sopenharmony_ci            break
484ba991379Sopenharmony_ci        if i > 12:
485ba991379Sopenharmony_ci            break
486ba991379Sopenharmony_ci        ret = ret + out.decode(encoding="utf-8", errors="ignore")
487ba991379Sopenharmony_ci        time.sleep(timeout)
488ba991379Sopenharmony_ci        i = i + 1
489ba991379Sopenharmony_ci    logger.info("result is: %s " % ret)
490ba991379Sopenharmony_ci    return ret
491ba991379Sopenharmony_ci
492ba991379Sopenharmony_cidef sendHdcCmd(cmd):
493ba991379Sopenharmony_ci    from subprocess import getstatusoutput
494ba991379Sopenharmony_ci    i = 0
495ba991379Sopenharmony_ci    while True:
496ba991379Sopenharmony_ci        if i > 3:
497ba991379Sopenharmony_ci            break
498ba991379Sopenharmony_ci        try:
499ba991379Sopenharmony_ci            out = executeHdcCmd(cmd)
500ba991379Sopenharmony_ci            logger.info('hdc cmd success')
501ba991379Sopenharmony_ci            return out
502ba991379Sopenharmony_ci        except Exception as e:
503ba991379Sopenharmony_ci            logger.info(str(e))
504ba991379Sopenharmony_ci            logger.info('hdc cmd fail')
505ba991379Sopenharmony_ci            i += 1
506ba991379Sopenharmony_ci            time.sleep(1)
507ba991379Sopenharmony_ci            continue
508ba991379Sopenharmony_ci    logger.error('hdc cmd execute fail by three times')
509ba991379Sopenharmony_ci    return ''
510ba991379Sopenharmony_ci
511ba991379Sopenharmony_ci@timeout(10)
512ba991379Sopenharmony_cidef executeHdcCmd(cmd):
513ba991379Sopenharmony_ci    logger.info('cmd is %s' % cmd)
514ba991379Sopenharmony_ci    time.sleep(0.5)
515ba991379Sopenharmony_ci    ret, out = getstatusoutput(cmd)
516ba991379Sopenharmony_ci    time.sleep(0.5)
517ba991379Sopenharmony_ci    if ret != 0:
518ba991379Sopenharmony_ci        logger.info('execute fail')
519ba991379Sopenharmony_ci        return 'execute fail'
520ba991379Sopenharmony_ci    logger.info('result is %s'% out)
521ba991379Sopenharmony_ci    return out
522ba991379Sopenharmony_ci
523ba991379Sopenharmony_ciif __name__ == '__main__':
524ba991379Sopenharmony_ci    ser = serial.Serial('com5', 115200, timeout=0)