示例#1
0
def import_cert(cert="ROOTCA.pem"):
    time.sleep(1)
    log.info("start import certificate")
    rootca_pem_1 = os.path.exists("/etc/ssl/certs/ROOTCA.pem")
    if rootca_pem_1:
        log.info("certificate is already exist")
        return True
    else:
        log.info("certificate not exist, start install cert")
        shutil.copy(
            os.path.join(get_current_dir(), 'Test_Utility', 'ROOTCA.pem'),
            '/usr/local/share/ca-certificates/ROOTCA.pem')
        time.sleep(0.2)
        c = os.path.exists("/usr/local/share/ca-certificates/{}".format(cert))
        if not c:
            log.error('copy cert fail')
            return False
        log.info('copy cert success')
        subprocess.getstatusoutput("/usr/bin/hptc-cert-mgr --apply")
        time.sleep(4)
        rootca_pem_2 = os.path.exists("/etc/ssl/certs/ROOTCA.pem")
        if not rootca_pem_2:
            log.error('install certificates fail')
            return False
        else:
            log.info('install certificates success')
            time.sleep(1)
            return True
def enable_wlan(device_name):
    try:
        subprocess.run(
            "/usr/lib/hptc-network-mgr/wireless/hptc-wireless-manager --up {}".
            format(device_name),
            shell=True)
        log.info("enable {}".format(device_name))
    except Exception as e:
        log.error(e)
示例#3
0
 def get_user():
     try:
         user = getpass.getuser()
         return user
     except Exception as e:
         log.error(
             "[socket server][get_user]Error while getting user: {}".format(
                 e))
         return ""
def enable_lan_filber(device_name):
    try:
        subprocess.Popen(
            "/usr/lib/hptc-network-mgr/common/netmgr_wired --up {}".format(
                device_name),
            shell=True)
        log.info("enable {}".format(device_name))
    except Exception as e:
        log.error(e)
示例#5
0
 def __init__(self, client_socket):
     threading.Thread.__init__(self)
     self.client_socket: socket.socket = client_socket
     self.user = self.get_user().lower()
     if self.user in User_List:
         ip = self.client_socket.getsockname()[0]
         try:
             user_manager.change_key_state(self.user, ip)
         except Exception as e:
             log.error("change key {} fail {} : {}".format(
                 self.user, ip, e))
示例#6
0
 def log_off():
     try:
         os.system("shutdown -l")
         print('logoff')
         time.sleep(5)
         return True
     except Exception as e:
         log.error(
             "[socket server][log_off]Error while logging off: {}".format(
                 e))
         return False
示例#7
0
 def run(self):
     while True:
         data = self.client_socket.recv(BUFSIZE)
         print(data, "[socket server][run]data")
         if not data:
             log.info(
                 '[socket server][run]No response. Close the client connection {0}.'
                 .format(self.client_socket.getpeername()))
             # self.client_socket.sendall('No data received. Connection closed.'.encode(encoding))
             # print('socket connection disconnect')
             break
         string = bytes.decode(data, encoding).strip()
         log.info(
             "[socket server][run]Content from client: {}.".format(string))
         if string.upper() == 'GET_USER':
             user = self.get_user()
             if user:
                 self.client_socket.sendall(
                     '{}'.format(user).encode(encoding))
             else:
                 self.client_socket.sendall(
                     '[socket server][run]get_user fail'.encode(encoding))
         elif string.upper() == 'LOGOFF':
             logoff = self.log_off()
             if logoff:
                 self.client_socket.sendall(
                     '[socket server][run]logoff done'.encode(encoding))
             else:
                 self.client_socket.sendall(
                     '[socket server][run]logoff fail'.encode(encoding))
         elif 'WAKEUP' in string.upper():
             # wakeup mac time(s)
             log.info("[socket server][run]Send 'Accept {}'".format(string))
             self.client_socket.sendall(
                 'Accept {}'.format(string).encode(encoding))
             info = string.split(" ")[1:]
             log.info("[socket server][run]start wakeup {}".format(
                 " ".join(info)))
             self.wake_up(*info)
         elif string.upper() == 'GETINFO':
             info = self.get_info()
             if info:
                 self.client_socket.sendall(
                     '{}'.format(info).encode(encoding))
             else:
                 self.client_socket.sendall(
                     '[socket server][run]get_info fail'.encode(encoding))
         else:
             log.error(
                 '[socket server][run]Invalid message {}.'.format(string))
             break
     self.client_socket.close()
示例#8
0
 def wake_up(mac, *args):
     try:
         tool_path = r".\wol.exe"
         time.sleep(int(args[0]))
         for i in range(8):
             time.sleep(1)
             log.info("Send: {} {}".format(tool_path, mac))
             os.system("{} {}".format(tool_path, mac))
         return True
     except Exception as e:
         log.error(e)
         log.error("[socket server][wake_up]Wakeup fail")
         return True
示例#9
0
 def change_key_state(self, user_name, state, key="user"):
     self.ftp.download_file(self.remote_base_file, self.file_path)
     time.sleep(2)
     yaml_obj = YamlOperator(self.file_path)
     total_users = yaml_obj.read()
     value = total_users.get(key).get(user_name)
     if value:
         total_users[key][user_name] = state
         yaml_obj.write(total_users)
         self.ftp.upload_file(self.file_path, self.remote_base_file)
     else:
         log.error('invalid user {}'.format(user_name))
         return False
     return True
示例#10
0
def ping_server(ip="15.83.240.98"):
    log.info("start ping " + ip)
    s = subprocess.Popen("ping {} -c 50 | grep -i received".format(ip),
                         stdout=subprocess.PIPE,
                         stdin=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         shell=True)
    out, error = s.communicate(timeout=60)
    out = out.decode()
    out_list = out.split(',')
    try:
        s.kill()
        res = re.search(r"(\d+)", out_list[2])
        result = res.group(1)
        if int(result) <= 25:
            log.info("ping " + ip + " success")
            return True
        # if out_list[2] == ' 0% packet loss':
        #     log.info("ping " + ip + " success")
        #     return True
        else:
            log.error("ping " + ip + " fail")
            log.error(f'ping {ip} result: {out}')
            return False
    except Exception as e:
        log.error(e)
        log.error("ping " + ip + " fail")
        return False
示例#11
0
 def run(self):
     log.info("Socket server Listener started.")
     try:
         while True:
             client_socket, client_addr = self.sock.accept()
             # print("Accept a connect from client {}.".format(client_addr[0]))
             log.info(
                 "Accept a connect from client {}.".format(client_addr))
             client_socket.sendall(
                 'Hi, I got your request. We can start to communicate.'.
                 encode(encoding))
             Process(client_socket).start()
     except Exception as e:
         log.error(e)
         log.error("socket client error, and break")
示例#12
0
 def start(self):
     self.__set()
     assert self.__method_name_list, "Need a method list!"
     index = self.read_a_file()
     log.info("Get Status: {}".format(index))
     if index == -1:
         log.info(" This {} Flow has Ended".format(self.__class_name))
         return
     flag = True
     self.current_step = index
     new_list = self.__method_name_list[index:]
     for method_name in new_list:
         if method_name in self.__skip_list:
             self.current_step += 1
             continue
         method = self.__dic.get(method_name)
         assert method, "{} Not Exist".format(method_name)
         log.info("Start Step Method {}".format(method_name))
         try:
             result_dict = {"event_method": method, "return": True}
             method(self)
             self.result_handler.update_class_property(**result_dict)
             self.result_handler.start()
             self.exec_callback(self.__work_around_list_success)
         except self.exception as e:
             flag = False
             self.suspend_exec()
             self.end_flow()
             log.error(e)
             result_dict = {
                 "event_method": method,
                 "error_msg": {
                     "actual":
                     "Fail at Index {} : {}".format(self.current_step, e)
                 },
                 "return": False
             }
             self.result_handler.update_class_property(**result_dict)
             self.result_handler.start()
             self.exec_callback(self.__work_around_list_fail)
         if not self.__exec:
             break
         self.current_step += 1
     log.debug("Capture Flag Return : {}".format(flag))
     return flag
示例#13
0
def load_data_from_ftp():
    file_obj = YamlOperator(
        get_current_dir('Test_Data', 'td_common', 'global_config.yml'))
    content = file_obj.read()
    ftp_server = content['td_ftp']['server']
    ftp_user = content['td_ftp']['username']
    ftp_passwd = content['td_ftp']['password']
    td_path = content['td_ftp']['td_path']
    try:
        ftp = FTPUtils(ftp_server, ftp_user, ftp_passwd)
        ftp.change_dir(td_path)
        folders = ftp.get_item_list('')
        for folder in folders:
            if not ftp.is_item_file(folder):
                ftp.download_dir(folder, get_current_dir(folder))
        ftp.close()
    except:
        log.error('ftp exception:\n{}'.format(traceback.format_exc()))
示例#14
0
 def __load_uut_result(self):
     result_file = get_current_dir('Test_Report', '{}.yaml'.format(self.ip))
     if not os.path.exists(result_file):
         empty_result = [{
             'uut_name': self.ip,
             'case_name': 'No result return',
             'steps': [],
             'result': 'fail'
         }, {
             'uut_name': self.ip,
             'case_name': 'No result return',
             'steps': [],
             'result': 'pass'
         }]
         log.error('Result File {} Not Exsit'.format(result_file))
         result = empty_result
     else:
         with open(result_file, encoding='utf-8') as f:
             result = yaml.safe_load(f.read())
     try:
         self.return_to_ALM(result)
     except Exception as e:
         log.error('Fail to return result to ALM:')
         log.error(str(e))
     return result
示例#15
0
def collect_report():
    """
    collect report and send to ALM server for automated return result to ALM
    alm need addition.yml(case<->alm information), ip.yml(cases result)
    :return:
    #By: balance
    """
    # expect only ip.yml exist in test_report
    global_conf = YamlOperator(
        get_current_dir('Test_Data', 'td_common', 'global_config.yml')).read()
    ftp_svr = global_conf['alm_ftp']['server']
    ftp_user = global_conf['alm_ftp']['username']
    ftp_pass = global_conf['alm_ftp']['password']
    ftp_path = global_conf['alm_ftp']['report_path']
    result_file = get_folder_items(get_current_dir('Test_Report'),
                                   file_only=True,
                                   filter_name='.yaml')[0]
    log.info(f'[common][collect result]Get result file: {result_file}')
    prefix = time.strftime("test_%m%d%H%M%S", time.localtime())
    log.info(
        '[common][collect result]Copy additional.yml and ip.yml to test report'
    )
    shutil.copy(get_current_dir('Test_Data', 'additional.yml'),
                get_current_dir('Test_Report', '{}_add.yml'.format(prefix)))
    shutil.copy(get_current_dir('Test_Report', result_file),
                get_current_dir('Test_Report', '{}_result.yml'.format(prefix)))
    try:
        ftp = file_transfer.FTPUtils(ftp_svr, ftp_user, ftp_pass)
        ftp.change_dir(ftp_path)
        ftp.upload_file(
            get_current_dir('Test_Report', '{}_result.yml'.format(prefix)),
            '{}_result.yml'.format(prefix))
        ftp.upload_file(
            get_current_dir('Test_Report', '{}_add.yml'.format(prefix)),
            '{}_add.yml'.format(prefix))
        ftp.close()
        log.info('[common][collect result]upload report to ftp server')
    except:
        log.error('[common][collect result]FTP Fail Exception:\n{}'.format(
            traceback.format_exc()))
示例#16
0
def memory_check(dtype="-m", limit: int = 300, strict_mode=True):
    """
    check memeory > limit
    raise ValueError if strict_mode is Ture else return False
    """
    try:
        res = os.popen(f"free {dtype}").readlines()
        line_name = res[0]
        line_value = res[1]
        index = line_name.index("available")
        available_str = line_value[index:index +
                                   len("available")].strip("kbgyteKBGYTE ")
        avail = float(available_str)
        print(avail)
    except Exception as e:
        log.error(e)
        return -1
    if avail < limit and strict_mode:
        raise MemoryNotSufficient(
            "current Memory is not sufficient! Current: {}".format(avail))
    elif avail < limit:
        return False
    return True
示例#17
0
def remote_start(case_name, result_file, test_data, pic_name, user_manager, parameters, performance):
    global session, rdp_server, user
    if parameters['vdi'].upper() == 'RDP':
        session = parameters.get('session')
        rdp_server = user_manager.get_a_available_key(session.lower())
        conn = vdi_connection.RDPLinux(user=user, parameters=parameters, rdp_server=rdp_server)
    elif parameters['vdi'].upper() == 'VIEW':
        conn = vdi_connection.ViewLinux(user=user, parameters=parameters)
    elif parameters['vdi'].upper() == 'CITRIX':
        conn = vdi_connection.CitrixLinux(user=user, parameters=parameters)
    else:
        conn = None
    log.info('init connection instance')
    first_collect_flag = False
    if conn:
        # VDI Test
        conn_flag = False
        for count in range(2):
            logon = conn.logon(parameters['session'])
            if logon is True:
                pymouse.PyMouse().click(1, 1)
                log.info('successfully logon session: {}'.format(parameters['session']))
                steps = {
                    'step_name': 'logon vdi',
                    'result': 'Pass',
                    'expect': '',  # can be string or pic path
                    'actual': 'logon successfully',
                    'note': ''}
                common_function.update_cases_result(result_file, case_name, steps)
                conn_flag = True
                pic_sim, diff_res, first_collect_flag = check_layout(os.path.join(test_data,
                                                              'td_multiple_display',
                                                              '{}_pic'.format(parameters['vdi']).lower(),
                                                              pic_name))
                if pic_sim >= 0.99:
                    log.info('check layout pass')
                    steps = {
                        'step_name': 'check vdi layout',
                        'result': 'Pass',
                        'expect': 'similarity > 99%',  # can be string or pic path
                        'actual': 'layout and resolution set correctly: {}'.format(pic_sim),
                        'note': ''}
                    common_function.update_cases_result(result_file, case_name, steps)
                else:
                    log.error('check layout Fail, autual: {}'.format(pic_sim))
                    shutil.copy(common_function.get_current_dir('temp.png'),
                                common_function.get_current_dir('Test_Report', 'img', '{}.jpg'.format(case_name)))
                    steps = {
                        'step_name': 'check vdi layout',
                        'result': 'Fail',
                        'expect': 'similarity > 99%',  # can be string or pic path
                        'actual': 'img/{}.png'.format(case_name),  # can be string or pic path
                        'note': 'actual result: {}'.format(pic_sim)}
                    common_function.update_cases_result(result_file, case_name, steps)
                    if not os.path.exists(common_function.get_current_dir('Test_Report', 'img')):
                        os.mkdir(common_function.get_current_dir('Test_Report', 'img'))
                    try:
                        common_function.check_free_memory("beforeremote")
                        picture_operator.save_from_data(
                            '{}'.format(common_function.get_current_dir('Test_Report', 'img',
                                                                        '{}.png'.format(
                                                                            case_name))),
                            diff_res)
                        common_function.check_free_memory("afterremote")
                    except:
                        save_fail_path = common_function.get_current_dir('Test_Report', 'img', 'save_fail_remote_{}.txt'.format(case_name))
                        f = open(save_fail_path, "w")
                        f.write(traceback.format_exc())
                        f.close()
                    finally:
                        log.debug(gc.garbage)
                        gc.collect()

                log.info("collecting performance data")
                path = "{}/Test_Report/performance/".format(common_function.get_current_dir())
                if not os.path.exists(path):
                    os.makedirs(path)
                performance.file = path + "{}.txt".format("".join(case_name.split("_")[2:-4]).replace(" ", ""))
                performance.start()
                conn.logoff()
                break
            elif isinstance(logon, str):
                log.warning('logon fail in cycle {}'.format(count))
                # wait 2min try again
                time.sleep(120)
                if not user:
                    log.info("user get none before, try to get a new user")
                    user = user_manager.get_a_available_key()
                    conn.user = user
                if parameters['vdi'].upper() == 'RDP' and not rdp_server:
                    log.info("try to get rdp_server")
                    session = parameters.get('session')
                    rdp_server = user_manager.get_a_available_key(session.lower())
                    conn.server = rdp_server
                    conn.domain_list = [rdp_server]
                continue
            else:
                log.error("logon fail in cycle {}& white list can't catch it, break!".format(count))
                break

        if not conn_flag:
            log.error('logon fail, and try count finished')
            steps = {
                'step_name': 'logon vdi',
                'result': 'Fail',
                'expect': '',  # can be string or pic path
                'actual': 'Fail to logon within 6 mins',  # can be string or pic path
                'note': ''}
            common_function.update_cases_result(result_file, case_name, steps)
            return False, first_collect_flag
    return True, first_collect_flag
示例#18
0
def main():
    # show_desktop()
    if os.path.exists(get_current_dir('flag.txt')):
        with open(get_current_dir('flag.txt')) as f:
            test_flag = f.read()
            if 'TEST FINISHED' in test_flag.upper():
                return
    if not os.path.exists('time.txt'):
        with open('time.txt', 'w') as f:
            f.write(time.ctime())
    prepare_for_framework()
    additional_path = get_current_dir('Test_Data', 'additional.yml')
    file_obj = YamlOperator(additional_path)
    content = file_obj.read()
    site = content.get('AutoDash_Site')
    if not site:
        load_data_from_ftp()
        script_name = os.path.basename(__file__).split('.')[0]
        add_linux_script_startup([script_name])
        check_water_mark()
    path = get_current_dir('reboot.txt')
    if not os.path.exists(path):
        with open(path, 'w+') as f:
            f.write("0")
        time.sleep(5)
        if os.path.exists(path):
            SwitchThinProMode("admin")
            os.popen('reboot')
            time.sleep(30)
    if not os.path.exists(get_current_dir('Test_Report')):
        os.mkdir(get_current_dir('Test_Report'))
    test_data_path = os.path.join(get_current_dir(), 'Test_Data')
    with open(get_current_dir('flag.txt'), 'w') as f:
        f.write('testing')
    if not os.path.exists(os.path.join(test_data_path, 'script.yml')):
        log.info('script.yml not exist, please check if no cases planned')
        with open(get_current_dir('flag.txt'), 'w') as f:
            f.write('test finished')
        return
    with open(os.path.join(test_data_path, 'script.yml'), 'r') as f:
        scripts = yaml.safe_load(f)
    with open(os.path.join(test_data_path, 'additional.yml'), 'r') as f:
        additional = yaml.safe_load(f)
    for script in scripts:
        script_name, script_status = list(script.items())[0]
        if script_status.upper() == 'NORUN':
            log.info('Begin to Test case {}'.format(script_name))
            try:
                if need_reboot() == 1:
                    change_reboot_status(0)
                    reboot_command()
                memory_check(limit=MEMORY_LIMIT)
                globals()[script_name.split('__')[0]].start(
                    case_name=script_name.split('__')[1], kwargs=additional)
                script[script_name] = 'Finished'
                with open(os.path.join(test_data_path, 'script.yml'),
                          'w') as f:
                    yaml.safe_dump(scripts, f)
            except MemoryNotSufficient as e:
                log.debug(e)
                log.debug("start reboot")
                reboot_command()
            except:
                with open(get_current_dir('Test_Report', 'debug.log'),
                          'a') as f:
                    f.write(traceback.format_exc())
                capture_screen(
                    get_current_dir(
                        'Test_Report',
                        'img',
                        '{}.jpg'.format(script_name.split('__')[1]),
                    ))
                script[script_name] = 'Finished'
                with open(os.path.join(test_data_path, 'script.yml'),
                          'w') as f:
                    yaml.safe_dump(scripts, f)
                steps = {
                    'step_name': 'case exception',
                    'result': 'Fail',
                    'expect': '',  # can be string or pic path
                    'actual': 'img/{}.jpg'.format(script_name.split('__')[1]),
                    'note': traceback.format_exc()
                }
                base_name = get_report_base_name()
                report_file = get_current_dir('Test_Report', base_name)
                # result_file = get_current_dir(r'Test_Report', '{}.yaml'.format(check_ip_yaml()))
                update_cases_result(report_file,
                                    script_name.split('__')[1], steps)
        else:
            log.info('Test case {} status is Finished, Skip test'.format(
                script_name))
    if os.path.exists(path):
        if need_reboot() == 0:
            change_reboot_status(9)
            log.info("Start Reboot before Report")
            reboot_command()
        else:
            os.remove(path)
    if site:
        share_folder = content.get('share_folder')
        host = share_folder.split('/')[0]
        folder_path = '/'.join(share_folder.split('/')[1:])
        user = content.get('user')
        password = content.get('password')
        flag_path = '/{}/{}.txt'.format(folder_path, site)
        log.info('end_flag: {}'.format(flag_path))

        with open(get_current_dir('{}.txt'.format(site)), 'w') as f:
            f.write('test finished')
        ftp = FTPUtils(host, user, password)
        ftp.ftp.cwd('ThinPro_Automation_Site')
        local_folder = get_current_dir('Test_Report')
        ftp_folder = r'/{}/Test_Report'.format(folder_path)

        num = 0
        while True:
            try:

                ftp = FTPUtils(host, user, password)
                log.info('upload Test_Report folder to ftp')
                log.info(local_folder)
                log.info(ftp_folder)
                ftp.new_dir(ftp_folder)
                local_report = get_current_dir('Test_Report',
                                               '{}.yaml'.format(site))
                ftp_report = '/{}/Test_Report/{}.yaml'.format(
                    folder_path, site)
                ftp.upload_file(local_report, ftp_report)
                ftp.upload_file(get_current_dir(r"{}.txt".format(site)),
                                flag_path)
                break
            except:
                if num > 30:
                    traceback.print_exc()
                    break
                else:
                    num += 5
                    time.sleep(5)
    else:
        with open(get_current_dir('flag.txt'), 'w') as f:
            f.write('test finished')
        with open('time.txt') as f:
            start = f.read()
        end = time.ctime()
        report = email_tool.GenerateReport(start, end)
        report.generate()
        file = email_tool.zip_dir()
        log.info('zipped file name: {}'.format(file_obj))
        additional_email = additional.get('email') if additional.get(
            'email') else ''
        email_tool.send_mail(
            recipient=['*****@*****.**', additional_email],
            subject='Automation Report Linux {}'.format(
                zip_file_name(get_report_number(), get_report_value())),
            attachment=file)
        os.remove(file)
        os.remove('time.txt')
        try:
            collect_report()
        except Exception as e:
            print(e)
            log.error(e)
示例#19
0
        report = email_tool.GenerateReport(start, end)
        report.generate()
        file = email_tool.zip_dir()
        log.info('zipped file name: {}'.format(file_obj))
        additional_email = additional.get('email') if additional.get(
            'email') else ''
        email_tool.send_mail(
            recipient=['*****@*****.**', additional_email],
            subject='Automation Report Linux {}'.format(
                zip_file_name(get_report_number(), get_report_value())),
            attachment=file)
        os.remove(file)
        os.remove('time.txt')
        try:
            collect_report()
        except Exception as e:
            print(e)
            log.error(e)


if __name__ == '__main__':
    try:
        if not os.path.exists(get_current_dir('Test_Data', 'profile.xml')):
            export_profile()
        main()
        if os.path.exists(get_current_dir('Test_Data', 'profile.xml')):
            os.popen('rm {}'.format(get_current_dir('Test_Data',
                                                    'profile.xml')))
    except:
        log.error(traceback.format_exc())
示例#20
0
    def switch_mode(self):
        if self.switch_to == 'user':
            if self.current_mode() == 'user':
                log.info("now is user mode")
                return True
            if self.current_mode() == 'admin':
                for _ in range(3):
                    os.popen('hptc-switch-admin')
                    time.sleep(2)
                    if self.current_mode() == 'user':
                        log.info("switch to user mode success")
                        return True
                    log.error("switch to user fail, try again")
                    time.sleep(2)
                else:
                    log.error("switch to user mode fail")
                    return False

        if self.switch_to == 'admin':
            if self.current_mode() == 'admin':
                log.info("now is admin mode")
                return True
            if self.current_mode() == 'user':
                log.info("change mode user")
                if self.judge_has_root_pw():
                    os.popen('hptc-switch-admin')
                    time.sleep(3)
                    # kb.type_string(self.password)
                    # time.sleep(1)
                    # kb.tap_key(kb.enter_key)
                    pyautogui.typewrite(self.password)
                    time.sleep(2)
                    pyautogui.press('enter')
                    time.sleep(2)
                    if self.current_mode() == 'admin':
                        log.info("switch to admin mode success")
                        return True
                    else:
                        kb.tap_key(kb.enter_key)
                        time.sleep(1)
                        kb.type_string('root')
                        time.sleep(1)
                        kb.tap_key(kb.tab_key)
                        time.sleep(1)
                        kb.type_string(self.password)
                        time.sleep(1)
                        kb.tap_key(kb.enter_key)
                        time.sleep(1)
                        if self.current_mode() == 'admin':
                            log.info("switch to admin mode success")
                            return True
                        else:
                            log.info("switch to admin mode fail")
                            return False

                if not self.judge_has_root_pw():
                    os.popen('hptc-switch-admin')
                    time.sleep(2)
                    kb.type_string(self.password)
                    time.sleep(1)
                    kb.tap_key(kb.tab_key)
                    time.sleep(1)
                    kb.type_string(self.password)
                    time.sleep(1)
                    kb.tap_key(kb.enter_key)
                    time.sleep(2)
                    if self.current_mode() == 'admin':
                        log.info("switch to admin mode success")
                        return True
                    else:
                        log.error("switch to admin mode fail")
                        return False