Tool für Serverstatus

  • Hallo Community

    Ein bekannter von mir hat mich darauf angesprochen, mal ein Tool zu schreiben welches den Status von Servern testet. Also er legt die Server fest die er haben will (z.B. google.de) und im Programm wird dann halt getestet ob der gewünschte Server online oder offline ist. Ich bin soweit das man Server hinzufügen kann (werden in .ini Datei gespeichert) und auch die Anzahl der Server ausgelesen wird. Da diese Anzahl unbekannt ist habe ich ein Listview gemacht, in das je nach Anzahl der Einträge(in der .ini) ein neues Item mit dem Namen angelegt wird. Diese Server(Items) sollen nun wie oben beschrieben auf den Status getestet und eingefärbt (grün=online, rot=offline) werden. Mein Problem ist jetzt das ich nicht weiß ob das praktisch ist wie ich es gemacht hab und das ich mit dem einfärben Probleme hab da ich keine Ahnung hab wie ich die Items ansprechen kann/soll.

    Mein bisheriger Code:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include <ListviewConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    #Region Gui
    $mainw = GUICreate("Serverstatus", 248, 318, 192, 142)
    $mnu_file = GUICtrlCreateMenu("File")
    $mnu_file_test = GUICtrlCreateMenuItem("test", $mnu_file)
    $mnu_file_close = GUICtrlCreateMenuItem("Close", $mnu_file)
    $mnu_edit = GUICtrlCreateMenu("Edit")
    $mnu_edit_conf = GUICtrlCreateMenuItem("Preferences", $mnu_edit)
    $mnu_help = GUICtrlCreateMenu("?")
    $lst_server = GUICtrlCreateListView("Server", 10, 10, 228, 278, $LVS_SORTASCENDING)
    _GUICtrlListView_SetColumn($lst_server, 0, "Server", 220)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $mainw)

    [/autoit] [autoit][/autoit] [autoit]

    $confw = GUICreate("Preferences", 500, 425)
    $tab_conf = GUICtrlCreateTab(10, 10, 480, 405)
    $tab_conf_servers = GUICtrlCreateTabItem("Servers")
    GUICtrlCreateGroup("Server Hinzufügen", 30, 35, 135, 185)
    $lbl_name = GUICtrlCreateLabel("Name:", 40, 60)
    $inp_name = GUICtrlCreateInput("", 50, 75, 100, 20)
    $lbl_adresse = GUICtrlCreateLabel("Adresse:", 40, 105)
    $inp_adresse = GUICtrlCreateInput("", 50, 120, 100, 20)
    $lbl_port = GUICtrlCreateLabel("Port:", 40, 145)
    $inp_port = GUICtrlCreateInput("", 50, 160, 100, 20)
    $btn_addserver = GUICtrlCreateButton("Add", 70, 185, 50)
    $lst_servers = GUICtrlCreateList("", 180, 40, 150, 190)
    $btn_delete = GUICtrlCreateButton("Löschen", 205, 240)

    [/autoit] [autoit][/autoit] [autoit]

    #EndRegion

    [/autoit] [autoit][/autoit] [autoit]

    $read1 = IniReadSectionNames("conf.ini")
    $anzahl = UBound($read1)
    $i = 1
    For $i = 2 to $anzahl-1
    GUICtrlCreateListViewItem($read1[$i], $lst_server)
    GUICtrlSetData($lst_servers, $read1[$i] & "|")
    Next

    [/autoit] [autoit][/autoit] [autoit]

    While 1

    $msg = GUIGetMsg(1)
    Switch $msg[1]
    Case $mainw
    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    TCPShutdown()
    Exit
    Case $mnu_file_close
    TCPShutdown()
    Exit
    Case $mnu_edit_conf
    GUISetState(@SW_SHOW, $confw)
    Case $mnu_file_test
    _ArrayDisplay($read1)
    MsgBox(0, "", $read1[2])
    EndSwitch

    Case $confw
    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE, $confw)
    Case $btn_addserver
    $name = GUICtrlRead($inp_name)
    $adresse = GUICtrlRead($inp_adresse)
    $port = GUICtrlRead($inp_port)
    $read2 = IniReadSectionNames("conf.ini")
    $count = UBound($read2)-1
    IniWrite("conf.ini", $name, "adresse", $adresse)
    IniWrite("conf.ini", $name, "port", $port)
    GUICtrlSetData($inp_name, "")
    GUICtrlSetData($inp_adresse, "")
    GUICtrlSetData($inp_port, "")
    Case $btn_delete
    $read3 = GUICtrlRead($lst_servers)
    IniDelete("conf.ini", $read3)
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]

    schonmal Danke im vorraus
    Mfg Requion

  • Hier ein Beispiel dazu:

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>
    #include <GUIConstantsEx.au3>
    #include <ListviewConstants.au3>
    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $aNames[20][2]
    $aNames[0][0] = "Jürgen"
    $aNames[1][0] = "Peter"
    $aNames[2][0] = "Bert"
    $aNames[3][0] = "Christina"
    $aNames[4][0] = "Alex"
    $aNames[5][0] = "Astrid"
    $aNames[6][0] = "Roberto"
    $aNames[7][0] = "Heinz"
    $aNames[8][0] = "Iwan"
    $aNames[9][0] = "Robertina"
    $aNames[10][0] = "Hans"
    $aNames[11][0] = "Peter II."
    $aNames[12][0] = "Tina"
    $aNames[13][0] = "Michael"
    $aNames[14][0] = "Gunnar"
    $aNames[15][0] = "Kurt"
    $aNames[16][0] = "Gerald"
    $aNames[17][0] = "Alfred"
    $aNames[18][0] = "Stefanie"
    $aNames[19][0] = "Nicole"
    Dim $aItems[20]

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("", 200, 400)
    $listview = GUICtrlCreateListView("Name|Status", 10, 10, 180, 350)
    For $i = 0 To 19
    $aItems[$i] = GUICtrlCreateListViewItem($aNames[$i][0] & "|Offline", $listview)
    Next
    _GUICtrlListView_SetColumnWidth($listview, 0, 140)
    _GUICtrlListView_SetColumnWidth($listview, 1, 40) ;0 = unsichtbar
    _GUICtrlListView_RegisterSortCallBack($listview)

    [/autoit] [autoit][/autoit] [autoit]

    _RandomOnOff()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    ;GUICtrlSetColor(-1, 0x22C21F)
    ;GUICtrlSetColor(-1, 0xAA0000)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack($listview)
    Exit
    Case $listview
    _GUICtrlListView_SortItems($ListView, GUICtrlGetState($ListView))
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _RandomOnOff()
    _GUICtrlListView_BeginUpdate($listview)
    For $i = 0 To 19
    If Random(1, 3, 1) = 1 Then
    $aNames[$i][1] = "Off"
    Else
    $aNames[$i][1] = "On"
    EndIf
    Next
    For $i = 0 To 19
    $iItem = _GUICtrlListView_FindText($listview, $aNames[$i][0], -1, False, True)
    If $aNames[$i][1] = "Off" Then
    GUICtrlSetData($aItems[$iItem], "|Off")
    GUICtrlSetBkColor($aItems[$iItem], 0xAA0000)
    Else
    GUICtrlSetData($aItems[$iItem], "|On")
    GUICtrlSetBkColor($aItems[$iItem], 0x22C21F)
    EndIf
    Next
    If GUICtrlGetState($ListView) = 1 Then
    _GUICtrlListView_SortItems($listview, 0)
    _GUICtrlListView_SortItems($listview, 1)
    EndIf
    _GUICtrlListView_EndUpdate($listview)
    AdlibRegister("_RandomOnOff", Random(5000, 10000, 1))
    EndFunc ;==>_RandomOnOff

    [/autoit]

    mfg autoBert

  • Danke für die schnelle Antwort. Ich werde mich mal damit beschäftigen.

    Mfg Requion

    2 Mal editiert, zuletzt von Requion (29. März 2013 um 15:03)

  • Update: Also das Beispiel ist Super aber ich hab Probleme das
    umzuschreiben. In dem Beispiel sind die Anzahl der Elemente und die
    Werte der Elemente ja fest vorgeschrieben. Aber ich weiß ja noch nicht
    wieviele es sind.

  • Update: Also das Beispiel ist Super aber ich hab Probleme das
    umzuschreiben.

    Dann zeige mal was du bisher hast.

    Edit: Ich habe in dein Skript, die Färbung der Items eingefügt:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    #include <ListviewConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    Global $aServers[1][3]
    Global $iPing, $iAct
    #Region Gui
    $hGuiMain = GUICreate("Serverstatus", 248, 318, 192, 142)
    $idMnu_file = GUICtrlCreateMenu("File")
    $idMnu_file_test = GUICtrlCreateMenuItem("test", $idMnu_file)
    $idMnu_file_close = GUICtrlCreateMenuItem("Close", $idMnu_file)
    $idMnu_edit = GUICtrlCreateMenu("Edit")
    $idMnu_edit_conf = GUICtrlCreateMenuItem("Preferences", $idMnu_edit)
    $idMnu_help = GUICtrlCreateMenu("?")
    $idLV_Server = GUICtrlCreateListView("Name|Adresse|Port|Ping", 5, 5, 238, 288, $LVS_SORTASCENDING)
    _GUICtrlListView_SetColumnWidth($idLV_Server, 0, 80)
    _GUICtrlListView_SetColumnWidth($idLV_Server, 1, 100)
    _GUICtrlListView_SetColumnWidth($idLV_Server, 2, 0) ;unsichtbar
    _GUICtrlListView_SetColumnWidth($idLV_Server, 3, $LVSCW_AUTOSIZE_USEHEADER)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $hGuiMain)

    [/autoit] [autoit][/autoit] [autoit]

    $hGuiConf = GUICreate("Preferences", 500, 425)
    $idTab_conf = GUICtrlCreateTab(10, 10, 480, 405)
    $idTab_conf_servers = GUICtrlCreateTabItem("Servers")
    GUICtrlCreateGroup("Server Hinzufügen", 30, 35, 135, 185)
    $idLbl_name = GUICtrlCreateLabel("Name:", 40, 60)
    $idInp_name = GUICtrlCreateInput("", 50, 75, 100, 20)
    $idLbl_adresse = GUICtrlCreateLabel("Adresse:", 40, 105)
    $idInp_adresse = GUICtrlCreateInput("", 50, 120, 100, 20)
    GUICtrlCreateLabel("Port:", 40, 145)
    $idInp_port = GUICtrlCreateInput("", 50, 160, 100, 20)
    $idBtn_addserver = GUICtrlCreateButton("Add", 70, 185, 50)
    $idLstServer = GUICtrlCreateList("", 180, 40, 150, 190)
    $idBtn_delete = GUICtrlCreateButton("Löschen", 205, 240)
    GUICtrlCreateTabItem("")
    #EndRegion Gui

    [/autoit] [autoit][/autoit] [autoit]

    _getServers()
    _GUICtrlListView_RegisterSortCallBack($idLV_Server)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg(1)
    Switch $msg[1]
    Case $hGuiMain
    Switch $msg[0]
    Case $GUI_EVENT_CLOSE, $idMnu_file_close
    _GUICtrlListView_UnRegisterSortCallBack($idLV_Server)
    Exit
    Case $idMnu_edit_conf
    GUISetState(@SW_SHOW, $hGuiConf)
    Case $idMnu_file_test
    $iAct = -1
    _PingIt()
    Case $idLV_Server
    _GUICtrlListView_SortItems($idLV_Server, GUICtrlGetState($idLV_Server))
    $iAct = -1
    EndSwitch
    Case $hGuiConf
    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE, $hGuiConf)
    _getServers()
    $iAct = -1
    Case $idBtn_addserver
    $name = GUICtrlRead($idInp_name)
    $adresse = GUICtrlRead($idInp_adresse)
    $port = GUICtrlRead($idInp_port)
    $read2 = IniReadSectionNames("conf.ini")
    $count = UBound($read2) - 1
    IniWrite("conf.ini", $name, "adresse", $adresse)
    IniWrite("conf.ini", $name, "port", $port)
    GUICtrlSetData($idInp_name, "")
    GUICtrlSetData($idInp_adresse, "")
    GUICtrlSetData($idInp_port, "")
    Case $idBtn_delete
    $read3 = GUICtrlRead($idLstServer)
    IniDelete("conf.ini", $read3)
    EndSwitch
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _getServers()
    Local $aTmp = IniReadSectionNames("conf.ini")
    _ArraySort($aTmp, 0, 1)
    Local $aData
    _GUICtrlListView_DeleteAllItems($idLV_Server)
    ReDim $aServers[$aTmp[0] + 1][2]
    For $i = 1 To $aTmp[0]
    $aData = IniReadSection("conf.ini", $aTmp[$i])
    $aServers[$i][0] = GUICtrlCreateListViewItem($aTmp[$i] & '|' & $aData[1][1] & '|' & $aData[2][1], $idLV_Server)
    $aServers[$i][1] = $aTmp[$i]
    ; $aServers[$i][2]=$aData[1]
    ; $aServers[$i][3]=$aData[2]
    Next
    EndFunc ;==>_getServers

    [/autoit] [autoit][/autoit] [autoit]

    Func _PingIt()
    AdlibUnRegister('_PingIt')
    $iAct += 1
    Local $aItem = _GUICtrlListView_GetItemTextArray($idLV_Server, $iAct)
    Local $iItem = _ArraySearch($aServers, $aItem[1]) ;Server aus Listview im Array suchen
    ;ConsoleWrite($iAct & @TAB & $aItem[1] & @TAB)
    $iPing = Ping($aItem[2])
    If @error Then $iPing = 99999 ;für nicht erreichbar nötig wegen Sortiermöglichkeit
    ;ConsoleWrite($iPing & @CRLF)
    GUICtrlSetData($aServers[$iItem][0], '|||' & StringFormat('%5s', $iPing))
    Switch $iPing ;Farben je nach Ping
    Case 0 to 99
    GUICtrlSetBkColor($aServers[$iItem][0], 0x22C21F)
    GUICtrlSetColor($aServers[$iItem][0], 0x0)
    case 100 to 499
    GUICtrlSetBkColor($aServers[$iItem][0], 0x00FF1F)
    GUICtrlSetColor($aServers[$iItem][0], 0x0)
    Case 500 to 999
    GUICtrlSetBkColor($aServers[$iItem][0], 0x772200)
    GUICtrlSetColor($aServers[$iItem][0], 0xFFFFFF)
    Case Else
    GUICtrlSetBkColor($aServers[$iItem][0], 0xFF0000)
    GUICtrlSetColor($aServers[$iItem][0], 0xFFFFFF)
    EndSwitch
    If $iAct < _GUICtrlListView_GetItemCount($idLV_Server) - 1 Then AdlibRegister('_PingIt')
    EndFunc ;==>_PingIt

    [/autoit]

    Ich verwende zum Feststellen der Erreichbarkeit

    [autoit]

    Ping

    [/autoit]

    Da ich 4 Farbabstuffungen vorgesehen habe wirst du diese sicher noch anpassen.
    Die LV ist nach den Spaltenüberschriften sortierbar. Wenn während die Ping-Tests noch laufen sortiert wird fangen die Tests wieder mit dem 1. Item an.

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (29. März 2013 um 19:58)

  • Dankeschön autoBert. So habe ich mir das Vorgestellt und nun weiß ich, dass ich noch ne ganze Menge lernen muss. :D
    Zu dem Thema Erreichbarkeit: Kann man mit der Ping Variante auch auf gewisse Ports hin überprüfen? z.B. speziell einen IRC-Server der über Port 6667 läuft.
    Ansonsten werde ich mich mal mit dem Quellcode beschäftigen (morgen :D) und mich wieder melden falls ich noch Fragen habe.

    Mfg Requion

  • Zu dem Thema Erreichbarkeit: Kann man mit der Ping Variante auch auf gewisse Ports hin überprüfen? z.B. speziell einen IRC-Server der über Port 6667 läuft.

    Die Pingfunktion prüft nicht ob ein bestimmter Port offen und erreichbar ist. Auch antworten nicht alle Server auf einen Ping.

    mfg autoBert

  • Zitat

    Kann man mit der Ping Variante auch auf gewisse Ports hin überprüfen?

    Nein, mit Ping kann man nur Hosts abfragen, also ob ein Rechner erreichbar ist oder nicht!

    Server(ports) fragt man per TCP ab, Beispiel s. unten
    Allerdings gibt es dann das Problem, dass du per Ping zwar schnell feststellen kannst, ob ein Rechner online ist, und auch im Falle eines offenen Ports eine schnelle Antwort bekommst, aber wenn der Serverdienst nicht zu erreichen ist (Port nicht offen) kann es SEHR lange (bis zu 15 Sekunden) dauern, bis du diese Nachricht erhälst!
    Erklärung siehe hier

    Script zum Testen:

    Spoiler anzeigen
    [autoit]

    Opt("TCPTimeout", 3000) ;1000 milliseconds egal welche zahl, bringt nix....

    [/autoit] [autoit][/autoit] [autoit]

    TCPStartup()
    ;ip-adressen der ftp-server oder eines erreichbaren rechners, auskommentieren zum testen
    $szIPADDRESS = "193.99.144.80" ; Heise hat dort ftp-server laufen
    ; $szIPADDRESS = "85.214.130.125" ;autoit aber schon
    $szIPADDRESS = "173.194.69.94" ;google
    ;~ $szIPADDRESS = "217.237.149.205";Timeserver RWTH Aachen

    [/autoit] [autoit][/autoit] [autoit]

    ;$szIPADDRESS = "127.0.0.1" ;intern, hier wird die adlib-funktion aufgerufen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $pingzeit = Ping($szIPADDRESS, 1000)
    If $pingzeit <> 0 Then ;wenn Rechner per ping erreichbar, dann
    MsgBox(0, "Ping auf "&$szIPADDRESS&" erfolgreich", $pingzeit)
    Else
    MsgBox(0, "Ping auf "&$szIPADDRESS&" fehlgeschlagen!", 0)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $nport = 21;ftp oder jeden anderen Port
    $mainsocket = -1 ;keine Verbindung

    [/autoit] [autoit][/autoit] [autoit]

    Global $t = TimerInit() ; timer startzeit merken
    Adlibregister("_tcp_timeout", 1000) ;"normalerweise" würde nach einer Sekunde die Funktion aufgerufen werden, auch wenn der Rechner nicht erreichbar ist, funktion
    $mainsocket = TCPConnect($szIPADDRESS, $nport) ; wenn kein server auf port 21 erreichbar ist, dann Wartezeit ca 15-20 sec, obwohl der rechner online ist
    $error=@error
    AdlibUnRegister()

    [/autoit] [autoit][/autoit] [autoit]

    $m = TimerDiff($t) ;wieviel zeit ist seit dem timerstart vergangen?
    If $mainsocket <> -1 Then ;wenn Verbindung zum FTP hergestellt, dann
    MsgBox(0, "mainsocket " & $m, "FTP-Server erreicht unter "&$mainsocket)
    Else
    MsgBox(0, $m, "FTP-Server nicht erreichbar"&@crlf&"Fehlernummer: "&$error)
    EndIf
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _tcp_timeout() ;wird nur bei internen netzverbindungen aufgerufen....
    $m = Int(TimerDiff($t)) ;wieviel zeit ist seit dem timerstart vergangen?
    If $mainsocket = -1 Then
    MsgBox(0, "adlib "& $m, "FTP-Server nicht erreichbar" & @CRLF )
    Else
    Msgbox(0,0,"Diese Nachricht sollte man normalerweise nicht sehen!")
    endif
    AdlibUnRegister()
    EndFunc ;==>_tcp_timeout

    [/autoit]

    In Zeile 20 können die Ports angegeben werden