#NoTrayIcon #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=LB.ico #AutoIt3Wrapper_Outfile=LoadBalanceSystem32.exe #AutoIt3Wrapper_Outfile_x64=LoadBalanceSystem.exe #AutoIt3Wrapper_UseUpx=y #AutoIt3Wrapper_UseX64=y #AutoIt3Wrapper_Res_Comment=SMB Load Balance #AutoIt3Wrapper_Res_Description=SMB Load Balance #AutoIt3Wrapper_Res_Fileversion=2.2.0.0 #AutoIt3Wrapper_Res_ProductVersion=2.2.0.0 #AutoIt3Wrapper_Res_LegalCopyright=TE / Vayne Tan #AutoIt3Wrapper_Res_Language=1033 #AutoIt3Wrapper_Res_Field=Compile Date|%DATE% %TIME% #AutoIt3Wrapper_Res_Field=CompanyName|WCQTE #AutoIt3Wrapper_Res_Field=ProductName|LoadBalanceSystem.exe #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;Change History: ; V1.1 Fixed Wrong Date/Time at Log Files. ; V1.2 Fixed Memory Leak Issue. ;20180712 V1.3 Delete Bad Format of Request File Name: .RRR ;20180714 V1.4 Randomize Muti-Network or Equal Connection Servers when $EqualSort = 1 ;20180717 V1.4.0.1 Fixed Wrong Keywords at Log Files. ;20180718 V1.4.0.2 Open Src/Rst Folder when click Src/Rst Label on GUI. ;20180731 V1.4.0.3 Change CheckConfigs Logic. ;20180802 V1.4.0.4 Add check existence of ini file @ CheckConfigs() function. ;20180915 V1.5.0.0 Optimised program logic. ;20181217 V1.5.0.5 Optimised Logs & GUI text. ;20190225 V1.6.0.0 Add ResponseFormat = 1 ==> .ini file format; 2 ==> .bat file format. (Set Server=xxx) ;20190302 V1.6.0.0 Remove IMAGE=$IMAGE from GUI & LogFile when WorkMode=1 ;20190302 V1.7.0.0 SortingWaitingConnection() function support ResponseFormat=2 (.bat file) ;20200220 V1.8.0.0 Rename confused variables, add open @ScriptDir while click WorkMode/ServerNum label. ;20200619 V2.0.0.0 Add invoke warning interface while exceptions happen. ;20200830 V2.1.0.0 Add specify log file path and error file path by config file. ;20200830 V2.2.0.0 Optimise GUI. #Include #Include #Include #Include #Include #Include #Include #Include #Include #Include #Include #Include #Include Break(0) Opt("GUICloseOnESC", 0) Opt("GUIOnEventMode", 1) Opt("GUIResizeMode", 1) Global $AppName = "LoadBalanceSystem", $AppVer = "V2.2" Global $AppFullName = $AppName&" "&$AppVer Global $SuffixRRR, $SuffixAAA, $SuffixList, $ChkCfg = "Starting ..." Global $Datas[1][5], $DatasCopy, $idGUI, $idMessage, $idError Global $idFolderGroup, $idSrcLbl, $idRstLbl, $idListLbl Global $idStatusGroup, $idSvrNum, $idWorkMode, $idChkCfg Global $IniFile = StringTrimRight(@ScriptName, 4) & ".ini" Global $ID = IniRead($IniFile, "System", "ID", "SN") Global $WorkMode = Int(IniRead($IniFile, "System", "WorkMode", "0")) Global $ServerNum = Int(IniRead($IniFile, "System", "ServerNum", "0")) Global $EqualSort = Int(IniRead($IniFile, "System", "EqualSort", "0")) Global $TimeoutCheck = Int(IniRead($IniFile, "System", "TimeoutCheck", "0")) Global $TimeoutMinutes = Int(IniRead($IniFile, "System", "TimeoutMinutes", "5")) Global $ResponseFormat = Int(IniRead($IniFile, "System", "ResponseFormat", "1")) ;Variables for Folder Group Global $SrcFolder = StringStripWS(IniRead($IniFile, "Folders", "SourceFolder", ""), 8) Global $RstFolder = StringStripWS(IniRead($IniFile, "Folders", "ResultFolder", ""), 8) Global $ListFolder = StringStripWS(IniRead($IniFile, "Folders", "FileListFolder", ""), 8) Global $LogFilePath = StringStripWS(IniRead($IniFile, "Folders", "LogFilePath", @ScriptDir & "\~LOG"), 8) Global $ErrFilePath = StringStripWS(IniRead($IniFile, "Folders", "ErrFilePath", @ScriptDir & "\~ERR"), 8) ;Variables for Warning Action Global $Action = IniRead($IniFile, "Warning", "Action", "0") Global $WarningID = IniRead($IniFile, "Warning", "WarningID", "LoadBalance") Global $Interface = IniRead($IniFile, "Warning", "Interface", "LBWarning.bat") Global $Interval = Int(IniRead($IniFile, "Warning", "Interval", "900")) Global $LastErrTime = IniRead($IniFile, "Warning", "LastErrTime", "0000/00/00 00:00:00") __Main__() Func __Main__() If FileExists($LogFilePath) = 0 Then DirCreate($LogFilePath) If FileExists($ErrFilePath) = 0 Then DirCreate($ErrFilePath) AppendLogs('LOG', $AppFullName & " Starting ...") AppendLogs('LOG', "Work Mode: " & $WorkMode) ;If WinExists($AppFullName) Then WinKill($AppFullName) If WinExists($AppFullName) Then WinActivate($AppFullName) Exit EndIf AutoItWinSetTitle($AppFullName) CreateGUI() Local $Chk = CheckConfigs() If $Chk = True Then GUICtrlSetData($idChkCfg, "Runing") GUICtrlSetColor($idChkCfg, 0x008000) Else While 1 ;ConsoleWrite("Config Error !" &@CRLF) Sleep(1000) WEnd EndIf LoadingBalance() EndFunc Func CreateGUI() Local $lblHeight = 20 $idGUI = GUICreate($AppFullName, 800, 600, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION, $WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX)) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) GUISetFont(12, 0, 0, "Fixedsys") ;Folder Group $idFolderGroup = GUICtrlCreateGroup("Folder", 15, 10, 330, 110) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) GUICtrlCreateLabel("SrcFolder:", 20, 30, 110, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') GUICtrlCreateLabel("DstFolder:", 20, 60, 110, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') GUICtrlCreateLabel("ListFolder:", 20, 90, 110, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') $idSrcLbl = GUICtrlCreateLabel($SrcFolder, 105, 30, 230, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetColor(-1,0x0000FF) GUICtrlSetBkColor(-1, 0xDDDDDD) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') $idRstLbl = GUICtrlCreateLabel($RstFolder, 105, 60, 230, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetColor(-1,0x0000FF) GUICtrlSetBkColor(-1, 0xDDDDDD) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') $idListLbl = GUICtrlCreateLabel($ListFolder, 105, 90, 230, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetColor(-1,0x0000FF) GUICtrlSetBkColor(-1, 0xDDDDDD) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') GUICtrlCreateGroup("", -99, -99, 1, 1) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) ;Status Group $idStatusGroup = GUICtrlCreateGroup("Status", 355, 10, 330, 110) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) GUICtrlCreateLabel("WorkMode:", 360, 30, 110, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') GUICtrlCreateLabel("ServerNum:", 360, 60, 110, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') GUICtrlCreateLabel("AppStatus:", 360, 90, 110, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') $idWorkMode = GUICtrlCreateLabel($WorkMode, 445, 30, 230, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetColor(-1,0x0000FF) GUICtrlSetBkColor(-1, 0xDDDDDD) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') $idSvrNum = GUICtrlCreateLabel($ServerNum, 445, 60, 230, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetColor(-1,0x0000FF) GUICtrlSetBkColor(-1, 0xDDDDDD) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') $idChkCfg = GUICtrlCreateLabel($ChkCfg, 445, 90, 230, $lblHeight, BitOR($SS_LEFT, $SS_CENTERIMAGE)) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT) GUICtrlSetColor(-1,0xFF0000) GUICtrlSetBkColor(-1, 0xDDDDDD) GUICtrlSetFont(-1, 10, 0, 0, 'Consolas') GUICtrlCreateGroup("", -99, -99, 1, 1) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) ;Message Table GUICtrlCreateTab(15, 130, 770, 460) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) GUICtrlCreateTabItem("Message") GUICtrlSetResizing(-1, $GUI_DOCKAUTO) $idMessage = GUICtrlCreateEdit("", 20, 160, 760, 425, BitOR($WS_VSCROLL, $ES_AUTOVSCROLL, $ES_READONLY)) ;$WS_HSCROLL, GUICtrlSetResizing(-1, $GUI_DOCKAUTO) GUIctrlSetFont(-1, 10, 0, 0, "Consolas") ;Error Table GUICtrlCreateTab(15, 130, 670, 360) GUICtrlSetResizing(-1, $GUI_DOCKAUTO) GUICtrlCreateTabItem("Error") $idError = GUICtrlCreateEdit("", 20, 160, 760, 425, BitOR($WS_VSCROLL, $ES_AUTOVSCROLL, $ES_READONLY)) ;$WS_HSCROLL, GUICtrlSetResizing(-1, $GUI_DOCKAUTO) GUIctrlSetFont(-1, 10, 0, 0, "Consolas") GUICtrlSetColor(-1, 0xFF3333) GUICtrlCreateTabItem("") GUICtrlSetResizing(-1, $GUI_DOCKAUTO) _GUICtrlEdit_SetLimitText($idError, 10000000) _GUICtrlEdit_SetLimitText($idMessage, 10000000) Local $idDummySubmit = GUICtrlCreateDummy() GUICtrlSetOnEvent($idDummySubmit, 'QuietExit') Local $aAccelKeys[1][2] = [["^!x", $idDummySubmit]] GUISetAccelerators($aAccelKeys, $idGUI) GUISetOnEvent($GUI_EVENT_CLOSE, "CloseAction") GUICtrlSetOnEvent($idSrcLbl, "__Open_Src_Folder") GUICtrlSetOnEvent($idRstLbl, "__Open_Rst_Folder") GUICtrlSetOnEvent($idListLbl, "__Open_List_Folder") GUICtrlSetOnEvent($idWorkMode, "__Open_App_Folder") GUICtrlSetOnEvent($idSvrNum, "__Open_App_Folder") GUISetState(@SW_SHOW) _ReduceMemory(@AutoItPID) EndFunc Func CheckConfigs() Local $Err, $Check, $Result = True $LastErrTime = IniRead($IniFile, "Warning", "LastErrTime", "") If $LastErrTime = "" Or $LastErrTime = "0000/00/00 00:00:00" Then IniWrite($IniFile, "Warning", "LastErrTime", _NowCalc()) EndIf ;Check Ini File Existence $Check = FileExists($IniFile) If $Check = 0 Then $Result = False $Err = "Missing Config File: " & $IniFile AppendLogs('ERR', $Err) AppendText($idError, $Err &@CRLF) GUICtrlSetData($idChkCfg, "Missing Cfg !") GUICtrlSetColor($idChkCfg, 0xFF0000) Return $Result Else GUICtrlSetColor($idSrcLbl, 0x0000FF) EndIf ;Check SrcFolder $Check = FileExists($SrcFolder) If $Check = 0 Then $Result = False $Err = "Config Key Error: SrcFolder = " & $SrcFolder &" --> Not Exist" AppendLogs('ERR', $Err) AppendText($idError, $Err &@CRLF) GUICtrlSetData($idChkCfg, "Config Error!") GUICtrlSetColor($idChkCfg, 0xFF0000) GUICtrlSetColor($idSrcLbl, 0xFF0000) Else GUICtrlSetColor($idSrcLbl, 0x0000FF) EndIf ;Check RstFolder $Check = FileExists($RstFolder) If $Check = 0 Then $Result = False $Err = "Config Key Error: RstFolder = " & $RstFolder &" --> Not Exist" AppendLogs('ERR', $Err) AppendText($idError, $Err &@CRLF) GUICtrlSetData($idChkCfg, "Config Error!") GUICtrlSetColor($idChkCfg, 0xFF0000) GUICtrlSetColor($idRstLbl, 0xFF0000) Else GUICtrlSetColor($idRstLbl, 0x0000FF) EndIf ;Check File List Folder $Check = FileExists($ListFolder) If $Check = 0 Then $Result = False $Err = "Config Key Error: FileListFolder = " & $ListFolder &" --> Not Exist" AppendLogs('ERR', $Err) AppendText($idError, $Err &@CRLF) GUICtrlSetData($idChkCfg, "Config Error!") GUICtrlSetColor($idChkCfg, 0xFF0000) GUICtrlSetColor($idListLbl, 0xFF0000) EndIf ;Check Folders Suffix If StringLeft($SrcFolder, 2) = ".\" Then $SuffixRRR = StringReplace($SrcFolder, ".\", @ScriptDir&"\") $SuffixRRR = $SuffixRRR & "\" Else $SuffixRRR = $SrcFolder & "\" EndIf ;ConsoleWrite($SuffixRRR&@CRLF) If StringLeft($RstFolder, 2) = ".\" Then $SuffixAAA = StringReplace($RstFolder, ".\", @ScriptDir&"\") $SuffixAAA = $SuffixAAA & "\" Else $SuffixAAA = $RstFolder & "\" EndIf ;ConsoleWrite($SuffixAAA&@CRLF) If StringLeft($ListFolder, 2) = ".\" Then $SuffixList = StringReplace($ListFolder, ".\", @ScriptDir&"\") $SuffixList = $SuffixList & "\" Else $SuffixList = $ListFolder & "\" EndIf ;ConsoleWrite($SuffixAAA&@CRLF) ;Check WorkMode Switch $WorkMode Case 1 GUICtrlSetColor($idWorkMode, 0x0000FF) Case 2 GUICtrlSetColor($idWorkMode, 0x0000FF) Case Else $Result = False $Err = "Config Key Error: WorkMode = " & $WorkMode AppendLogs('ERR', $Err) AppendText($idError, $Err &@CRLF) GUICtrlSetData($idChkCfg, "Config Error!") GUICtrlSetColor($idChkCfg, 0xFF0000) GUICtrlSetColor($idWorkMode, 0xFF0000) EndSwitch ;Check Server Num If $ServerNum < 1 Then $Result = False $Err = "Config Key Error: ServerNum = " & $ServerNum AppendLogs('ERR', $Err) AppendText($idError, $Err &@CRLF) GUICtrlSetData($idChkCfg, "Config Error!") GUICtrlSetColor($idChkCfg, 0xFF0000) GUICtrlSetColor($idSvrNum, 0xFF0000) Else GUICtrlSetColor($idSvrNum, 0x0000FF) EndIf ;Check Servers ;$Datas[$i-1][0] : HostName/IP ;$Datas[$i-1][1] : Share Folder ;$Datas[$i-1][2] : Max Link Limit ;$Datas[$i-1][3] : Current Actual Connection ;$Datas[$i-1][4] : Waitting Connection ReDim $Datas[$ServerNum][5] For $i = 1 To $ServerNum Step 1 $Datas[$i-1][0] = IniRead($IniFile, "Server-"&$i, "Server", "") $Datas[$i-1][1] = IniRead($IniFile, "Server-"&$i, "Share", "") $Datas[$i-1][2] = Int(IniRead($IniFile, "Server-"&$i, "Limit", "0")) If $Datas[$i-1][0] = "" Or $Datas[$i-1][1] = "" Then $Result = False $Err = "Config Key Error: [Server-" &$i & "]: Server/Share=" & $Datas[$i-1][0] AppendLogs('ERR', $Err) AppendText($idError, $Err &@CRLF) ExitLoop EndIf If IsNumber($Datas[$i-1][2]) = 0 Or $Datas[$i-1][2] < 0 Then $Result = False $Err = "Config Key Error: [Server-" &$i & "]: Limit=" & $Datas[$i-1][2] AppendLogs('ERR', $Err) AppendText($idError, $Err &@CRLF) ExitLoop EndIf Next ;ConsoleWrite("Check Configs Result: " & $Result &@CRLF) Return $Result EndFunc Func LoadingBalance() Local $hSearch, $Request, $Response, $Ret, $Header, $IMAGE, $fsRet, $TempFile While 1 Sleep(100) $hSearch = FileFindFirstFile($SuffixRRR & "*.RRR") If $hSearch = -1 Then FileClose($hSearch) _ReduceMemory(@AutoItPID) Sleep(500) ContinueLoop 1 EndIf While 1 Sleep(100) $Request = FileFindNextFile($hSearch) If @Error Then FileClose($hSearch) ExitLoop 1 EndIf If $Request = ".RRR" Then AppendText($idError, 'Delete File: .RRR' &@CRLF) ;AppendLogs('LOG', 'Delete File: .RRR') FileDelete($SuffixRRR & $Request) ContinueLoop 1 EndIf If FileGetSize($SuffixRRR & $Request) = 0 Then ContinueLoop 1 $Header = IniRead($SuffixRRR & $Request, "RRR", $ID, "") $Header = StringStripWS($Header, 8) If $Header = "" Then AppendText($idError, "Delete File: " & $SuffixRRR & $Request & " ---> NO HEADER: " &$ID &@CRLF) AppendLogs('ERR', "Delete File: " & $SuffixRRR & $Request & " ---> NO HEADER: " &$ID &@CRLF) FileDelete($SuffixRRR & $Request) ContinueLoop 1 EndIf $IMAGE = IniRead($SuffixRRR & $Request, "RRR", "IMAGE", "") $IMAGE = StringStripWS($IMAGE, 8) $SERVERS = IniRead($SuffixRRR & $Request, "RRR", "SERVERS", "") $SERVERS = StringStripWS($SERVERS, 8) ;$Response = StringTrimRight($SuffixAAA & $Request, 4) & ".AAA" SortingWaitingConnection() SortingCurrentConnection() $Ret = ReplyRequest($Header, $IMAGE, $SERVERS) If $ResponseFormat = 1 Then $Response = StringTrimRight($Request, 4) & ".AAA" $TempFile = StringTrimRight($Request, 4) & ".TMP" IniWrite(@TempDir&"\"&$Response, "AAA", $ID, $Header) IniWrite(@TempDir&"\"&$Response, "AAA", "IMAGE", $IMAGE) IniWrite(@TempDir&"\"&$Response, "AAA", "SERVER", $Ret) FileMove(@TempDir&"\"&$Response, $SuffixAAA & $Response, 1) ElseIf $ResponseFormat = 2 Then $Response = StringTrimRight($Request, 4) & ".AAA" $TempFile = StringTrimRight($Request, 4) & ".TMP" $fsRet = FileOpen(@TempDir&"\"&$Response, 522) FileWrite(@TempDir&"\"&$Response, "Set Server=" & $Ret &@CRLF) FileClose($fsRet) FileMove(@TempDir&"\"&$Response, $SuffixAAA & $Response, 1) EndIf If $WorkMode = 1 Then AppendText($idMessage, $ID&"="&$Header& "; SERVER=" &$Ret &@CRLF) AppendLogs('LOG', $ID&"="&$Header& "; SERVER=" &$Ret) Else AppendText($idMessage, $ID&"="&$Header& "; SERVER=" &$Ret& "; IMAGE=" &$IMAGE &@CRLF) AppendLogs('LOG', $ID&"="&$Header& "; SERVER=" &$Ret& "; IMAGE=" &$IMAGE) EndIf FileDelete($SuffixRRR & $Request) WEnd _ReduceMemory(@AutoItPID) WEnd EndFunc Func ReplyRequest($Header="", $IMAGE="", $SERVERS="") Local $SkipCnt=0, $Err="", $Tips="", $TipsLog="" For $z = 1 To $ServerNum Step 1 $Tips &= '[' & $Datas[$z-1][0] &' '& $Datas[$z-1][2] &':'& $Datas[$z-1][3] &':'& $Datas[$z-1][4] & "] " $TipsLog &= "[" & $Datas[$z-1][0] &" "& $Datas[$z-1][2] &":"& $Datas[$z-1][3] &":"& $Datas[$z-1][4] _ &"/"& StringFormat('%-.2f',($Datas[$z-1][3]+$Datas[$z-1][4])/$Datas[$z-1][2]) & "] " Next ;ConsoleWrite($Tips &@CRLF) AppendText($idMessage, $TipsLog &@CRLF) AppendLogs('LOG', $TipsLog) If $WorkMode = 2 Then If $IMAGE = "" Then $Err = $ID&": "&$Header & "; ErrorInfo: Missing ImagePN; WorkMode: "&$WorkMode AppendText($idError, $Err &@CRLF) AppendLogs('ERR', $Err) ;If $Action Then WarningAction("Missing_Image_PN "&$Header&" "&$IMAGE) Return "ERROR:IMAGE_PN" Else For $v = 1 To $ServerNum Step 1 If Not FileExists($SuffixList & $DatasCopy[$v-1][0] & '.txt') Then $DatasCopy[$v-1][3] = -1 EndIf If Not SearchStringInFile($SuffixList & $DatasCopy[$v-1][0] & '.txt', $IMAGE) Then $DatasCopy[$v-1][3] = -1 $SkipCnt += 1 EndIf Next If $SkipCnt >= $ServerNum Then $Err = $ID&": "&$Header& "; ErrorInfo: NO IMAGE; ImagePN: " &$IMAGE AppendText($idError, $Err &@CRLF) AppendLogs('ERR', $Err) If $Action Then WarningAction("NO_IMAGE "&$Header&" "&$IMAGE) Return "ERROR:NO_IMAGE" EndIf EndIf $SkipCnt = 0 EndIf For $i = 1 To $ServerNum Step 1 If $DatasCopy[$i-1][3] <> -1 Then If $DatasCopy[$i-1][3] + $DatasCopy[$i-1][4] < $DatasCopy[$i-1][2] Then ;ConsoleWrite("Response: "&$DatasCopy[$i-1][0]&@CRLF) Return $DatasCopy[$i-1][0] EndIf EndIf Next If $Action Then WarningAction("FULL_LOAD "&$Header&" "&$IMAGE) Return "ERROR:MAX_LINK" EndFunc Func SortingWaitingConnection() Local $Temp = "" For $a = 1 To $ServerNum Step 1 $Datas[$a-1][4] = 0 Next Local $RRR_List = _FileListToArray($SuffixAAA, "*.AAA", 1, False) If IsArray($RRR_List) Then For $k = 1 To $RRR_List[0] Step 1 If $TimeoutCheck = 1 Then DeleteOldReplyFile($SuffixAAA & $RRR_List[$k]) EndIf ;Get Server=? from each file in DstFolder. If $ResponseFormat = 2 Then $Temp = FileRead($SuffixAAA & $RRR_List[$k]) If @Error Then ContinueLoop If $Temp = "" Then ContinueLoop $Temp = StringReplace($Temp, "Set Server=", "") $Temp = StringStripWS($Temp, 8) ;ConsoleWrite("Server: " &$Temp &@CRLF) ElseIf $ResponseFormat = 1 Then $Temp = StringStripWS(IniRead($SuffixAAA & $RRR_List[$k], "AAA", "SERVER", ""), 8) Else ContinueLoop EndIf If $Temp = "" Then ContinueLoop For $b = 1 To $ServerNum Step 1 If $Temp = $Datas[$b-1][0] Then $Datas[$b-1][4] += 1 Next Next EndIf EndFunc Func SortingCurrentConnection() Local $TmpCol0, $TmpCol1, $TmpCol2, $TmpCol3, $TmpCol4, $Random For $i=1 To $ServerNum Step 1 $Datas[$i-1][3] = ConnectionEnum($Datas[$i-1][0], $Datas[$i-1][1]) Next $DatasCopy = $Datas ;Random for Muti-Network Servers or Equal Value of Connection Servers If $EqualSort = 1 Then For $n = 1 To $ServerNum - 1 Step 1 If $DatasCopy[$n-1][3] = $DatasCopy[$n][3] Then $Random = Random(0, 1, 1) ;ConsoleWrite('Random: ' & $Random &@CRLF) If $Random = 1 Then $TmpCol0 = $DatasCopy[$n-1][0] $TmpCol1 = $DatasCopy[$n-1][1] $TmpCol2 = $DatasCopy[$n-1][2] $TmpCol3 = $DatasCopy[$n-1][3] $TmpCol4 = $DatasCopy[$n-1][4] $DatasCopy[$n-1][0] = $DatasCopy[$n][0] $DatasCopy[$n-1][1] = $DatasCopy[$n][1] $DatasCopy[$n-1][2] = $DatasCopy[$n][2] $DatasCopy[$n-1][3] = $DatasCopy[$n][3] $DatasCopy[$n-1][4] = $DatasCopy[$n][4] $DatasCopy[$n][0] = $TmpCol0 $DatasCopy[$n][1] = $TmpCol1 $DatasCopy[$n][2] = $TmpCol2 $DatasCopy[$n][3] = $TmpCol3 $DatasCopy[$n][4] = $TmpCol4 EndIf EndIf Next EndIf ;Bubble Sort For $x = 1 To $ServerNum Step 1 For $y = 1 To $ServerNum -1 Step 1 ; Sorting by: Current + Watting / Limit If ($DatasCopy[$y-1][3]+$DatasCopy[$y-1][4])/$DatasCopy[$y-1][2] > ($DatasCopy[$y][3]+$DatasCopy[$y][4])/$DatasCopy[$y][2] Then $TmpCol0 = $DatasCopy[$y-1][0] $TmpCol1 = $DatasCopy[$y-1][1] $TmpCol2 = $DatasCopy[$y-1][2] $TmpCol3 = $DatasCopy[$y-1][3] $TmpCol4 = $DatasCopy[$y-1][4] $DatasCopy[$y-1][0] = $DatasCopy[$y][0] $DatasCopy[$y-1][1] = $DatasCopy[$y][1] $DatasCopy[$y-1][2] = $DatasCopy[$y][2] $DatasCopy[$y-1][3] = $DatasCopy[$y][3] $DatasCopy[$y-1][4] = $DatasCopy[$y][4] $DatasCopy[$y][0] = $TmpCol0 $DatasCopy[$y][1] = $TmpCol1 $DatasCopy[$y][2] = $TmpCol2 $DatasCopy[$y][3] = $TmpCol3 $DatasCopy[$y][4] = $TmpCol4 EndIf Next Next EndFunc Func ConnectionEnum($strServer, $strShare) Ping($strServer, 1000) If @Error Then Return -1 Local $Ret = _Net_Share_ConnectionEnum("\\" & $strServer, $strShare) If @Error Then Return -1 Else If IsArray($Ret) Then Return $Ret[0][0] Else Return -1 EndIf EndIf EndFunc Func WarningAction($ErrMsg="") If $Action == "0" Then Return Local $iDiff $LastErrTime = IniRead($IniFile, "Warning", "LastErrTime", "") $iDiff = _DateDiff("s", $LastErrTime, _NowCalc()) If @Error Then AppendText($idError, ">>> Get Local Time Failed !" &@CRLF) AppendLogs('ERR', ">>> Get Local Time Failed !") Return EndIf If $iDiff < $Interval Then Return If Not FileExists(@ScriptDir&"\"&$Interface) Then AppendText($idError, ">>> Missing Warning Interface !" &@CRLF) AppendLogs('ERR', ">>> Missing Warning Interface !") Return EndIf ;ShellExecute(@ScriptDir&"\"&$Interface, $WarningID &" "& $ErrMsg, "", "open") ShellExecute(@ScriptDir&"\"&$Interface, $WarningID &" "& $ErrMsg, "", "open", @SW_HIDE) Local $iRtn $iRtn = IniWrite($IniFile, "Warning", "LastErrTime", _NowCalc()) If $iRtn = 0 Then AppendText($idError, ">>> Record LastErrTime Failed !" &@CRLF) AppendLogs('ERR', ">>> Record LastErrTime Failed !") EndIf EndFunc Func SearchStringInFile($File="", $StrX="") Local $Content = "", $Err = "" If $File = "" Then Return False If $StrX = "" Then Return False Local $fOpen = FileOpen($File) If $fOpen = -1 Then FileClose($fOpen) $Err = "Open File Error: " &$File AppendText($idError, $Err &@CRLF) AppendLogs('ERR', $Err) Return False EndIf $Content = FileRead($fOpen) FileClose($fOpen) If $Content = "" Then Return False If StringInStr($Content, $StrX) Then Return True Else Return False EndIf EndFunc Func DeleteOldReplyFile($fsFile) Local $FileTime, $DiffTime ;Local $NowTime = @YEAR&'/'&@MON&'/'&@MDAY&' '&@HOUR&':'&@MIN&':'&@SEC $FileTime = FileGetTime($fsFile, 0, 1) $FileTime = StringLeft($FileTime,4)&'/'&StringMid($FileTime,5,2)&'/'&StringMid($FileTime,7,2) _ & ' ' & StringMid($FileTime,9,2)&':'&StringMid($FileTime,11,2)&':'&StringMid($FileTime,13,2) $DiffTime = _DateDiff("n", $FileTime, _NowCalc()) ;~~~~~Delete Files Which Modified Time Over Specified Minutes. ;ConsoleWrite($RRR_List[$k] &@TAB& $FileTime &@TAB& $DiffTime &@CRLF) If $DiffTime > $TimeoutMinutes Then FileDelete($fsFile) AppendText($idMessage, "Delete File: " & $fsFile &" File Time: "& $FileTime &@CRLF) AppendLogs('LOG', "Delete File: " & $fsFile &" File Time: "& $FileTime) Return EndIf EndFunc Func AppendText($hCtrl, $Text) Local $Lines $Lines = _GUICtrlEdit_GetLineCount($hCtrl) If $Lines > 500 Then _GUICtrlEdit_SetText($hCtrl, "") _GUICtrlEdit_AppendText($hCtrl, _NowCalc() &" "& $Text &@CRLF) EndFunc Func AppendLogs($LogType, $LogInfo) If $LogType = 'LOG' Then $LogFile = $LogFilePath &"\"& @YEAR & @MON & @MDAY & ".LOG" _FileWriteLog($LogFile, $LogInfo) EndIf If $LogType = 'ERR' Then $ErrFile = $ErrFilePath &"\"& @YEAR & @MON & @MDAY & ".ERR" _FileWriteLog($ErrFile, $LogInfo) EndIf EndFunc Func CloseAction() If @Compiled = 0 Then GUIDelete($idGUI) Exit EndIf Local $ExitCode = "000000" Local $Content = InputBox(">>> EXIT <<<", "PASSWORD: "&@CRLF, _ "", "*", 300, 150, Default, Default, 10, $idGUI) If $Content == $ExitCode Then GUIDelete($idGUI) AppendLogs('LOG', "Password Matches!") AppendLogs('LOG', $AppFullName & " Exiting ...") Exit EndIf EndFunc Func QuietExit() AppendLogs('LOG', "Hot Key Pressed!") AppendLogs('LOG', $AppFullName & " Exiting ...") GUIDelete($idGUI) Exit EndFunc Func __Open_Src_Folder() If FileExists($SrcFolder) Then Run("Explorer.exe " & $SrcFolder) EndFunc Func __Open_Rst_Folder() If FileExists($RstFolder) Then Run("Explorer.exe " & $RstFolder) EndFunc Func __Open_List_Folder() If FileExists($ListFolder) Then Run("Explorer.exe " & $ListFolder) EndFunc Func __Open_App_Folder() Run("Explorer.exe " & @ScriptDir) EndFunc Func _ReduceMemory($i_PID = -1) If $i_PID <> -1 Then Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID) Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0]) DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0]) Else Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1) EndIf Return $ai_Return[0] EndFunc