Jump to content
31290

Restart a function

Recommended Posts

Hi guys, 

Hope you are fine today :)

I'm trying to restart a function by calling it back in the script:

Here's my code so far:

Func f_VPN()
    $iInputBox = InputBox("Password", "Please Enter the User's password.")
    If @Error = 1 Then 
            GUICtrlSetState($fVPN, $GUI_UNCHECKED)
    Else
        ShellExecute("C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpnui.exe")
        $hVPN = WinWait("Cisco AnyConnect Secure Mobility Client", "Ready to connect")
        ControlClick($hVPN, "", "Button1")
        $hVPN1 = WinWait("Cisco AnyConnect | SEE VPN", "Cancel")
        ControlSetText($hVPN1, "", "Edit2", @Username)  
        Sleep(250)
        ControlSetText($hVPN1, "", "Edit3", $iInputBox)
        Sleep(250)
        ControlClick($hVPN1, "", "Button1")
        Sleep(5000)
        If ControlGetText("Cisco AnyConnect Secure Mobility Client", "", "Static2") = "Login Failed" Then 
            ControlClick("Cisco AnyConnect Secure Mobility Client", "", "Button4")
            WinClose($hVPN)
            f_VPN()
        Else
        ShellExecute("C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpnui.exe")
        If ControlGetText("Cisco AnyConnect Secure Mobility Client", "", "Static2") = "Connected To SEE VPN." Then ControlClick("Cisco AnyConnect Secure Mobility Client", "", "Button1")
        Sleep(1000)
        WinClose("Cisco AnyConnect Secure Mobility Client", "")
        ProcessClose("vpnui.exe")
        ; ProcessClose("explorer.exe") <<< TO UNCOMMENT
        IniWrite($oIniFile, "LaptopChkBox", "VPN", "1")
        EndIf
    EndIf   
EndFunc

I'd like to the function to be restarted in the case the password provided is not correct. 
I've googled many things but nothing very relevant.

Any ideas over here?

Thanks :)

-31290

 


~~~ Doom Shall Never Die, Only The Players ~~~

Share this post


Link to post
Share on other sites

How about breaking things up into nice separate functions so your program flow is much easier to control/steer?

Something like this (with a lot of pseudocode that you can fill in yourself :) ):

Global $MAX_PWD_FAIL_COUNT = 3

; main script
If Not fireItUp() Then
    MsgBox(16, "error", "something went wrong, you probably got an earlier error about this")
Else
    MsgBox(64, "all good", "vpn logged in!")
EndIf

Exit


Func fireItUp()

    $clientGui = startClient()
    If Not $clientGui Then
        MsgBox(64, "failure to start client", "failed")
        Return False
    EndIf

    $failCount = 0
    While Not loginClient($clientGui)
        $failCount += 1
        If $failCount > $MAX_PWD_FAIL_COUNT Then
            MsgBox(16, "failure to login client", "failed " & $MAX_PWD_FAIL_COUNT & " times! Cancelling.")
            ; break down gui, kill process, whatever
            cleanupAfterFailedLogin()
            ; Return False, so the calling code can tell that stuff went wrong
            Return False
        EndIf
    WEnd

    ; If we get here, we know that everything was ok
    cleanupAfterCorrectLogin()

    Return True ;
EndFunc   ;==>fireItUp

Func startClient()
    ; Start client
    ; Return $hVPN1 if success, False if failure
EndFunc   ;==>startClient

Func loginClient($clientGui)
    ; Do login stuff using $clientGui
    ; Wait for window to reflect success (then return True) or failure (then return False)
EndFunc   ;==>loginClient

Func cleanupAfterCorrectLogin()
    cleanupGeneral()
    ; ini write, log write, whatever specific for handling correct login
EndFunc   ;==>cleanupAfterCorrectLogin

Func cleanupAfterFailedLogin()
    cleanupGeneral()
    ; ini write, log write, whatever specific for handling failed login
EndFunc   ;==>cleanupAfterFailedLogin

Func cleanupGeneral()
    ; gui process/windows close, ini write etc., anything that needs to be done whether everything worked or not
EndFunc   ;==>cleanupGeneral

 

Edited by SadBunny

Roses are FF0000, violets are 0000FF... All my base are belong to you.

Share this post


Link to post
Share on other sites

Thanks for your input SadBunny.

Thing is that this "VPN" function (like many other function present in one file) is called when  a tech is clicking on a checkbox coming from a main GUI. Then  the tech have to enter the end user's password so the VPN connection can be tested. 

 

$gMainGUI = GUICreate("SEE CHECKLISTS", 333, 500)
    GUISetBkColor($Color_White)
    GUISetFont(8.5, 700, 0)
    ;GUICtrlCreatePic($sResources & "SAClogo.jpg", 75, 27, 183, 59)
    ;GUICtrlCreateLabel("SEE CHECKLISTS", 120, 114)
    GUICtrlSetColor(-1, 0x800080)
    ;GUICtrlCreateSeperator(0, 0, 135, 2, 390)
    GUICtrlCreateLabel("[ Current Computer name: " & @ComputerName & " ]", 50, 151, 324, 17)    
    GUICtrlSetColor(-1, $COLOR_RED)
    ;GUICtrlCreateSeperator(0, 0, 181, 2, 390)
    $fVPN = GUICtrlCreateCheckbox("Test the VPN connection", 5, 391)
    GUICtrlSetTip(-1, "Open Cisco and login with user's credentials")
    GUICtrlSetOnEvent($fVPN, "f_VPN")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUISetState(@SW_SHOW)

If login is OK, then go on with script. But if Login failed, VPN process test has to be launched one or two more times. That's why I really need the VPN function to be recalled within the function.


~~~ Doom Shall Never Die, Only The Players ~~~

Share this post


Link to post
Share on other sites

I believe the issue is with your Window naming, I can get it to work fine, if I change the ControlGetText and ControlClick "Title" and "ClassNN" after the "Sleep(5000)" line, I also removed the WinClose as I couldn't see the use of this.  I'm not sure why you can't just get the Tech to type the Password into the VPN Client though, especially since the Password window stays open after it fails.  You could just check once VPN has successfully logged in before updating your ini file.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Dan_555
      Hi, here are few functions for the ListBox.
      I have searched the forum, but most of the functions are for listview, so i took one example code from melba23 (clear selection) and
      wrote few more functions. (Because my current project needs them).
       
      These functions work only on a Multi-selection ListBox .
      The functions do: Clear Selection, Delete Selected items, Invert Selection, Move selected items up and down.
       The example code has 2 Listboxes. The selected items on the left ListBox can be moved up and down. The right Listbox has buttons for the other functions.
      #include <GUIConstantsEx.au3> #include <GuiListBox.au3> #include <WindowsConstants.au3> Global $hForm1 = GUICreate("Listbox test", 349, 287) $LB_1 = GUICtrlCreateList("", 6, 40, 157, 244, BitOR($LBS_NOTIFY, $LBS_MULTIPLESEL, $WS_HSCROLL, $WS_VSCROLL, $LBS_DISABLENOSCROLL)) $LB_2 = GUICtrlCreateList("", 179, 40, 157, 244, BitOR($LBS_NOTIFY, $LBS_MULTIPLESEL , $WS_HSCROLL, $WS_VSCROLL, $LBS_DISABLENOSCROLL)) $BL_1 = GUICtrlCreateButton("Up", 20, 3, 35, 18) $BL_2 = GUICtrlCreateButton("Down", 60, 3, 35, 18) $BR_1 = GUICtrlCreateButton("Up", 200, 3, 35, 18) $BR_2 = GUICtrlCreateButton("Down", 240, 3, 35, 18) $BR_3 = GUICtrlCreateButton("Reverse Sel", 272, 22, 68, 17) $BR_4 = GUICtrlCreateButton("Clear Sel", 217, 22, 52, 17) $BR_5 = GUICtrlCreateButton("Delete", 175, 22, 40, 17) $BR_6 = GUICtrlCreateButton("Populate", 290, 3, 50, 18) GUISetState(@SW_SHOW) For $x = 0 To 50 If $x <= 10 Then GUICtrlSetData($LB_1, $x & " test", 0) GUICtrlSetData($LB_2, $x & " Test", 0) Next While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $BL_1 $a = Listbox_ItemMoveUD($LB_1, -1) If $a > -1 Then WinSetTitle($hForm1, "", "Moved items: " & $a) Case $BL_2 $a = Listbox_ItemMoveUD($LB_1, 1) If $a > -1 Then WinSetTitle($hForm1, "", "Moved items: " & $a) Case $BR_1 Listbox_ItemMoveUD($LB_2, -1) Case $BR_2 Listbox_ItemMoveUD($LB_2, 1) Case $BR_3 Listbox_ReverseSelection($LB_2) Case $BR_4 Listbox_ClearSelection($LB_2) Case $BR_5 Listbox_DeleteSelectedItems($LB_2) Case $br_6 ;Populate GUICtrlSetData($LB_2, "") ; Clears the listbox For $x = 0 To 50 GUICtrlSetData($LB_2, $x & " Test", 0) Next EndSwitch WEnd ;note $hLB_ID - is the Listbox id Func Listbox_DeleteSelectedItems($hLB_ID) local $aSel = _GUICtrlListBox_GetSelItems($hLB_ID) Local $i For $i = $aSel[0] To 1 Step -1 _GUICtrlListBox_DeleteString($hLB_ID, $aSel[$i]) Next EndFunc ;==>Listbox_DeleteSelectedItems Func Listbox_ClearSelection($hLB_ID) Local $aSel = _GUICtrlListBox_GetSelItems($hLB_ID) ;Code from Melba23 - Autoit Forum For $i = 1 To $aSel[0] _GUICtrlListBox_SetSel($hLB_ID, $aSel[$i], False) Next EndFunc ;==>Listbox_ClearSelection Func Listbox_ReverseSelection($hLB_ID) Local $i Local $aCou = _GUICtrlListBox_GetCount($hLB_ID) Local $cSel = _GUICtrlListBox_GetCaretIndex($hLB_ID) ;Save the caret For $i = 0 To $aCou _GUICtrlListBox_SetSel($hLB_ID, $i, Not (_GUICtrlListBox_GetSel($hLB_ID, $i))) Next _GUICtrlListBox_SetCaretIndex($hLB_ID, $cSel) ;Restore the caret EndFunc ;==>Listbox_ReverseSelection Func Listbox_ItemMoveUD($hLB_ID, $iDir = -1) ;Listbox_ItemMoveUD - Up/Down - Works only on multiple selection listbox ($LBS_MULTIPLESEL) ;$iDir: -1 up, 1 down ;Return values -1 nothing to do, 0 nothing moved, >0 performed moves Local $iCur, $iNxt, $aCou, $aSel, $i, $m = 0 ;Current, next, Count, Selection, loop , movecount $aSel = _GUICtrlListBox_GetSelItems($hLB_ID) ;Put selected items in an array $aCou = _GUICtrlListBox_GetCount($hLB_ID) ;Get total item count of the listbox WinSetTitle ($hForm1,"",$aSel[0]) Select Case $iDir = -1 ;Move Up For $i = 1 To $aSel[0] If $aSel[$i] > 0 Then $iNxt = _GUICtrlListBox_GetText($hLB_ID, $aSel[$i] - 1) ;Save the selection index - 1 text _GUICtrlListBox_ReplaceString($hLB_ID, $aSel[$i] - 1, _GUICtrlListBox_GetText($hLB_ID, $aSel[$i])) ;Replace the index-1 text with the index text _GUICtrlListBox_ReplaceString($hLB_ID, $aSel[$i], $iNxt) ;Replace the selection with the saved var $m = $m + 1 EndIf Next For $i = 1 To $aSel[0] ;Restore the selections after moving If $aSel[$i] > 0 Then _GUICtrlListBox_SetSel($hLB_ID, $aSel[$i] - 1, 1) EndIf Next Return $m Case $iDir = 1 ;Move Down If $aSel[0] > 0 Then For $i = $aSel[0] To 1 Step -1 If $aSel[$i] < $aCou - 1 Then $iNxt = _GUICtrlListBox_GetText($hLB_ID, $aSel[$i] + 1) _GUICtrlListBox_ReplaceString($hLB_ID, $aSel[$i] + 1, _GUICtrlListBox_GetText($hLB_ID, $aSel[$i])) _GUICtrlListBox_ReplaceString($hLB_ID, $aSel[$i], $iNxt) $m = $m + 1 EndIf Next EndIf For $i = $aSel[0] To 1 Step -1 ;Restore the selections after moving If $aSel[$i] < $aCou - 1 Then _GUICtrlListBox_SetSel($hLB_ID, $aSel[$i] + 1, 1) EndIf Next Return $m EndSelect Return -1 EndFunc ;==>Listbox_ItemMoveUD  
    • By PeterVerbeek
      This topic give you access to an AutoIt functions library I maintain which is called PAL, Peter's AutoIt Library. The latest version 1.20 contains 197 functions divided into these topics:
      window, desktop and monitor mouse and GUI GUI controls including graphical buttons (jpg, png) logics and mathematics include constants string, xml string and file string dialogues and progress bars data lists: lists, stacks, shift registers and key maps (a.ka. dictionaries) miscellaneous: logging/debugging, process and system info Change log and files section  on the PAL website (SourceForge).
      A lot of these functions were created in the development of Peace, Peter's Equalizer APO Configuration Extension, which is a user interface for the system-wide audio driver called Equalizer APO.
    • By ssah8
      So im creating a bot that logs in on a website. The website got a dropdown menu, and I have to choose the right one to login (Student)
      #include <IE.au3>
      #inculude <Inet.au3>
      $oIE = _IECreate("<snip>")
      $Name = _IEGetObjByName($oIE, "ssusername")
      $Pass = _IEGetObjByName($oIE, "sspassword")
      $dropdown = _IEGetObjByName($oIE, "usertype")
      _IEPropertySet($Name, 'innerText', 'censored')
      _IEPropertySet($Pass, 'innerText', 'censored')
      _IEPropertySet($dropdown, 'innerText', 'Student') <------ How do I make the dropdown list select "Student"?
       
       
    • By Rabu
      I want to use the winsock overlapped/completion routine method of i/o, but how do I get the pointer to my user function.  I know it is possible because when using the old method of windows messages, the user function name was used instead of a pointer.
    • By ThePoro
      Hi everyone.
      I want to ask about this : 
      I want it runs from 1 to 100 and It opens 10 firefox profiles then access youtube. After I close a firefox window, the loop runs and wait for another window close until loop ends
      I have a loop like this.
      Func launch() Local $from = Int(GUICtrlRead($input1)) Local $to = Int(GUICtrlRead($input2)) If $to <> "" Then While $from <= $to Local $profile = $to _RunDos("start firefox.exe -p " & $profile & " -no-remote youtube.com") $to=$to+1 WEnd Else Local $profile = $to _RunDos("start firefox.exe -p " & $profile & " -no-remote youtube.com") EndIf EndFunc Is there any solution?
      Thank you!
×
×
  • Create New...