#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Icons\Internet Connections 1.ico
#AutoIt3Wrapper_Outfile_x64=msvpn_monitor.exe
#AutoIt3Wrapper_Res_Description=MSVPN Monitor
#AutoIt3Wrapper_Res_Fileversion=1.3.3.3
#AutoIt3Wrapper_Res_LegalCopyright=FHA0001
#AutoIt3Wrapper_Res_Language=3079
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/sf /sv /mo /rm /rsln
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
; *** Start added by AutoIt3Wrapper ***
#include <ListViewConstants.au3>
; *** End added by AutoIt3Wrapper ***


AutoItSetOption ("MustDeclareVars", 1)
AutoItSetOption("GUICloseOnESC", 0)


#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <Date.au3>
#include <Misc.au3>
#include <array.au3>
#include <GuiStatusBar.au3>


#include <mini.au3>



;***************************
Global $test = ""
Global $timer_on
Global $pfad = "\\Server\Freigabe$\"																;Hauptpfad
if @Compiled = 1 Then																								;Produktion

	AutoItSetOption("TrayAutoPause", 1)																				;Keine Pause im Trayicon
	AutoItSetOption("TrayIconHide",1)																				;Kein Trayicon
	$test = True
Else																												;Entwicklung
	$test = True
	$timer_on = False																								;Timer für einlesen ein/aus
EndIf
;***************************



Global $status_datei = "all_status.txt"																				;Statusfile
Global $dateitmp
Global $a = 0
Global $i, $v, $b , $ret, $tmp																						;diverse Arbeitesvariablen
Global $suche_isda
Global $titel, $version
Global $ip_copy
Global $arraysize = 4																								;wie groß das Array der unterschiedlchen Netz ist (immer +1)

Global $client_sum[$arraysize]																						;Anzeige Clientsumme (Mag/EDu,...)
Global $client_text[$arraysize]																						;Anzeige Text
Global $Servername_sum[$arraysize]																					;Servername für die Summenzählung


$Servername_sum[1] = "ntmsvpn"
$Servername_sum[2] = "ntwbnvpn"
$Servername_sum[3] = "ntakhvpn"

Global $check, $last_check																							;checkbox für Autorefresh
Global $auto = False																								;Autorefresh ein/aus (default: aus)
Global $nextreadfile																								;Zeit wann das nächstemal das File automatisch gelesen werden soll
Global $interval = 1																								;Intervallzeit für autoread
Global $today = @MDAY & @MON & @YEAR																				;aktuelles Datum
Global $lastday = $today																							;gespeichertes Datum
Global $pc_name																										;netbios-name laut Liste
Global $pc_fqdn																										;FQDN laut IPAM
Global $runde																										;Zähler für die Wiederholungen Clip und IP
Global $peek																										;Maximal Anzahl der Clients
Global $suchhistory																									;History für die Combo (Suche)
Global $listv_id																									;Nslookup: ID von selektierer Auswahl
Global $listv_all																									;Nslookup: Inhalt der Zeile
Global $nMsg

Global $lists_all																									;Auswahl aus der Serverliste
Global $server_name																									;gewählter Servername

Global $update_sourcepath = "\\Server\Freigabe\MSVPN\msvpn_monitor\"												;Hauptpfad für das Programm bzw. Updateinformation


Global $menu_datei																									;Meue "Datei"
Global $menu_ende																									;Submenu
Global $menu_update																									;Submenu
Global $menu_on_off = True																							;Ansichtsstatus: Default = schmal (true)
Global $statusinfo																									;Label für den Statustext
Global $statusinfo_text																								;hier wird der Text reingeschrieben

Global $Maxinfo																										;Sonderanzeige bei maximal Ansicht (Label)

$version = "1.3.3.3"
$titel = "MSVPN-Monitor - Racer @ 16.01.2023 "

Global $datei[1]																									;Array für Dateinamen
Global $tempdaten[1]																								;Temporäres Array zum Dateineinlesen für die Listviews
Global $highlight = ObjCreate("Scripting.Dictionary")																;Dic für die kürzerste Verbindungszeit pro Server [Servername][Zeit in Sekunden]
Global $multi = ObjCreate("Scripting.Dictionary")																	;Dic für mehrfachen Clients (markierung in Rot)
Global $fqdn_cache = ObjCreate("Scripting.Dictionary")																;Dic für den FQDN-Cache
Global $fqdn_filecache = "\\Server\Freigabe\fqdn.cache"																;Pfad für den Filecache
Global $fqdn_file_writetest = "\\Server\Freigabe\" & _Date_Time_GetTickCount() & ".info"							;Pfad + Zufallsdatei für Schreibtest
Global $fqdn_write = False																							;Darf Cache schreiben (default nein)
Global $alter_max = 28800																							;maximales Alter aus dem Cache (current 8 Stunde - wird in Sekunden angeben)

Global $_fqdn_file_read_timer = 30000																				;Länge der Pause vor dem erneuten aufrufen (30 Sekunden)
Global $_auto_fqdn_timer = 5000																						;FQDN Abfrage (nur lesen 5 Sekunden, Schreiben 1 Sekunde)
Global $_fqdn_file_write_timer = 60000																				;Alle 60 Sekunden wird das Cache-File geschrieben
Global $_auto_fqdn_recheck_timer = 3600000																			;Timer für den Re-Check auf abgelaufenen Cache default 1 Stunde

Global $file_write_need = True																						;Nur bei einer Änderung auch das File schreiben
Global $fqdn_write_status = False																					;Status für File schreiben (letzte Einstellung) Default = false

Global $ListV_IDs [1]																								;Arraycopy der IDs vom Listview


if not FileExists ($pfad) Then																						;Wenn auf die Statusdatei nicht zugegriffen werden kann
	echo ("Zugriff auf Statusdatei nicht möglich!","Error")
	Exit
EndIf


$ret = FileWrite ($fqdn_file_writetest, "aaaa")																		;Test ob man am FS schreiben kann
if $ret <> 1 Then																									;Kann nicht geöffnet werden
	$_auto_fqdn_timer = 5000
	$fqdn_write = False
	if $test = True Then
		Print ("FQDN-File darf nur gelesen werden")
		print ("$_auto_fqdn_timer: "  & $_auto_fqdn_timer)
	EndIf

Else
	$fqdn_write = True																								;Es darf geschrieben werden
	$_auto_fqdn_timer = 1000																						;Timer wird für writer auf 1 Sekunde gestellt
	if $test = True Then
		Print ("FQDN-File geschrieben werden")
		print ("$_auto_fqdn_timer: "  & $_auto_fqdn_timer)
	EndIf


EndIf




If FileExists ($fqdn_file_writetest) Then																			;Sollte das File überbleiben -> löschen
	$ret = FileDelete ($fqdn_file_writetest)
	if $test = True Then
		Print ("Testfile löschenn $RET (1 = OK): " & $ret)
	EndIf
EndIf

_fqdn_file_read ()																									;Cache Datei vom Share einlesen



#Region ### START Koda GUI section ### Form=

Global $iExWindowStyle = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)
Global $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES, $LVS_EX_CHECKBOXES, $LVS_EX_DOUBLEBUFFER)


Global $MSVPN_GUI = GUICreate($titel & " - V" & $version, 585, 540, -1, -1,BitOR($GUI_SS_DEFAULT_GUI,$WS_SIZEBOX,$WS_THICKFRAME))
GUICtrlSetResizing($MSVPN_GUI, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)


$menu_datei = GUICtrlCreateMenu("&Datei")
$menu_update = GUICtrlCreateMenuItem("Update", $menu_datei)
$menu_ende = GUICtrlCreateMenuItem("Ende", $menu_datei)

Global $menu_setting = GUICtrlCreateMenu("&Einstellungen")
Global $menu_breite = GUICtrlCreateMenuItem("Ansicht max", $menu_setting)
Global $menu_auto = GUICtrlCreateMenuItem("Auto DNS writer", $menu_setting)


;Rahme für die Statusanzeige (oben)
Global $group2 = GUICtrlCreateGroup("", 10, 0 , 565, 30)
GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT+$GUI_DOCKTOP+$GUI_DOCKLEFT+$GUI_DOCKRIGHT)


;Zusatztextfeld bei der maximalen Ansicht (speed)
$Maxinfo = GUICtrlCreateLabel("", 20, 12, 150, 20)
GUICtrlSetResizing(-1,  $GUI_DOCKHEIGHT+$GUI_DOCKTOP+$GUI_DOCKLEFT);+$GUI_DOCKRIGHT)
GUICtrlSetState (-1, $GUI_SHOW)


;Infotextfeld in der Statusleiste (Text)
$statusinfo = GUICtrlCreateLabel("", 180, 12, 300, 20)
GUICtrlSetResizing(-1,  $GUI_DOCKHEIGHT+$GUI_DOCKTOP+$GUI_DOCKRIGHT)
GUICtrlSetState (-1, $GUI_SHOW)


;Button für mich
;	Global $fha = GUICtrlCreateButton("FHA", 500, 10, 65, 20)
;	GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)




;Rahmen für die Summeanzeige
Global $group1 = GUICtrlCreateGroup("", 10, 440, 565, 70)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKRIGHT)

Global $Refresh = GUICtrlCreateButton("Refresh", 15, 447, 65, 25)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)

Global $autorefresh = GUICtrlCreateCheckbox ("Auto", 95, 447, 90, 25)
GUICtrlSetState (-1 ,1)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)

;$suchfeld = GUICtrlCreateInput ("", 90, 483, 75, 23)
Global $suchfeld = GUICtrlCreateCombo("", 90, 483, 80, 23, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)

Global $suche = GUICtrlCreateButton("Suche", 15, 482, 65, 25)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)


;*** Client MAG ***
$client_text[1] = GUICtrlCreateLabel("Clients MAG", 230, 450, 60, 30)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)

$client_sum[1] = GUICtrlCreateLabel("", 230, 470, 60, 30)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)
GUICtrlSetFont (-1, 16)
GUICtrlSetColor (-1, "0x0000BB")
; *****************


;*** Client EDU ***
$client_text[2] = GUICtrlCreateLabel("Clients EDU", 310, 450, 60, 30)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)

$client_sum[2] = GUICtrlCreateLabel("", 310, 470, 60, 30)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)
GUICtrlSetFont (-1, 16)
GUICtrlSetColor (-1, "0x0000BB")
; *****************


;*** Client AKH ***
$client_text[3] = GUICtrlCreateLabel("Clients AKH", 390, 450, 60, 30)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)

$client_sum[3] = GUICtrlCreateLabel("", 390, 470, 60, 30)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM)
GUICtrlSetFont (-1, 16)
GUICtrlSetColor (-1, "0x0000BB")
; *****************



;*** Client Summe Peek (all) ***
Global $client_peek_text = GUICtrlCreateLabel("Peak (All)", 510, 450, 60, 30)
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKRIGHT)

Global $client_Peek_sum = GUICtrlCreateLabel("", 510, 470, 60, 30)
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM+$GUI_DOCKRIGHT)
GUICtrlSetFont (-1, 16)
GUICtrlSetColor (-1, "0x962467")
; *****************



Global $listv = GUICtrlCreateListView ("|||||||||", 10, 119 , 565, 240 , $iExWindowStyle)
GUICtrlSetResizing($listv, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM)
;_GUICtrlListView_SetExtendedListViewStyle($listv, $iExListViewStyle)

_GUICtrlListView_SetColumn($listv , 0, "VPN-IP", 100, 0)
_GUICtrlListView_SetColumn($listv , 1, "ISP-IP", 100, 0)
_GUICtrlListView_SetColumn($listv , 2, "Clientname", 80, 0)
_GUICtrlListView_SetColumn($listv , 3, "VPN-Server", 200,0)
_GUICtrlListView_SetColumn($listv , 4, "Zeit", 60,1)
_GUICtrlListView_SetColumn($listv , 5, "Mb/s", 60, 1)
_GUICtrlListView_SetColumn($listv , 6, "T GB IN ", 65, 1)
_GUICtrlListView_SetColumn($listv , 7, "T GB OUT", 65, 1)
_GUICtrlListView_SetColumn($listv , 8, "FQDN", 200,0)

_GUICtrlListView_RegisterSortCallBack($listv)


Global $lists =  GUICtrlCreateListView ("Server|Status|Boot|Memory|Client|MB/s|Zertifikat|Last", 10, 30 , 565, 140,  $iExWindowStyle)
GUICtrlSetResizing($lists, $GUI_DOCKHEIGHT+$GUI_DOCKTOP+$GUI_DOCKLEFT+$GUI_DOCKRIGHT)
;_GUICtrlListView_SetExtendedListViewStyle($lists, $iExListViewStyle)

_GUICtrlListView_SetColumn($lists , 0, "Server", 75, 0)
_GUICtrlListView_SetColumn($lists , 1, "Status", 105, 0)
_GUICtrlListView_SetColumn($lists , 2, "Boot", 105, 0)
_GUICtrlListView_SetColumn($lists , 3, "Memory", 90,0)
_GUICtrlListView_SetColumn($lists , 4, "Cl #",40,1)
_GUICtrlListView_SetColumn($lists , 5, "Mb/s",45,1)
_GUICtrlListView_SetColumn($lists , 6, "Zertifikat", 70,0)
_GUICtrlListView_SetColumn($lists , 7, "Last", 60,0)



Global $contextmenu  = GUICtrlCreateContextMenu ($listv)
Global $copy = GUICtrlCreateMenuitem ("copy VPN-IP", $contextmenu)
Global $copyclient = GUICtrlCreateMenuitem ("copy Clientname", $contextmenu)
Global $ipam = GUICtrlCreateMenuitem ("DNS-Abfrage", $contextmenu)



Global $contextmenus  = GUICtrlCreateContextMenu ($lists)
Global $views = GUICtrlCreateMenuitem ("view", $contextmenus)

GUICtrlSetState($MSVPN_GUI,$GUI_SHOW)


GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###



_Selfupdate ($update_sourcepath, False)																			;Gleich überprüfen ob es ein Update gibt


AdlibRegister (_auto_fqdn, $_auto_fqdn_timer)																	;Automatisches FQDN abfrage (Cache oder IPAM)
AdlibRegister (_fqdn_file_read, $_fqdn_file_read_timer)

if $fqdn_write = True Then
	guictrlsetdata ($statusinfo, "Auto DNS write möglich")
	AdlibRegister (_auto_fqdn_recheck, $_auto_fqdn_recheck_timer)												;Automatisches Cache überprüfung aktivieren
Else
	guictrlsetdata ($statusinfo, "Auto DNS read only")
EndIf




While 1

	sleep (10)																									;kurzes Sleep damit die CPU-Last herunter geht
	$check = GUICtrlRead ($autorefresh)																			;Veränderung der Checkbox


	if $auto = True Then																						;autocheck
		$today = @MDAY & @MON & @YEAR																			;aktuelles Datum einlesen
		if $lastday <> $today then
			$lastday = $today																					;gespeichertes Datum aktualisieren
			$nextreadfile = gettok (_DateAdd('n', $interval, _NowCalc()), " ", 2)								;Zeit für das nächste mal einlesen (von der aktuellen Zeit her)
			$nextreadfile = StringLeft ($nextreadfile, 6) & "35"												;Immer zur 35 Sek einlesen (um Sek 30 läuft der Task)
			GUICtrlSetData ($autorefresh, "Auto " & $nextreadfile)												;Zeit zum nächsten Autorefresh
			_datareadandview ("")																				;Daten einlesen
		EndIf


		if _NowTime() = $nextreadfile Then
			$nextreadfile =gettok (_DateAdd('n', $interval, _NowCalc()), " ", 2)								;Zeit für das nächste mal einlesen
			$nextreadfile = StringLeft ($nextreadfile, 6) & "35"												;Immer zur 35 Sek einlesen (um Sek 30 läuft der Task)
			GUICtrlSetData ($autorefresh, "Auto " & $nextreadfile)												;Zeit zum nächsten Autorefresh
			_datareadandview ("")																				;Daten einlesen
		EndIf
	EndIf



	if $check <> $last_check Then
		if $check = 1 Then																						;check
			$auto = True
			$nextreadfile =gettok (_DateAdd('n', $interval, _NowCalc()), " ", 2)								;Zeit für das nächstemal einlesen
			$nextreadfile = StringLeft ($nextreadfile, 6) & "35"												;Immer zur 35 Sek einlesen (um Sek 30 läuft der Task)
			GUICtrlSetData ($autorefresh, "Auto " & $nextreadfile)												;Zeit zum nächsten Autorefresh
			GUICtrlSetState ($Refresh, $GUI_DISABLE )															;Button Refresh deaktivieren
			GUICtrlSetData ($suchfeld, "")																		;Bei auto Suchfeld löschen
			GUICtrlSetData ($suchfeld, $suchhistory)															;history neu schreiben
			_datareadandview ("")																				;Daten erstmals einlesen
		Else																									;uncheck
			$auto = False
			GUICtrlSetState ($Refresh, $GUI_ENABLE  )															;Button Refresh aktivieren
			GUICtrlSetData ($autorefresh, "Auto")
		EndIf
		$last_check = $check
	EndIf





	$nMsg = GUIGetMsg()
	Switch $nMsg


		case $menu_auto
			if $fqdn_write = true Then
				$ret =  BitAnd(GUICtrlRead($menu_auto),$GUI_CHECKED)												;Status des menu (0 = nicht angehakt; 1 = angehakt)
				Select
					case $ret = 1																					;Angehackt
					GUICtrlSetState($menu_auto, $GUI_UNCHECKED)
					AdlibUnRegister  (_fqdn_file_write)																;automatische schreiben deaktiviert
					guictrlsetdata ($statusinfo, "Auto DNS write deaktiviert")
					$fqdn_write_status = False																		;ist inaktiv

					case $ret = 0																					;Nicht angehackt
					GUICtrlSetState($menu_auto, $GUI_CHECKED)
					AdlibRegister (_fqdn_file_write , $_fqdn_file_write_timer)										;automatisch schreiben aktiv
					guictrlsetdata ($statusinfo, "Auto DNS write aktiviert")
					$fqdn_write_status = True																		;ist aktiv
				EndSelect
			EndIf



		Case $listv
			_GUICtrlListView_SortItems($listv, GUICtrlGetState($listv))


		case $menu_update																						;Update
			_Selfupdate ($update_sourcepath, True)


		Case $views																								;Server auswählen
			$lists_all = GUICtrlRead (GUICtrlRead ($lists))														;Auswahl aus der Serverliste
			$server_name = gettok ($lists_all, "|" ,1)															;gewählter Servername
			_datareadandview ("", $server_name)																	;Suche Clients vom Server
			$auto = False																						;autorefresh auf False setzten
			GUICtrlSetState ($Refresh, $GUI_ENABLE  )															;Button Refresh aktivieren
			GUICtrlSetData ($autorefresh, "Auto")																;Text der Checkbox ändern
			GUICtrlSetState ($autorefresh , 4)

		Case $menu_breite																						;Ansicht veränderen
			If $menu_on_off = False Then																		;breite Ansicht
				$menu_on_off = True
				_Ansicht ()
				GUICtrlSetData ($menu_breite, "Ansicht max")
			Else																								;schmale Ansicht
				$menu_on_off = False
				_Ansicht ()
				GUICtrlSetData ($menu_breite, "Ansicht min")
			endif


		Case $GUI_EVENT_CLOSE																					;Rotes X = Ende
			Exit

		Case $menu_ende																							;Über die Menüleiste beenden
			Exit


		Case $suche																								;Suche (Eingabefeld)
			$ret = GUICtrlRead ($suchfeld)
			$ret = StringReplace ($ret, "|" , "")																;Sucheingabe "bereinigen"
			$ret = StringLower ($ret)																			;alles auf Kleinschreibung


			if $ret <> "" Then																					;Stirng muss auch was beinhalten
				$a = 1																							;Element 1 bleibt leer, sonst wird immer was im Combo angezeigt
				$suche_isda = False
				Do
					$tmp = StringLower (gettok ($suchhistory, "|" , $a))									 	;gibt es den String schon in der Suchhistory?
					if $tmp = $ret Then
						$suche_isda = True																		;in der History gefunden!
					EndIf
					$a = $a + 1
				until $tmp = ""

				if $suche_isda = False then																		;Wenn der Wert noch nicht erfasst worden ist...
					$suchhistory = $suchhistory  & $ret	& "|"													;...in die History aufnehmen
				EndIf
				GUICtrlSetData ($suchfeld, "")																	;Alles aus dem Combo löschen sonst wird es immer länger!
				GUICtrlSetData ($suchfeld, $suchhistory)														;history neu schreiben
				_datareadandview ($ret)																			;Anzeigen mit dem Filter (Client)
				$auto = False																					;autorefresh auf False setzten
				GUICtrlSetState ($Refresh, $GUI_ENABLE  )														;Button Refresh aktivieren
				GUICtrlSetData ($autorefresh, "Auto")															;Text der Checkbox ändern
				GUICtrlSetState ($autorefresh , 4)																;Autorefresh dektiviern
			else
				_datareadandview ("")
			EndIf



		Case $copy
			ClipPut ("")
			$ret = ClipPut (gettok (GUICtrlRead (GUICtrlRead($listv)), "|" ,1))									;erste Spalte (VPN-IP) in die Zwischenablage

			$runde = 0
			Do																									;Hier muss man immer wieder 2 oder 3 mal klicken....keine Ahnung warum
				$runde = $runde + 1
				if gettok (GUICtrlRead (GUICtrlRead($listv)), "|" ,1) <> ClipGet () Then						;wenn es nicht geht wird es nochmal in die Zwischenablange geschrieben
					$ret = ClipPut (gettok (GUICtrlRead (GUICtrlRead($listv)), "|" ,1))
				EndIf

				if $test = True Then
					print ("copy2Clip-Cound:" & @TAB & $runde)
				EndIf
			Until ($runde > 3) or ( ClipGet() = gettok (GUICtrlRead (GUICtrlRead($listv)), "|" ,1))					;nur 3 mal oder wann es gleich ist

			if $test = True Then
				Print ("copy IP to Clipboard Ret: " & $ret)
				Print (ClipGet ())
			EndIf


		Case $copyclient
			ClipPut ("")
			$ret = ClipPut (gettok (GUICtrlRead (GUICtrlRead($listv)), "|" ,3))									;dritte Spalte (Client) in die Zwischenablage

			$runde = 0
			Do																									;Hier muss man immer wieder 2 oder 3 mal klicken....keine Ahnung warum
				$runde = $runde + 1
				if gettok (GUICtrlRead (GUICtrlRead($listv)), "|" ,3) <> ClipGet () Then						;wenn es nicht geht wir es nochmal in die Zwischenablange geschrieben
					$ret = ClipPut (gettok (GUICtrlRead (GUICtrlRead($listv)), "|" ,3))
				EndIf

				if $test = True Then
					print ("copy2Clip-Client:" & @TAB & $runde)
				EndIf
			Until ($runde > 3) or ( ClipGet() = gettok (GUICtrlRead (GUICtrlRead($listv)), "|" ,3))				;nur 3 mal oder wann es gleich ist

			if $test = True Then
				Print ("copy IP to Clipboard Ret: " & $ret)
				Print (ClipGet ())
			EndIf


			if $test = True Then
				Print ("copy Name to Clipboard Ret: " & $ret)
				Print (ClipGet ())
			EndIf



		Case $Refresh
			;GUICtrlSetData ($suchfeld, "")																		;Bei Refresh Suchfeld löschen
			_datareadandview ("")


		Case $ipam
			$listv_id = GUICtrlRead ($listv)																	;GUI-ID der ausgewählten Zeile
			$listv_all = GUICtrlRead ($listv_id)
			$pc_name = gettok ($listv_all, "|" ,3)

			$pc_fqdn = _fqdncache ($pc_name)
			;$pc_fqdn = _nslookup_se ($pc_name, False, 1)														;Alt - wird jetzt durch den Cache gejagt und bei Bedarf vom IPAM abgefragt

			$listv_all = StringReplace ($listv_all, "||" ,"|")


			if $pc_fqdn = -1 Then
				if gettok ($listv_all, "|" , 9) = "" Then
					$listv_all = $listv_all & "None"
					GUICtrlSetData ($listv_id, $listv_all)
				EndIf
			Else
				if gettok ($listv_all, "|" , 9) = "" Then
					$listv_all = $listv_all & $pc_fqdn
					GUICtrlSetData ($listv_id, $listv_all)

				EndIf

			EndIf


	EndSwitch
WEnd



; ***********************************************************
; Auto-Lookup for FQDN
; Übergabe:
; Rückgabe: -1 ....nicht gestatet
; ***********************************************************
func _auto_fqdn_recheck ()

local $i, $ret , $o
local $client_alter_cache																						;Alter des Eintrags aus dem Dic

if $fqdn_write = false Then
	Return -1
endif

GUICtrlSetState($menu_auto, $GUI_UNCHECKED)																		;Auto DNS wird abgehakt
AdlibUnRegister  (_fqdn_file_write)																				;Autowrite wird deaktiviert
AdlibUnRegister (_auto_fqdn)																					;Auto fqdn wird deaktivert
AdlibUnRegister (_fqdn_file_read)																				;Auto fqdn read wird deaktiviert

guictrlsetdata ($statusinfo, "Überprüfung DNS wird gestartet")													;Info wird angezeigt

$i = 0																											;Zähler

for $o in  $fqdn_cache.keys
	$client_alter_cache = gettok ($fqdn_cache.item ($o), "|" , 1)												;Alter des Eintrag
	$ret = _DateDiff ("s", $client_alter_cache , _NowCalc ( ))
	if $ret > $alter_max Then																					;wenn es zu alt ist...
		if $test = true Then
			print ($fqdn_cache.item ($o) & @tab & "OLD (s):" & $ret & @tab & "wird entfernt")
		EndIf
		$fqdn_cache.remove(gettok (gettok ($fqdn_cache.item ($o) , "|", 2), "." , 1))							;aus dem Dic entfernen
		$i = $i + 1
	EndIf
next

guictrlsetdata ($statusinfo, $i & " Datensätzte aus Cache entfernt")											;Info wird angezeigt

_fqdn_file_write ()																								;in das Cachefile schreiben

AdlibRegister (_auto_fqdn, $_auto_fqdn_timer)																	;Automatisches FQDN abfrage aktivieren
AdlibRegister (_fqdn_file_read, $_fqdn_file_read_timer)															;Automatisches lesen des Caches aktiviern
if $fqdn_write_status = True Then
	AdlibRegister (_fqdn_file_write, $_fqdn_file_write_timer)													;Wenn die auto DNS aktiv war wieder einschalten
	guictrlsetdata ($statusinfo, "Auto DNS write aktiviert")
EndIf



EndFunc
; ***********************************************************


; ***********************************************************
; Auto-Lookup for FQDN
; Übergabe:
; Rückgabe:
; ***********************************************************
func _auto_fqdn ()

local $i, $tmp, $o																							;Arbeitsvariable
local $fqdn_name																							;FQDN-Name
local $ret																									;Arbeitsvariable
local $all_read																								;Ganze Zeile laut ID


for $i = 1 to UBound($ListV_IDs) -1																			;Alle ID's durchgehen und nachsehen ob bei Token 9 was steht
	$all_read = GUICtrlRead ($ListV_IDs[$i])																;Ganze Zeile von der HWid lesen
	$fqdn_name = gettok ($all_read, "|" , 9)																;Gibt es schon einen FQDN
	$pc_name = gettok ($all_read, "|" , 3)																	;NB-Name lesen
	if $fqdn_name = "" then 																				;Wenn es keinen FQDN gibt
		$ret = _fqdncache ($pc_name)																		;Überprüfung -> aus Cache | Cache erneuern | in Cache schreiben

		for $o = 1 to 8
			$tmp = $tmp & gettok ($all_read , "|", $o) & "|"												;Die ersten 8 wieder zusammenbauen....
		Next

		if $ret <> -1 Then																					;Wenn es einen FQDN gibt
			$tmp = $tmp & $ret
			GUICtrlSetData ($ListV_IDs[$i], $tmp)
		Else																								;Wenn es keinen FQDN gibt
			$tmp = $tmp & "None"
			GUICtrlSetData ($ListV_IDs[$i], $tmp)
		EndIf
		ExitLoop
	EndIf
Next

endfunc
; ***********************************************************



; ***********************************************************
; FFQN-Cache File write
; Übergaben:
; Rückgabe: 0 ...kann/darf nicht geschrieben werden
; Rückgabe: -1 ...file konnte nicht geöffnet werden
; Rückgabe: 1 ...File erfolgreich geschrieben
; Rückgabe: 2 ...File schreiben nicht notwendig
; ***********************************************************
func _fqdn_file_write ()

local $ret
local $o
local $fh
local $daten


if $fqdn_write = false Then
	return 0
EndIf

if $file_write_need = False Then
	if $test = True Then
		print ("Kein Schreiben in Cachedatei notwendig")
	EndIf
	Return 2
EndIf


for $o in  $fqdn_cache.keys
	$daten = $daten & $fqdn_cache.item ($o) & @CRLF
next

$fh = FileOpen ($fqdn_filecache, 2)
if $fh = -1 Then
	fileclose ($fh)
	if $test = True Then
		print ("File " & $fqdn_filecache & " konnte nicht schreibend geöffnet werden")
	EndIf
	Return -1
EndIf

$ret = FileWrite ($fh, $daten)
FileClose ($fh)
$file_write_need = False

if $test = True Then
	print ("FQDN-Daten CacheFile geschrieben (1 = OK) : " & $ret)
	print ("Datenmenge :" & $fqdn_cache.count)
EndIf

Return 1


EndFunc
; ***********************************************************


; ***********************************************************
; FQDN-Cache File read
; Übergaben:
; Rückgabe: -1 ....file konnte nicht geöffnet werden
; ***********************************************************
func _fqdn_file_read ()

local $fh
local $ret
local $pc_name

$fh = FileOpen ($fqdn_filecache, 0)

if $fh = -1 Then
	fileclose ($fh)
	if $test = True Then
		print ("File " & $fqdn_filecache & " konnte nicht geöffnet werden")
	EndIf
	Return -1
EndIf

do
	$ret = FileReadLine ($fh)
	if $ret <> "" Then
		$pc_name = gettok ($ret, "|", 2)
		$pc_name = gettok ($pc_name, ".", 1)

		if $fqdn_cache.exists ($pc_name) = False Then
			$fqdn_cache.add($pc_name, $ret)
		EndIf
	EndIf

until $ret = ""

if $test = True Then
	print ($fqdn_cache.count & " Einträge geladen")
EndIf

fileclose ($fh)
EndFunc
; ***********************************************************





; ***********************************************************
; FQDN-Cache
; Übergabe: NB-Client
; Rückgabe: FQDN aus Cache
; Rückgabe: -1 nicht gefunden
; ***********************************************************
func _fqdncache ($pc_name)

local $ret																											;Arbeitsvariablen
;local $alter_max = 10																								;max Alter für Entwicklung
local $client_alter_cache																							;Alter aus dem Cache vom Client
local $date = @YEAR & "/" & @MON & "/" & @MDAY																		;Datum
local $fqdn_name



if $fqdn_cache.exists ($pc_name) Then																				;Ist der PC schon im FQDN Cache ?
	$client_alter_cache = gettok ($fqdn_cache.item ($pc_name), "|" , 1)												;Alter des Eintrag

	if $test = True Then
		print ("$client_alter_cache :" & $client_alter_cache)
	EndIf

	$ret = _DateDiff ("s", $client_alter_cache , _NowCalc ( ))
	if $ret < $alter_max Then																						;Wenn die Information jünger als X Stunden ist
		$fqdn_name = gettok ($fqdn_cache.item ($pc_name), "|" , 2)
		if $test = True Then
			print ("From Cache Time(sek): " & $ret)
		EndIf
		$file_write_need = False
	Else																											;Wenn die Infomation älter ist
		$fqdn_name = _nslookup_se ($pc_name, False, 1)																;vom IPAM holen
		if $fqdn_name <> -1 Then																					;Wenn es eine Antwort gibt
			$fqdn_cache.remove($pc_name)
			$fqdn_cache.add($pc_name,$date & " " & @HOUR & ":" & @MIN & ":" & @SEC & "|" & $fqdn_name)				;....überschreiben
			if $test = True Then
				print ("Renew Cache: " & $fqdn_name)
			EndIf
		Else
			$fqdn_cache.remove($pc_name)																			;bei keiner Antwort das DIC-Objekt löschen
			if $test = True Then
				print ("NO-IPAM from Cache remove: " & $fqdn_name)
			EndIf
		EndIf
		$file_write_need = True
	EndIf
	Return $fqdn_name

Else																												;NICHT im Cache
	$ret = _nslookup_se ($pc_name, False, 1)																		;FQDN-Abfrage
	$file_write_need = True
	if $ret = -1 then 																								;Keinen Antwort bei der DNS-Abfrage aus dem IPAM
		Return -1
	Else
		$fqdn_cache.add($pc_name,$date & " " & @HOUR & ":" & @MIN & ":" & @SEC & "|" & $ret)						;Nein -> in den Cache aufnehmen
		if $test = True Then
			print ("Add Cache: " & $fqdn_cache.item($pc_name))
		EndIf
		Return $ret
	EndIf
EndIf


EndFunc
; ***********************************************************



; ***********************************************************
; Only Cache for DNS
; Übergabe: NB-Client
; Rückgabe: FQDN aus Cache
; Rückgabe: -1 nicht gefunden
; ***********************************************************
func _onlycache ($pc_name)

local $fqdn_name

if $fqdn_cache.exists ($pc_name) Then
	$fqdn_name = gettok ($fqdn_cache.item ($pc_name), "|" , 2)
	Return $fqdn_name
Else
	Return ("")
EndIf

EndFunc
; ***********************************************************



; ***********************************************************
; Daten einlesen und anzeigen
; Übergabe: Suche (keine Übergabe = all) (Client)
; Übergabe: Serveranzeige (alle Clients vom gewählten Server)
; Rückgabe:
; ***********************************************************
func _datareadandview ($suche_nb, $Server_suche = "")

local $i, $zeile, $tmp, $o, $a																						;diverse Arbeitsvarablen
local $server																										;servername nach suche
local $ipadresse																									;IP-Adresse des CLients
local $clientname																									;Name des Clients
local $verbindungszeit																								;Wie lange ist der Client schon verbunden

local $ISP_IP																										;ISP Verbindungs IP
local $Bandwidth																									;Aktuelle Bandbreite in Byte/sec
local $Byte_IN																										;Total Byte IN
local $Bypte_OUT																									;Total Byte OUT

local $status																										;Datum und Uhrzeit vom Server der letzten Aktualisierung
local $reboot																										;last Reboot
local $memory																										;memory
local $da_temp																										;Clientname kommt im String vor (integer)
local $sa_temp																										;Servername kommt im String vor (integer)
local $mem_free																										;Speicher der noch frei ist
local $mem_all																										;Maximaler Speicher (eingebaut)
local $lastservername																								;letzer Servername
local $shorttime																									;kürzerste Verbindungszeit pro Server
local $time_tmp, $ret																								;Arbeitsvariablen
local $clientsumme 																									;Anzahl aller verbunden clients
local $client_sum_netz[$arraysize]																					;Anzahl der Clients für die unterschiedlichen Netze
local $client																										;Clientanzahl pro Server
local $zeidiff																										;Differenzzeit zwischen System und Report
local $zeitiff_max =5																								;Maximale Zeitunterschied der erlaubt ist
local $h_timer																										;Zeitmessung (Test)
local $timer																										;Zeitmessung (Test)
local $tag, $monat, $jahr, $stunde, $minute, $sekunde																;für die Zeitdiffmessung
local $speed																										;MB/s
local $speed_summe																									;MBits/s von allen Server gemeinsam
local $Cert_Date																									;Datum wann das Zertifikat abläuft
local $cert_Diff_Time																								;Tage differenz bis zum Ablauf des Zertifikat

Local $key

local $server_anzahl = 0																							;wieviele Server werden gefunden
local $server_anzahl_default = 5

local $fenster																										;Wird zum Array mit der Fensterposition (X,Y,Breite,Höhe); Index bei 0


local $ids																											;GUI-Nummern (mehr als 1) die eingefärbt werden

$highlight.removeall																								;Dic löschen
$multi.removeall																									;Dic für die mehrfacheinträge löschen
local $list_id = ""																									;Array für die Client-ID (hwnd)
Dim $list_id[1]
local $list_s = ""																									;Array für die Server-ID (hwnd)
Dim $list_s[1]



if $test = true and $timer_on = True Then
	$h_timer = TimerInit ()
	Print ("Start File to Array...")
EndIf

$ret = fastload_to_array ($tempdaten, $pfad & $status_datei)														;all_status-File



if $test = true and $timer_on = True Then
	$timer = TimerDiff ($h_timer)
	Print ("File to Array..." & $timer / 1000)
EndIf



_GUICtrlListView_BeginUpdate ($listv)
_GUICtrlListView_DeleteAllItems ($listv)


_GUICtrlListView_BeginUpdate ($lists)
_GUICtrlListView_DeleteAllItems ($lists)



if $test = true and $timer_on = True Then
	$h_timer = TimerInit ()
	Print ("Schleifen Start...")
EndIf

for $i = 1 to UBound ($tempdaten) -1
	$zeile = StringStripWS($tempdaten[$i], 7)																		;leerzeichen entfernen

	if stringleft ($zeile, 6) = "Server" Then																		;Servername parsen
		$server = gettok (StringStripWS($zeile, 8), ":", 2)
		$server_anzahl = $server_anzahl + 1

	EndIf

	if stringleft ($zeile, 6) = "Status" Then																		;Datum & Uhrzeit
		$status = gettok ($zeile, @tab , 2)
	EndIf


	if stringleft ($zeile, 6) = "Reboot" Then																		;Reboot
		$reboot = gettok ($zeile, @tab , 2)
	EndIf

	if stringleft ($zeile, 6) = "Memory" Then																		;Memmory
		$memory = gettok ($zeile, @tab , 2)
	EndIf

	if stringleft ($zeile, 6) = "Client" Then																		;Clientanzahl
		$client = gettok ($zeile, @tab , 2)
	EndIf


	if stringleft ($zeile, 5) = "Speed" Then																		;Speed
		$speed = gettok ($zeile, @tab , 2)
	EndIf

	if stringleft ($zeile, 7) = "Cer_Day" Then																		;Zertifikatsdaum
		$Cert_Date = gettok ($zeile, @tab , 2)
	EndIf

	;print ("Server: " & $server & @tab & "status: " & $status & @TAB & "reboot: " & $reboot & @TAB & "memory: " & $memory & @TAB & "speed: " & $speed)

	if $server <> "" and $status <> "" and $reboot <> "" and $memory <> "" and $speed <> "" and $Cert_Date <> "" Then

		$mem_free = gettok (gettok ($memory, "/", 1), ":" , 2) + 0													;Freememory als Integer
		$mem_all = gettok (gettok ($memory, "/", 2), ":" , 2) + 0													;Maxmemory als Integer


		$speed = gettok ($speed , " ", 2)
		$speed_summe = $speed_summe + $speed																		;Speed over all


		ReDim $list_s [UBound($list_s) +1 ]
		$list_s[UBound($list_s) - 1] = GUICtrlCreateListViewItem (gettok ($server, ".",1) & "|" & $status & "|" & $reboot & "|" & $mem_free & " / " & $mem_all & "|" & $client & "|" & StringFormat ("%.2f", $speed) & "|" & $Cert_Date , $lists)

		;Variablen für den Statusdifferenz
		$jahr = stringmid ($status, 7, 4)
		$monat = stringmid ($status, 4, 2)
		$tag  = stringmid ($status, 1, 2)
		$stunde = stringmid ($status, 12, 2)
		$minute = stringmid ($status, 15, 2)
		$sekunde = stringmid ($status, 18, 2)

		;Zeitdifferenz in Minuten
		$zeidiff = _DateDiff ("n", $jahr & "/" & $monat & "/" & $tag & " " & $stunde & ":" & $minute & ":" & $sekunde, @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC)


		;Zeitdifferenz in Tagen für das Zertifikat

		;Variablen für den Zertifikatsdifferenz
		$jahr = stringmid ($Cert_Date, 7, 4)
		$monat = stringmid ($Cert_Date, 4, 2)
		$tag  = stringmid ($Cert_Date, 1, 2)


		;Zeitdifferenz in Tagen für Zertifikate
		$cert_Diff_Time = _DateDiff ("D",  @YEAR & "/" & @MON & "/" & @MDAY, $jahr & "/" & $monat & "/" & $tag)


		if $zeidiff > $zeitiff_max Then
			;print ($server & @tab & $zeidiff)
			GUICtrlSetBkColor  ($list_s[UBound($list_s) - 1], "0xFFF152")
		EndIf


		Select
			Case $cert_Diff_Time < 60
				GUICtrlSetBkColor  ($list_s[UBound($list_s) - 1], "0x436eee")

			case $cert_Diff_Time < 30
				GUICtrlSetBkColor  ($list_s[UBound($list_s) - 1], "0xcaff70")

			case $cert_Diff_Time < 5
				GUICtrlSetBkColor  ($list_s[UBound($list_s) - 1], "0xff4040")

		EndSelect


		$status = ""
		;$server = ""
		$reboot = ""
		$memory = ""
		$speed = ""
		$Cert_Date = ""


		Select																										;Zweistufig die Serverzeilen einfärben für Memory
			case $mem_free >= ($mem_all / 2)
				GUICtrlSetColor ($list_s[UBound($list_s) - 1], "0x000000")											;mehr als die Hälfte frei(schwarz)

			case $mem_free < ($mem_all / 2) and ($mem_free > ($mem_all / 4))										;weniger als die Hälfte aber mehr als ein viertel (orange)
				GUICtrlSetColor ($list_s[UBound($list_s) - 1], "0xFF9933")

			case $mem_free < ($mem_all / 4)																			;weniger als ein viertel des MEM frei (rot)
				GUICtrlSetColor ($list_s[UBound($list_s) - 1], "0xFF0000")

		EndSelect
	EndIf


	if StringLeft ($zeile, 3) = "172" Then																			;Suche den Daten (Client, IP) only

		$ipadresse = gettok ($zeile, " ", 1)																		;VPN-IP Adresse
		$clientname = StringReplace (gettok ($zeile, " ", 2), "}" , "")												;Klammern entfernen
		$clientname = StringReplace ($clientname, "{", "")															;Klammern entfernen
		$clientname = StringLower ($clientname)																		;alles klein schreiben (sieht besser aus)
		$verbindungszeit = StringStripWS( Sec_2_Time_Format(gettok ($zeile, " ", 3)), 8)							;Stunden/Minuten/Sekunden
		$time_tmp = StringStripWS(gettok ($zeile, " ", 3), 8) + 0													;Verbindungszeit in Sekunden



		$ISP_IP = gettok ($zeile, " ", 4)																			;ISP Verbindungs IP
		$Bandwidth = StringFormat ("%.2f", Round ((gettok ($zeile, " ", 5) / 125000),2))							;Aktuelle Bandbreite in Mbits/sec
		$Byte_IN = StringFormat ("%.2f",Round (gettok ($zeile, " ", 6) / 1073741824, 2))							;Total Byte IN (angezeigt als GB)
		$Bypte_OUT = StringFormat ("%.2f",Round (gettok ($zeile, " ", 7)	/ 1073741824, 2))						;Total Byte OUT (angzeigt als GB)


		$clientsumme = $clientsumme + 1																				;Gesammtsumme aller Clients


		for $o = 1 to $arraysize - 1
			if StringLeft ($server, StringLen ($Servername_sum[$o])) = $Servername_sum[$o]  Then					;Summenzählung pro Netz
				$client_sum_netz[$o] = $client_sum_netz[$o] + 1
			EndIf
		Next



		if $server = $lastservername or $lastservername = "" Then													;Solange des der gleiche Server ist....
			if $lastservername = "" Then
				$lastservername = $server
			EndIf

			if $shorttime = 0 Then																					;Kürzerste Verbindungszeit wenn es noch nichts gibt
				$shorttime = $time_tmp
			Else
				if $shorttime > $time_tmp Then																		;Wenn die neue Zeit kleiner als die bisher kürzeste Zeit ist
					$shorttime = $time_tmp
				EndIf
			EndIf
		Else																										;Wenn sich der Servername ändert


			$lastservername = $server
			$shorttime = $time_tmp
			if $shorttime > $time_tmp Then
				$shorttime = $time_tmp
			EndIf
		EndIf



		if $highlight.exists ($server) Then																			;Merkt sich die kürzerste Verbindungszeit eines Client von jedem Server
			$highlight.item($server) = StringStripWS (Sec_2_Time_Format ($shorttime),8)
		Else
			$highlight.add($server,StringStripWS (Sec_2_Time_Format ($shorttime),8))
		EndIf

		if $suche_nb = "" Then																						;Wenn KEIN Client gesucht wird


			ReDim $list_id[UBound($list_id) +1]
			if $Server_suche = "" then 																				;Wenn KEIN Server ausgewählt worden ist
				;$list_id[$clientsumme] = GUICtrlCreateListViewItem ($ipadresse & "|" & $ISP_IP & "|" & $clientname & "|" & $server & "|" & $verbindungszeit & "|" & $Bandwidth & "|" & $Byte_IN & "|" & $Bypte_OUT, $listv)
				$list_id[$clientsumme] = GUICtrlCreateListViewItem ($ipadresse & "|" & $ISP_IP & "|" & $clientname & "|" & $server & "|" & $verbindungszeit & "|" & $Bandwidth & "|" & $Byte_IN & "|" & $Bypte_OUT & "|" & _onlycache ($clientname), $listv)
			Else																									;Server ist ausgewählt
				$sa_temp = StringInStr ($server, $Server_suche)														;Servername (kurz) ist in $server enthalten
				if $sa_temp <> 0 Then
					;$list_id[$clientsumme] = GUICtrlCreateListViewItem ($ipadresse & "|" & $ISP_IP & "|" & $clientname & "|" & $server & "|" & $verbindungszeit & "|" & $Bandwidth & "|" & $Byte_IN & "|" & $Bypte_OUT, $listv)
					$list_id[$clientsumme] = GUICtrlCreateListViewItem ($ipadresse & "|" & $ISP_IP & "|" & $clientname & "|" & $server & "|" & $verbindungszeit & "|" & $Bandwidth & "|" & $Byte_IN & "|" & $Bypte_OUT & "|" & _onlycache ($clientname), $listv)
				EndIf
			EndIf


			if $multi.exists ($clientname) Then																		;Wenn das Gerät schon in der Liste ist
				$key = $multi.item ($clientname)																	;alten KEY (GUI-Nummer)
				$multi.item ($clientname) = $key & "|" & $list_id[$clientsumme]										;alten KEY + neue Nummer mit | geteilt

			Else
				$multi.add ($clientname, $list_id[$clientsumme])													;noch nicht in der Liste
			EndIf

		Else
			$da_temp = StringInStr ($clientname, $suche_nb)
			if $da_temp <> 0 then
			;if StringLower ($suche_nb) = StringLower($clientname) Then
				GUICtrlCreateListViewItem ($ipadresse & "|" & $ISP_IP & "|" & $clientname & "|" & $server & "|" & $verbindungszeit & "|" & $Bandwidth & "|" & $Byte_IN & "|" & $Bypte_OUT & "|" & _onlycache ($clientname), $listv)
			EndIf
		EndIf
	EndIf
Next




;Fenster (server / client) Höhe anpassen
$fenster = ControlGetPos ("", "", $MSVPN_GUI)

if $server_anzahl > $server_anzahl_default Then
	GUICtrlSetPos ($lists, Default, Default, Default, 140 + (10 * ($server_anzahl - $server_anzahl_default)))		;Startlänge = 140 - wird nach unten gezogen
	GUICtrlSetPos ($listv, Default, 180 + (10 * ($server_anzahl - $server_anzahl_default)), Default , $fenster[3] - 355 ) ;Abstand von Höhe der GUI ist immer 319!!!
EndIf




; Mehrfache Geräte Rot einfärben
for $o in  $multi.keys
	$ids = $multi.item ($o)
	if stringinstr ($ids, "|") <> 0 Then																			;Wenn mehr als eine ID (Kennzeichen |)
		$a = 0
		Do
			$a = $a + 1
			$tmp = gettok ($ids, "|" , $a) + 0																		;GUI-ID wieder in eine Zahl verwandeln
			if $tmp <> 0 Then
				GUICtrlSetColor ($tmp, "0xFF0000")																	;Zeile rot machen
			EndIf
		until $tmp = 0
	endif
Next



if $test = true and $timer_on = True Then
	$timer = TimerDiff ($h_timer)
	Print ("Schleife fertig..." & $timer / 1000)
EndIf


for $o = 1 to $arraysize - 1																						;Anzeige Summe der Clients pro Netz
	GUICtrlSetData ($client_sum[$o] , $client_sum_netz[$o] + 0)														; + 0 damit was angezeigt wird wenn es keinen Client gibt
Next



if $clientsumme > $peek Then																						;Peek (max. Anzahl der verbunden Clients)
	$peek = $clientsumme
	GUICtrlSetData ($client_Peek_sum , $peek)
endif

GUICtrlSetData ($Maxinfo, "Speed@ALL: " & $speed_summe & " Mbit/s")


;Highlighting
if $suche_nb = "" Then																								;Nur bunt machen wenn nicht gesucht wird
	for $i In $highlight.keys																						;Key = Server FQDN - Item Zeit
		;Alle Server/kürzeste Zeit durchlaufen
		for $o = 0 to UBound ($list_id) - 1
			$ret = GUICtrlRead ($list_id[$o])																		;Inhalt des Listviews (Zeile) mit der ID auslesen

			;Vergleich: Uhrzeit mit Uhrzeit und Server mit Server

			if StringStripWS(gettok (($ret), "|", 5),8) = StringStripWS($highlight.item($i),8) and StringStripWS(gettok (($ret), "|", 4),8) = StringStripWS($i,8) Then
				GUICtrlSetColor ($list_id[$o], "0x228B22")															;Einfärben die Clientliste
			EndIf
		Next
	Next
EndIf

for $o = 1 to  UBound($list_s) -1																					;Serverschleife
	$ret =  GUICtrlRead ($list_s[$o])																				;Serverzeile

	for $i in $highlight.keys																						;Alle Server durchlaufen (es könnte ja einer nicht gelistet sein...)
		if gettok ($i, "." , 1) = gettok ($ret, "|", 1) Then
			$tmp = $ret & $highlight.item($i)																		;$tmp ist die Zeit des letzten Verbundnen Clients
			$tmp = StringReplace ($tmp , "||" ,"|")
			GUICtrlSetData ($list_s[$o], $tmp)
		EndIf
	Next
Next


_Ansicht ()


_GUICtrlListView_EndUpdate ($listv)
_GUICtrlListView_EndUpdate ($lists)


$ListV_IDs = $list_id																								;Arraycopy der IDs vom Listview


EndFunc
; ***********************************************************



; ***********************************************************
; Ansicht Breit / schmal
; Hinweis: Nach einem GUICtrlListView_Update werden die Spalten wiederhergestellt, auch wenn es nicht gewünscht ist
; Übergabe: true / false
; Rückgabe: -
; ***********************************************************

Func _Ansicht ()
If $menu_on_off = false Then																						;Ansicht normal
	;Ansicht Clients
	_GUICtrlListView_SetColumnWidth($listv , 1, 100)
	_GUICtrlListView_SetColumnWidth($listv , 5, 60)
	_GUICtrlListView_SetColumnWidth($listv , 6, 65)
	_GUICtrlListView_SetColumnWidth($listv , 7, 65)

	;Ansicht Server
	_GUICtrlListView_SetColumnWidth($lists , 6, 70)																	;serverzeile (Zertifikatspalte einblenen)

	;GUICtrlSetState ($Maxinfo, $GUI_SHOW)																			;Zusatzinfo einblenden


Else																												;Ansicht maximal
	;Ansicht Clients
	_GUICtrlListView_SetColumnWidth($listv , 1, 0)
	_GUICtrlListView_SetColumnWidth($listv , 5, 0)
	_GUICtrlListView_SetColumnWidth($listv , 6, 0)
	_GUICtrlListView_SetColumnWidth($listv , 7, 0)

	;Ansicht Server
	_GUICtrlListView_SetColumnWidth($lists , 6, 0)																	;serverzeile (Zertifikatspalte ausblenen)

	;GUICtrlSetState ($Maxinfo, $GUI_HIDE)																			;Zusatzinfo ausblenden


endif
EndFunc
; ***********************************************************




; ***********************************************************
; Sekunden in ein anders Format bringen
; Übergabe: Sekunden
; Rückgabe: Stunden/Minuten/Sekunden
; ***********************************************************
Func Sec_2_Time_Format($time) ;coded by UEZ
Local $days = 0
Local $sec = Mod($time, 60)
Local $min = Mod(Int($time / 60), 60)
Local $hr = Int($time / 60 ^ 2)
If $hr > 23 Then
	$days = Floor($hr / 24)
	$hr -= $days * 24
EndIf

Return StringFormat(" %02i:%02i:%02i ",  $hr, $min, $sec)
;Return StringFormat("%01id %02i:%02i:%02i // ", $days, $hr, $min, $sec) & _DateAdd("s", -$time, _NowCalc())

EndFunc ;==>Sec_2_Time_Format
; ***********************************************************




; ***********************************************************
; Selbstupdate
; Übergabe: Updatesourepfad
; Übergbae: autoupdate - Meldung (damit nicht bei jedem Start "Sie haben bereits die aktuelle Version" kommt
; Rückgabe: -1 Update wurde nicht gefunden (Pfad/Datei nicht vorhanden, Zugriff nicht möglich...)
; ***********************************************************
func _Selfupdate ($source, $autoupdate=False)

local $update_program = $source & @ScriptName																		;full Path
local $ret																											;Arbeitsvariablen
local $file_version																									;Welche Versionsnummer steht im INI-File

if $test = True Then																								;Nur für die Entwicklung damit ein Update simuliert werden kann
	$update_program = $source & "msvpn_monitor.exe"
EndIf



$ret = FileExists ($update_program)																					;gibt es das Programm überhaupt und/oder ist das Share erreichbar ?
if $ret <> 1 Then																									;1 OK, alles andere schlecht
	if $test = True Then
		Print ("Datei " & $update_program & " wurde nicht gefunden!")
	Else
		;echo ("Datei " & $update_program & " wurde nicht gefunden!")												;Momentan einfach nichts machen....
		Return -1
	EndIf
EndIf


$file_version = FileGetVersion ($update_program)																	;Fileversion einlesen

if $test = True Then
	print ($update_program & @TAB & $file_version)
	print ("aktuelle Programmversionsnummer:"  & @tab & $version)
	print ("$autoupdate: " & $autoupdate)
EndIf

if StringInStr (StringLower (@ScriptFullPath), "vmntba1t" ) <> 0 Then												;Prüfen ob das Programm nicht vom FS gestartet worden ist
	$ret = MsgBox (1,"Programmstart" ,"Sie versuchen das Programm vom Fileshare zu starten." & @CRLF & "Das ist nicht gewünscht! Soll das Programm auf den Desktop kopiert werden?", 15)
	if $ret = 1 Then																								;Ja kopieren
		if $test = True Then
			print ("FileCopy:" & @TAB & "Filecopy (" & $update_program & " , " & @DesktopDir & "\" & @ScriptName & ", 1")
		EndIf

		$ret = FileCopy ($update_program, @DesktopDir & "\" & @ScriptName, 1)										;Filecopy auf den Desktop
		if $ret <> 1 Then																							;Wenn das kopieren nicht gut gegangen ist
			MsgBox (0, "Error" , "Das Programm konnte nicht nach " & @DesktopDir & "\" & @ScriptName & " kopiert werden...")
			Exit
		Else
			run ('cmd /c ping 127.0.0.1 /n 2 & start ' & @DesktopDir & '\' & @ScriptName, "", @SW_HIDE)				;Programm vom Desktop startetn
			Exit
		EndIf
	EndIf
EndIf



$ret = _VersionCompare ($file_version, $version)																	;Vergleich der Versionsnummern




Select
	Case $ret = 1
		$ret = MsgBox (1,"Programmupdate" ,"Möchten Sie auf die Version V" & $file_version & " updaten?", 15)
		if $ret = 1 Then																							;Wenn OK geklickt worden ist
			if @Compiled = 0 then
				print  ('cmd /c ping 127.0.0.1 /n 2 & copy /y ' & $update_program & ' ' & @ScriptFullPath & ' & start ' & @ScriptFullPath)
			Else
				run ('cmd /c ping 127.0.0.1 /n 2 & copy /y ' & $update_program & ' ' & @ScriptFullPath & ' & start ' & @ScriptFullPath , "", @SW_HIDE)		;Selfupdate
				Exit																								;Programm muss beendet werden damit es kopiert werden kann -> Automatisch wieder starten
			EndIf
		EndIf

	case $ret = -1
		if $autoupdate = True Then
			MsgBox (1, "Programmupdate" ,"Gratuliere, Sie haben eine aktuellere Version als ich ;-)", 10)
		EndIf
		Return

	case $ret = 0
		if $autoupdate = True Then
			MsgBox (0, "Programmupdate" ,"Sie haben bereits die aktuellste Version", 10)
		EndIf
		Return

EndSelect



EndFunc
; ***********************************************************

