def step_7_8(**kwargs):
    log = kwargs.get("log")
    case_name = kwargs.get("case_name")
    user_password = kwargs.get("user_password", "1")
    try:
        log.info("start set the user password")
        set_user_password(password=user_password)
        os.system("mclient --quiet set root/screensaver/lockScreenUser 1"
                  )  # enable require password for general users
        os.system("mclient commit")
        log.info("enable require password for general users")
        pmcf.SwitchThinProMode("user")
        screensaver = ScreenSaver()
        log.info("lock screen")
        screensaver.lock_screen_by_hotkey()  # lock screen
        time.sleep(2)
        pyautogui.click()
        time.sleep(2)
        if not wait_element(pic("_screen_lock_by_user")):
            log.error("not found the lock screen dialog")
            pyautogui.click()
            return [False, "not found the lock screen dialog"]
        log.info("found the lock screen dialog")
        pyautogui.typewrite(user_password)
        time.sleep(1)
        pyautogui.press("enter")
        time.sleep(2)
        if wait_element(pic("_screen_lock_by_user")):
            log.error("unlock fail")
            log.debug(
                "unlock fail",
                cf.get_current_dir(
                    'Test_Report', 'img',
                    '{}.png'.format(case_name.replace(' ', '_'))))
            screensaver.resume_screensaver_by_keyboard()
            pyautogui.screenshot(
                cf.get_current_dir("Test_Report/screen_lock_citrix_error.png"))
            return [False, "unlock fail"]
        log.info("unlock success")
        return [True, "unlock success"]
    except:
        log.error(traceback.format_exc())
        return [False, traceback.format_exc()]
def lock_screen():
    log.info("press ctrl alt s to lock screen")
    ScreenSaver.lock_screen_by_hotkey()
    if not linux_check_locked() or click_icon('start'):
        log.info("screen not locked, try again")
        ScreenSaver.lock_screen_by_command()
def step_2(**kwargs):
    log = kwargs.get("log")
    case_name = kwargs.get("case_name")
    try:
        pmcf.SwitchThinProMode("user")
        multiuser = vdi_connection.MultiUserManger()
        for _ in range(6):
            user = multiuser.get_a_available_key()
            if user:
                break
            time.sleep(180)
        else:
            log.error("not get a valid user")
            return [False, "not has invalid user"]
        parameters = {'vdi': 'citrix', 'session': 'win10'}
        citrix = vdi_connection.CitrixLinux(
            user=user,
            setting=vdi_setting()["set"]["citrix"]
            ["screen_lock_with_password_step2"],
            parameters=parameters)

        for _ in range(2):
            if citrix.logon(parameters.get("session", "")):
                for _ in range(10):
                    time.sleep(10)
                    if wait_element(pic("_win10_start_icon")):
                        break
                else:
                    log.debug(
                        "log on vdi fail",
                        cf.get_current_dir(
                            'Test_Report', 'img',
                            '{}.png'.format(case_name.replace(' ', '_'))))
                    citrix.logoff()
                    time.sleep(5)
                    continue
                break
        else:
            log.debug(
                "log on vdi fail",
                cf.get_current_dir(
                    'Test_Report', 'img',
                    '{}.png'.format(case_name.replace(' ', '_'))))
            os.system("wmctrl -c 'Citrix Workspace'")
            multiuser.reset_key(user)
            return [False, "log on vdi fail"]
        log.info("logon vdi success")
        screensaver = ScreenSaver()
        screensaver.lock_screen_by_hotkey()
        log.info("lock screen")
        time.sleep(2)
        pyautogui.click()
        time.sleep(2)
        if wait_element(pic("_lock_screen_dialog")):
            log.error("found lock screen dialog")
            citrix.logoff()
            multiuser.reset_key(user)
            return [False, "found lock screen dialog"]
        if wait_element(pic("_win10_start_icon")):
            log.info("unlock screen success")
            citrix.logoff()
            multiuser.reset_key(user)
            return [True, "unlock screen success"]
        log.error("unlock screen fail")
        citrix.logoff()
        multiuser.reset_key(user)
        return [False, "unlock screen fail"]
    except:
        log.error(traceback.format_exc())
        return [False, traceback.format_exc()]
def step_9(**kwargs):
    log = kwargs.get("log")
    case_name = kwargs.get("case_name")
    user_password = kwargs.get("user_password", "1")
    try:
        pmcf.SwitchThinProMode("user")
        multiuser = vdi_connection.MultiUserManger()
        for _ in range(6):
            user = multiuser.get_a_available_key()
            if user:
                break
            time.sleep(180)
        else:
            log.error("not get a valid user")
            return [False, "not has invalid user"]
        parameters = {'vdi': 'citrix', 'session': 'win10'}
        vdi = vdi_connection.CitrixLinux(user=user,
                                         setting=vdi_setting()["set"]["citrix"]
                                         ["screen_lock_with_password_step3"],
                                         parameters=parameters)
        for _ in range(2):
            if vdi.logon(parameters.get("session", "")):
                for _ in range(10):
                    time.sleep(10)
                    if wait_element(pic("_win10_start_icon")):
                        break
                else:
                    log.debug(
                        "log on vdi fail",
                        cf.get_current_dir(
                            'Test_Report', 'img',
                            '{}.png'.format(case_name.replace(' ', '_'))))
                    vdi.logoff()
                    time.sleep(5)
                    continue
                break
        else:
            log.debug(
                "log on vdi fail",
                cf.get_current_dir(
                    'Test_Report', 'img',
                    '{}.png'.format(case_name.replace(' ', '_'))))
            multiuser.reset_key(user)
            return [False, "log on vdi fail"]
        log.info("logon vdi success")
        log.info("start lock screen")
        screensaver = ScreenSaver()
        screensaver.lock_screen_by_hotkey()  # lock screen
        time.sleep(2)
        pyautogui.click()
        if not wait_element(pic("_user_of_credentials")):
            log.error("'user' not in credentials list")
            vdi.logoff()
            multiuser.reset_key(user)
            return [False, "'user' not in credentials list"]
        log.info("'user' in credentials list")
        log.info("try use logon vdi password to unlock")
        pyautogui.typewrite(vdi_user_info()["password"], interval=0.1)
        time.sleep(1)
        pyautogui.press("enter")
        time.sleep(1)
        if not wait_element(pic("_win10_start_icon")):
            log.error("unlock screen fail")
            vdi.logoff()
            multiuser.reset_key(user)
            return [False, "unlock screen fail"]
        log.info("unlock screen success")

        time.sleep(2)
        screensaver.lock_screen_by_hotkey()
        time.sleep(2)
        pyautogui.click()
        if not wait_element(pic("_user_of_credentials")):
            log.error("'user' not in credentials list")
            vdi.logoff()
            multiuser.reset_key(user)
            return [False, "'user' not in credentials list"]
        log.info("'user' in credentials list")
        log.info("try use 'user' to unlock")

        if wait_element(pic("_tool")):
            pyautogui.press("tab", presses=5, interval=0.3)
        else:
            pyautogui.press("tab", presses=9, interval=0.3)
        pyautogui.typewrite("user", interval=0.1)
        pyautogui.press("tab")
        time.sleep(1)
        pyautogui.typewrite(user_password, interval=0.1)
        time.sleep(1)
        pyautogui.press("enter")
        if not wait_element(pic("_win10_start_icon")):
            log.error("unlock screen fail")
            vdi.logoff()
            multiuser.reset_key(user)
            return [False, "'user' not in credentials list"]
        log.info("unlock screen success")
        log.info("start logoff vdi")
        vdi.logoff()
        multiuser.reset_key(user)
        return [True, "success"]
    except:
        log.error(traceback.format_exc())
        return [False, traceback.format_exc()]
def step_5_6(**kwargs):
    log = kwargs.get("log")
    session = kwargs.get("session")
    case_name = kwargs.get('case_name')
    root_password = kwargs.get("root_password", "1")
    try:
        pmcf.SwitchThinProMode("user")
        multiuser = vdi_connection.MultiUserManger()
        for _ in range(6):
            user = multiuser.get_a_available_key()
            if user:
                break
            time.sleep(180)
        else:
            log.error("not get a valid user")
            return [False, "not has invalid user"]
        citrix = vdi_connection.CitrixLinux(
            user=user,
            setting=vdi_setting()["set"]["citrix"]
            ["screen_lock_with_password_step5"],
            parameters={
                'vdi': 'citrix',
                'session': 'win10'
            })
        if not citrix.import_cert():
            log.error("thinpro import rootca certificate fail")
            multiuser.reset_key(user)
            return [False, "thinpro import rootca certificate fail"]
        citrix.delete_vdi('xen')
        citrix.create_vdi('xen')
        time.sleep(1)
        citrix_id = citrix.vdi_connection_id('xen')[0]
        citrix.set_citrix_connection_from_yml(citrix_id)

        log.info("connect citrix VDI desktop")
        time.sleep(1)
        # os.popen("connection-mgr start {}".format(citrix_id))
        for _ in range(2):
            citrix.connect_vdi_by_pic()

            time.sleep(10)
            if not wait_element(pic("_citrix_input_credentials_dialog")):
                log.debug(
                    "not open input credentials dialog",
                    cf.get_current_dir(
                        'Test_Report', 'img',
                        '{}.png'.format(case_name.replace(' ', '_'))))
                os.system("wmctrl -c 'HP - Citrix Server Error'")
                os.system("wmctrl -c 'Citrix Workspace'")
                time.sleep(5)
                continue
            log.info("input domain, user and password")
            pyautogui.typewrite(r"{}\{}".format(vdi_user_info()["domain"],
                                                user),
                                interval=0.1)
            pyautogui.press("tab")
            pyautogui.typewrite(vdi_user_info()["password"], interval=0.1)
            pyautogui.press("enter")
            log.info(r"user: '******', password: '******'".format(
                vdi_user_info()["domain"], user,
                vdi_user_info()["password"]))
            time.sleep(20)

            if not wait_element(pic("_citrix_workspace_broker")):
                if wait_element(pic("_win10_start_icon")
                                ):  # check whether auto logon vdi desktop
                    log.info("auto logon vdi desktop success")
                    pyautogui.click(1, 1)
                    break
                else:
                    log.debug(
                        "open citrix workspace broker fail",
                        cf.get_current_dir(
                            'Test_Report', 'img',
                            '{}.png'.format(case_name.replace(' ', '_'))))
                    os.system("wmctrl -c 'HP - Citrix Server Error'")
                    os.system("wmctrl -c 'Citrix Workspace'")
                    time.sleep(5)
                    continue
            else:
                log.info("open citrix workspace broker success")
                if not citrix.logon_desktop_by_pic():
                    log.debug(
                        "desktops or target desktop not found",
                        cf.get_current_dir('Test_Report', 'img',
                                           '{}.png'.format(case_name)))
                    os.system("wmctrl -c 'HP - Citrix Server Error'")
                    os.system("wmctrl -c 'Citrix Workspace'")
                    time.sleep(5)
                    continue
                for i in range(15):
                    log.info("wait log on citrix desktop...")
                    time.sleep(10)
                    if wait_element(pic("_win10_start_icon")):
                        log.info("login vdi connection success")
                        break
                    else:
                        continue
                else:
                    log.debug(
                        "login vdi connection fail",
                        cf.get_current_dir(
                            'Test_Report', 'img',
                            '{}.png'.format(case_name.replace(' ', '_'))))
                    os.system("wmctrl -c 'HP - Citrix Server Error'")
                    os.system("wmctrl -c 'Citrix Workspace'")
                    time.sleep(5)
                    continue
                break
        else:
            os.system("wmctrl -c 'Citrix Workspace'")
            multiuser.reset_key(user)
            return [False, "login vdi connection fail"]

        time.sleep(5)
        screensaver = ScreenSaver()
        screensaver.lock_screen_by_hotkey()  # lock screen
        time.sleep(2)
        pyautogui.press("enter")
        time.sleep(2)
        if not wait_element(pic("_lock_screen_dialog")):
            log.error("not found the lock screen dialog")
            citrix.logoff()
            multiuser.reset_key(user)
            return [False, "not found the lock screen dialog"]
        if wait_element(pic("_user_of_credentials")
                        ):  # user in the list of new credentials
            log.error("'user' in credentials dialog")
            citrix.logoff()
            multiuser.reset_key(user)
            return [False, "'user' in credentials dialog"]
        log.info("'user' not in credentials dialog")
        log.info("try use 'root' to unlock")
        if wait_element(pic("_tool")):
            pyautogui.press("tab", presses=5, interval=0.3)
        else:
            pyautogui.press("tab", presses=9, interval=0.3)
        pyautogui.typewrite("root", interval=0.1)
        pyautogui.press("tab")
        pyautogui.typewrite(root_password, interval=0.1)
        pyautogui.press("enter")
        time.sleep(2)

        if not wait_element(pic(
                "_invalid_credentials")):  # check invalid credentials dialog
            log.error("not found invalid credentials dialog")
            citrix.logoff()
            multiuser.reset_key(user)
            return [False, "not found invalid credentials dialog"]
        pyautogui.press("enter")
        cancel = wait_element(pic("_cancel"))
        pyautogui.click(cancel[0])
        time.sleep(1)
        pyautogui.press("enter")
        time.sleep(1)
        pyautogui.typewrite(vdi_user_info()["password"], interval=0.1)
        pyautogui.press("enter")
        time.sleep(2)
        if not wait_element(pic("_win10_start_icon")):
            log.error("into the vdi desktop fail")
            citrix.logoff()
            multiuser.reset_key(user)
            return [False, "into the vdi desktop fail"]
        log.info("into the vdi desktop success")
        log.info("screen can be unlock by the credentials")
        citrix.logoff()
        multiuser.reset_key(user)
        return [True, "screen can be unlock by the credentials"]
    except:
        log.info(traceback.format_exc())
        return [False, traceback.format_exc()]