LightsOut: WHS wach halten auch wenn alle Clients schlafen

Bitte posted hier eure Ideen, damit unsere Entwickler sehen was die Community wünscht.
erikzwo
Foren-Einsteiger
Beiträge: 24
Registriert: 27. Mär 2008, 11:00

LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von erikzwo »

Ich habe jetzt schon mehrfach den Wunsch gehört und auch selbst geäußert, daß LightsOut eine oder mehrere Möglichkeiten erhält, um den Server wach zu halten, auch wenn keiner der "normalen" WHS-Clients wach ist: Nachdem ich nicht mehr länger auf eine Erweiterung von LightsOut durch Martin warten wollte, habe ich mir selbst mal Gedanken zu dem Thema gemacht. Folgendes ist herausgekommen:

LightsOut bietet von sich aus keine Schnittstelle an, mit der man es mit Informationen versorgen kann (z.B. "bitte wach bleiben"). Also muß ich LightsOut einfach solange deaktivieren und somit daran hindern, herunterzufahren. Sobald das "bitte wach bleiben" nicht mehr nötig ist, reaktiviere ich LightsOut einfach wieder, und es kann wieder sein energiesparendes Werk verrichten.

Dazu habe ich mir ein Skript gebastelt, welches selbstständig eine Liste von IPs überwacht. In diese Liste trage ich die IPs der Geräte ein, die den Server benötigen (das ist bei mir vor allem mein MP3-Streaming-Client).
  • Falls eine der IPs aus der Liste auf Ping antwortet, so deaktiviert mein Skript den LightsoutClientService auf dem Server. Damit kann LightsOut den Server nicht mehr schlafenlegen.
  • Falls keine IP aus der Liste auf den Ping antwortet, so aktiviert das Skript den Service wieder, und beim nächsten normalen Polling (bei mir in den LightsOut-Einstellungen auf 10 Min. eingestellt) geht der Server brav in Hibernation.
Das Skript wird alle 8 Minuten aufgerufen und loggt alle Ausgaben in eine Textdatei.

Funktioniert bei mir jetzt schon seit einigen Wochen problemlos in Verbindung mit einem Netgear Streaming-Client mit einer festen IP-Adresse. Was hier mit Hilfe von IP-Adressen implementiert ist, könnte sehr leicht auf das Vorhandensein bestimmter Dateien auf einem USB-Stick umgebaut werden. Aber vielleicht ist das ja auch gar nicht mehr notwendig, wenn ihr eurem Musik-Player o.ä. eine feste IP zuweist und diese in die untenstehende ips.txt hineinschreibt.

Folgendes braucht ihr dazu:
  • Die Windows PowerShell 1.0 - bei Microsoft herunterladen und auf dem Server installieren. (EDIT: Nach der Installation von Powershell muss noch die Scriptausführungsrichtlinie auf RemoteSigned gesetzt werden: Eingabe von "Set-ExecutionPolicy RemoteSigned" in der Shell-Eingabeaufforderung.)
  • Ein Skript namens c:\scripts\ipwatchdog\ipwatchdog.ps1 mit folgendem Inhalt:

    Code: Alles auswählen

    # LightsOut-IP-Watchdog
    #
    # Überwacht weitere IP-Adressen mittels Ping, ob sie noch online sind.
    # Falls ja, wird der LightsOutService gestoppt, damit er den WHS nicht
    # herunterfährt.
    # Falls keine der IPs mehr online ist, wird der LightsOutService wieder gestartet.
    
    #
    # Dies ist ein Script für Windows PowerShell 1.0
    # geschrieben 2008 von erikzwo für http://forum.home-server-blog.de/
    # inspiriert von <http://powershellcommunity.org/Forums/tabid/54/forumid/1/tpage/1/view/Topic/postid/182/Default.aspx>
    # 
    
    Param($list = $(Throw "List is required"),[switch]$Verbose)
    
    function Ping-Server {
       Param([string]$server)
       $pingresult = Get-WmiObject win32_pingstatus -f "address='$Server'"
       if($pingresult.statuscode -eq 0) {$true} else {$false}
    }
    
    if($Verbose){$VerbosePreference  = "Continue"}
    
    Write-Verbose "############"
    Get-Date
    Get-Service "LoService"
    
    $status = "undefined"
    
    foreach($server in (get-Content $list))
    {
        $x = 1
        Write-Verbose "Processing IP: $server `r"
        for($i=0;$i -lt 4;$i++)
        {
            Write-Verbose "  Ping Count $i `r"
            $result = Ping-Server $Server
            if(!$result)
            {
                Write-Verbose "  Ping failed for $x times `r"
                $x++
                sleep 2
                if($x -gt 4)
                {
                    # der Gesamtstatus darf nur auf down gesetzt werden, wenn bisher noch keine "ups" zu vermelden waren.
                    if($status -eq "undefined")
                    {
                        Write-Verbose "  Ergebnis: IP $Server ist down `r"
                        $Status = "down"
                    }
                }
            }
            else
            {
                if($status.$Server -ne "up")
                {
                    Write-Verbose "  Ergebnis: IP $Server ist up `r"
                    $Status = "up"
                }
            }
        }
    }
    if($status -eq "down")
    {
        Write-Verbose "Alle zu ueberwachenden IPs sind down. Schalte LightsOutService (wieder) ein. `r"
        Start-Service –displayname "Lights Out Service"
    
    }
    elseif($status -eq "up")
    {
        Write-Verbose "Eine oder mehrere IPs sind up. Schalte LightsOutService aus. `r"
        Stop-Service –displayname "Lights Out Service"
    
    }
    else
    {
        Write-Verbose "Fehler - Status wurde nicht umgesetzt! `r"
    }
    sleep 3
    
  • Ein Skript mit Namen c:\scripts\ipwatchdog\startwatchdog.bat

    Code: Alles auswählen

    @echo off
    start /min c:\scripts\ipwatchdog\startwatchdog2.bat
    
  • Ein Skript mit Namen c:\scripts\ipwatchdog\startwatchdog2.bat (Achtung! das Skript besteht insgesamt aus zwei Zeilen! Die Zeile mit dem powershell.exe ist wirklich so lang)

    Code: Alles auswählen

    powershell.exe -noprofile -noninteractive -command "c:\scripts\ipwatchdog\ipwatchdog.ps1 -list c:\scripts\ipwatchdog\ips.txt -verbose" 1>> c:\scripts\ipwatchdog\ipwatchdog.log
    exit
    
  • Eine Datei c:\scripts\ipwatchdog\ips.txt, welche die zu überwachenden IP-Adressen enthält, jede in einer neuen Zeile:

    Code: Alles auswählen

    192.168.x.y
    192.168.x.z
    
  • Einen Eintrag im Windows Task Scheduler, welcher das Skript c:\scripts\ipwatchdog\startwatchdog.bat alle 8 Minuten startet. (In der Systemsteuerung: Geplante Tasks, Task hinzufügen - oder so ähnlich, ich habe hier nur ein englisches Windows)
Diese Dateien wie gesagt alle in das selbe Verzeichnis packen und durch einen Klick auf ipwatchdog.ps1 ausprobieren. Falls die IP aktiv ist, sollte danach der LightsOut-Service deaktiviert sein...

Viel Erfolg, und lasst mich wissen, wie es läuft.

gruß,
erik.

PS. mein verschachtelter Aufruf von zwei .bat-Dateien über den Task Scheduler ist nicht sonderlich elegant. Ich wollte aber vermeiden, daß ständig im Vordergrund ein Fenster aufpoppt und so lange stehen bleibt, bis das Skript durchgelaufen ist (das hat mich insgesamt die meiste Zeit an der ganzen Sache gekostet!). Wenn ihr wisst, wie man mit dem Task Scheduler direkt minimierte Fenster aufrufen kann, so würde mich das brennend interessieren!
Zuletzt geändert von erikzwo am 26. Nov 2008, 17:09, insgesamt 1-mal geändert.
masterLxR
Foren-Einsteiger
Beiträge: 2
Registriert: 7. Nov 2008, 12:22

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von masterLxR »

Hallo Erik,

funktioniert Bestens vielen Dank.
Habe eine Squeezebox und LightsOut hat mir immer den Server runtergefahren :-( Aber nun durch das Script ist vorbei.
Kleiner Hinweis noch :
Nach der Insatallation von Powershell musste noch die Scriptausführungsrichtlinie auf
RemoteSigned gesetzt werden damit es bei mir funktionierte:

Set-ExecutionPolicy RemoteSigned

(RemoteSigned (Remote signiert) – Heruntergeladene Skripts müssen von einem vertrauenswürdigen Autor signiert werden, bevor sie ausgeführt werden können. Lokale Scripte werden ohne Rückfrage ausgeführt.)

Gruß
Christian
erikzwo
Foren-Einsteiger
Beiträge: 24
Registriert: 27. Mär 2008, 11:00

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von erikzwo »

Du hast natürlich vollkommen Recht, danke für diesen Hinweis. Darüber bin ich bei meiner Erstinstallation der PowerShell auch gestolpert. Werde es oben noch ergänzen.

gruß,
erik.
BartSimpson
Foren-Einsteiger
Beiträge: 14
Registriert: 30. Apr 2008, 08:23

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von BartSimpson »

Hallo Erik,

vielen Dank für dein pfiffiges Skript. Hat auf Anhieb funktioniert. Ich war so frei und habe es für mich leicht modifiziert, indem jetzt auch auf das Vorhandensein einer Datei geprüft wird. Damit kann ich leichter vom meinem Rechner (der ständig läuft) steuern, dass der WHS anbleiben soll.

Danke noch mal und Gruß
BartSimpson
jmk
Foren-Einsteiger
Beiträge: 15
Registriert: 18. Nov 2008, 21:32

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von jmk »

Ich war so frei, und hab Eriks sehr gute Anregung genommen, und daraus ein AutoHotkey-Skript geschrieben. Der Vorteil für mich war, dass ich die Skriptsprache etwas besser kenne, und sie mir erlaubt, ein Skript in eine .exe zu wandeln. Außerdem läuft es komplett im Hintergrund ab.

AutoHotKey könnt ihr hier finden: http://de.autohotkey.com/
Es reicht, wenn ihr es auf dem Client installiert, dann könnt ihr aus dem Skript eine .exe für den WHS zu machen. Wenn gewünscht, kann ich auch die .exe posten …

UPDATE-2009-10-26: Eine exe kann mn am einfachsten mit dem Programm "Ahk2Exe.exe" machen. Das wird bei der Installation mit installiert und liegt dann im Programmordner im Unterordner "Compiler"

Freu mich über Euer Feedback,
jmk

KeepAlive.ahk

Code: Alles auswählen

IniRead, IPs, settings.ini, General, IPs, 192.168.1.23
IniRead, PROCESS, settings.ini, General, PROCESS, LoService
IniRead, P_STATES, settings.ini, General, P_STATES, "4  RUNNING"
IniRead, IP_CHECK_COUNTS, settings.ini, General, IP_CHECK_COUNTS, 1
IniRead, VERBOSITY, settings.ini, General, VERBOSITY, 0

ProcessStatus = -1
ClientOnline = -1

StringSplit, P_STATE_AR, P_STATES, `;, "
StringSplit, IP_AR, IPs, `;, "

Loop, %IP_AR0%
{
	IP := IP_AR%A_Index%
	RunWait, ping -n %IP_CHECK_COUNTS% %IP%,,Hide UseErrorLevel
	If ErrorLevel
		ClientOnline = 0
	else
	{
		ClientOnline = 1
		break
	}
}

PStateTest(P_STATE_AR0, ProcessStatus, PROCESS)

If (ClientOnline == 1) && (ProcessStatus == 4)
{
	RunWait, sc stop "%PROCESS%",,Hide UseErrorLevel
	If ErrorLevel
		IfGreaterOrEqual, VERBOSITY, 3, FileAppend, %A_Now%`tPosition=0010`tErrorLevel=%ErrorLevel%`n, ErrorLog.txt
	Sleep, 1000
	Loop,
	{
		If (A_Index == 10)
		{
			IfGreaterOrEqual, VERBOSITY, 3, FileAppend, %A_Now%`tPosition=0020`tStoppen geht nicht`n, ErrorLog.txt
			exit
		}
		PStateTest(P_STATE_AR0, ProcessStatus, PROCESS)
		If (ProcessStatus == 1)
		{
			IfGreaterOrEqual, VERBOSITY, 1, FileAppend, %A_Now%`tPosition=0030`tErfolgreich gestoppt`n, ErrorLog.txt
			exit
		}
		else
			continue
	}
}
	
else If (ClientOnline == 0) && (ProcessStatus == 1)
{
	RunWait, sc start "%PROCESS%",,Hide UseErrorLevel
	If ErrorLevel
		IfGreaterOrEqual, VERBOSITY, 3, FileAppend, %A_Now%`tPosition=0040`tErrorLevel=%ErrorLevel%`n, ErrorLog.txt
		
	Sleep, 1000
	Loop,
	{
		If (A_Index == 10)
		{
			IfGreaterOrEqual, VERBOSITY, 3, FileAppend, %A_Now%`tPosition=0050`tStarten will nicht`n, ErrorLog.txt
			exit
		}
		PStateTest(P_STATE_AR0, ProcessStatus, PROCESS)
		If (ProcessStatus == 4)
		{
			IfGreaterOrEqual, VERBOSITY, 1, FileAppend, %A_Now%`tPosition=0060`tErfolgreich gestartet`n, ErrorLog.txt
			exit
		}
		else
			continue
	}
}
else
	IfGreaterOrEqual, VERBOSITY, 2, FileAppend, %A_Now%`tPosition=0070`tClientOnline=%ClientOnline%`, ProcessStatus=%ProcessStatus%`n, ErrorLog.txt

exit

PStateTest(ByRef P_STATE_AR0, ByRef ProcessStatus, PROCESS)
{

	Loop,%P_STATE_AR0%
	{
		P_STATE := P_STATE_AR%A_Index%
		RunWait, %comspec% /c sc query "%PROCESS%" | Find "%P_STATE%",,Hide UseErrorLevel
		If ErrorLevel
			continue
		else
		{
			ProcessStatus = %A_Index%
			break
		}
	}

}
settings.ini

Code: Alles auswählen

[General]
IPs = 192.168.1.23
PROCESS = LoService
P_STATES = 1  STOPPED; 2  START_PENDING; 3  STOP_PENDING; 4  RUNNING; FAILED

IP_CHECK_COUNTS = 1
VERBOSITY = 0
UPDATE-2009-10-26: zur Erklärung, alle Konfigurationsoptionen hab ich in die ini ausgelagert, so dass nichts am ahk-Quellcode geändert werden muss.
  • IPs -> mit Semikolon (;) getrennte Liste der IP-Adressen
  • IP_CHECK_COUNTS -> wenn ihr ein etwas unzuverlässiges Netzwerk habt, in dem ein PING auch schon mal verloren geht, das setzt diese Variable höher
  • VERBOSITY -> die "Geschwätzigkeit" des Programms, je größer die Zahl, desto mehr steht in der Log-Datei "ErrorLog.txt"
UPDATE-2009-10-26: seit dem ich das Programm hier gepostet habe (also bald ein Jahr), läuft es ununterbrochen und anstandslos auf meinem WHS.
Zuletzt geändert von jmk am 26. Okt 2009, 18:46, insgesamt 1-mal geändert.
StilgarBF
Foren-Einsteiger
Beiträge: 18
Registriert: 16. Jan 2008, 21:29

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von StilgarBF »

Hi,

die Geschichte mit den Überwachten Ips ist ganz nett, geht aber noch nicht weit genug - manchmal würde ich gern z.b. wegen eines Downloads den Server laufen lassen. - Da käme die Sache mit dem USB-Stick ins Spiel.
Kann das Script so erweitert werden, dass es auf einem bestimmten Laufwerk nach einer festgelegten Datei sucht und bei Vorhandensein den Server am Laufen hält? - Vielleicht auch mit Prüfung in Festgelegtem Interval, so dass man den Stick dann wieder abziehen kann.
- das wäre dann die ultimative Lösung! ;)

Stil
erikzwo
Foren-Einsteiger
Beiträge: 24
Registriert: 27. Mär 2008, 11:00

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von erikzwo »

@All,

es freut mich, daß meine Überlegungen so guten Anklang gefunden haben.

Sicherlich lässt sich da im Detail noch vieles verbessern - daher möchte ich euch einladen, eure Verbesserungen hier zu posten, so wie jmk es schon gemacht hat (sieht interessant aus, habe es aber noch nicht ausprobiert). BartSimpson, was du beschreibst (abprüfen auf das Vorhandensein einer bestimmten Datei) scheint doch genau das zu sein, was StilgarBF gerne hätte, oder? Also wenn du deine Erweiterung noch zur Verfügung stellen könntest, wäre das klasse.

gruß,
erik.
BartSimpson
Foren-Einsteiger
Beiträge: 14
Registriert: 30. Apr 2008, 08:23

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von BartSimpson »

Hallo StilgarBF,

anbei meine persönlichen Skriptanpassungen. Neben den IP-Adressen in der Datei ips.txt prüft das Skript jetzt auch die in files.txt angegebenen Dateien. Solange die angegebenen Dateien gefunden werden, wird der WHS nicht ausgeschaltet. Die Dateien werden zusammen mit den IP-Adressen in einem Durchgang geprüft.

Hier die neue Version des Skriptes c:\scripts\ipwatchdog\ipwatchdog.ps1:

Code: Alles auswählen

    # LightsOut-IP-Watchdog
    #
    # Überwacht weitere IP-Adressen mittels Ping, ob sie noch online sind.
    # Falls ja, wird der LightsOutService gestoppt, damit er den WHS nicht
    # herunterfährt.
    # Falls keine der IPs mehr online ist, wird der LightsOutService wieder gestartet.
	# Es kann auch geprüft werden, ob bestimmte Dateien vorhanden sind. Wenn ja,
	# wird der LightsOutService auch gestoppt.

    #
    # Dies ist ein Script für Windows PowerShell 1.0
    # geschrieben 2008 von erikzwo für http://forum.home-server-blog.de/
    # inspiriert von <http://powershellcommunity.org/Forums/tabid/54/forumid/1/tpage/1/view/Topic/postid/182/Default.aspx>
    #
	# Erweitert von BartSimpson (Dank an erikzwo).
	# Es kann jetzt zusätzlich geprüft werden, ob Dateien existieren
	#

    Param($list = $(Throw "List is required"),$list2 = $(Throw "List2 is required"),[switch]$Verbose)

    function Ping-Server {
       Param([string]$server)
       $pingresult = Get-WmiObject win32_pingstatus -f "address='$Server'"
       if($pingresult.statuscode -eq 0) {$true} else {$false}
    }

	function CheckIfFileExists {
       Param([string]$file)
       $testresult = Test-Path $file
       if($testresult -match "True") {$true} else {$false}
	}
	
    if($Verbose){$VerbosePreference  = "Continue"}

    Write-Verbose "############"
    Get-Date
    Get-Service "LoService"

    $status = "undefined"

    foreach($server in (get-Content $list))
    {
        $x = 1
        Write-Verbose "Processing IP: $server `r"
        for($i=0;$i -lt 4;$i++)
        {
            Write-Verbose "  Ping Count $i `r"
            $result = Ping-Server $Server
            if(!$result)
            {
                Write-Verbose "  Ping failed for $x times `r"
                $x++
                sleep 2
                if($x -gt 4)
                {
                    # der Gesamtstatus darf nur auf down gesetzt werden, wenn bisher noch keine "ups" zu vermelden waren.
                    if($status -eq "undefined")
                    {
                        Write-Verbose "  Ergebnis: IP $Server ist down `r"
                        $Status = "down"
                    }
                }
            }
            else
            {
                if($status.$Server -ne "up")
                {
                    Write-Verbose "  Ergebnis: IP $Server ist up `r"
                    $Status = "up"
                }
            }
        }
    }
	
    foreach($File in (get-Content $list2))
	{
        Write-Verbose "Processing File: $file `r"
        $result = CheckIfFileExists $File
        if(!$result)
        {
            Write-Verbose "  Ergebnis: Datei $File ist nicht vorhanden `r"
            $Status = "down"
		}
		else
		{
            Write-Verbose "  Ergebnis: Datei $File ist vorhanden `r"
            $Status = "up"
		}
	}
	
    if($status -eq "down")
    {
        Write-Verbose "Alle zu ueberwachenden IPs sind down bzw. die zu ueberwachenden Dateien sind nicht vorhanden. Schalte LightsOutService (wieder) ein. `r"
        Start-Service –displayname "Lights Out Service"

    }
    elseif($status -eq "up")
    {
        Write-Verbose "Eine oder mehrere IPs sind up bzw. eine oder mehrere zu ueberwachenden Dateien sind vorhanden. Schalte LightsOutService aus. `r"
        Stop-Service –displayname "Lights Out Service"

    }
    else
    {
        Write-Verbose "Fehler - Status wurde nicht umgesetzt! `r"
    }
    sleep 3
Die Datei c:\scripts\ipwatchdog\startwatchdog2.bat musste ich auch anpassen, da eine weitere Datei (die mit den Dateinamen) ins Spiel kommt:

Code: Alles auswählen

    powershell.exe -noprofile -noninteractive -command "c:\scripts\ipwatchdog\ipwatchdog.ps1 -list c:\scripts\ipwatchdog\ips.txt -list2 c:\scripts\ipwatchdog\files.txt -verbose" 1>> c:\scripts\ipwatchdog\ipwatchdog.log
    exit
Und dann noch die neue Datei c:\scripts\ipwatchdog\files.txt, in der die Dateien stehen, die geprüft/überwacht werden. Die könnte z.B. so ausschauen:

Code: Alles auswählen

D:\shares\Software\IPWatchDog\WHSStatus.on
Z:\WHSStatus.on
Bei mir läuft das ganz absolut reibungslos. USB-Stick rein, und der WHS macht nicht mehr das Licht aus.

Gruß
BartSimpson
Benutzeravatar
Buwser
Foren-Einsteiger
Beiträge: 36
Registriert: 2. Jan 2009, 19:50

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von Buwser »

Hallo an alle!

Ich beobachte schon sehr lange dieses Board und habe mir auch sehr viele nützliche Infos und Ideen geholt.

Aber heute ich ein großes Problem, ich habe ebenfalls wie viele andere LightsOut drauf und habe es nach dieser Anleitung erweitert.

Folgendes:

Wach halten per USB-Stick funktioniert einwandfrei!
Wach halten per IP-Abfrage funktioniert nicht!!!

Habe mal den Log mit reingemacht:
AUSFšHRLICH: ############

Freitag, 2. Januar 2009 20:03:48

Status : Stopped
Name : LoService
DisplayName : Lights Out Service

AUSFšHRLICH: Processing IP: 192.168.1.108
AUSFšHRLICH: Ping Count 0
AUSFšHRLICH: Ergebnis: IP 192.168.1.108 ist up
AUSFšHRLICH: Ping Count 1
AUSFšHRLICH: Ergebnis: IP 192.168.1.108 ist up
AUSFšHRLICH: Ping Count 2
AUSFšHRLICH: Ergebnis: IP 192.168.1.108 ist up
AUSFšHRLICH: Ping Count 3
AUSFšHRLICH: Ergebnis: IP 192.168.1.108 ist up
AUSFšHRLICH: Processing IP: 192.168.1.31
AUSFšHRLICH: Ping Count 0
AUSFšHRLICH: Ergebnis: IP 192.168.1.31 ist up
AUSFšHRLICH: Ping Count 1
AUSFšHRLICH: Ergebnis: IP 192.168.1.31 ist up
AUSFšHRLICH: Ping Count 2
AUSFšHRLICH: Ergebnis: IP 192.168.1.31 ist up
AUSFšHRLICH: Ping Count 3
AUSFšHRLICH: Ergebnis: IP 192.168.1.31 ist up
AUSFšHRLICH: Processing File: D:\shares\Software\IPWatchDog\WHSStatus.on
AUSFšHRLICH: Ergebnis: Datei D:\shares\Software\IPWatchDog\WHSStatus.on ist
nicht vorhanden
AUSFšHRLICH: Processing File: G:\WHSStatus.on
AUSFšHRLICH: Ergebnis: Datei G:\WHSStatus.on ist nicht vorhanden
AUSFšHRLICH: Alle zu ueberwachenden IPs sind down bzw. die zu ueberwachenden
Dateien sind nicht vorhanden. Schalte LightsOutService (wieder) ein.
Die erste IP ist Meine Dreambox und die Zweite zu Testzwecken mein eigener Rechner.


Hoffe ihr könnt mir Helfen.

Gruß
Buwser
Benutzeravatar
Buwser
Foren-Einsteiger
Beiträge: 36
Registriert: 2. Jan 2009, 19:50

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von Buwser »

Hallo ????????????



Keiner da!


Buwser
BartSimpson
Foren-Einsteiger
Beiträge: 14
Registriert: 30. Apr 2008, 08:23

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von BartSimpson »

Hi,

da hat sich wohl bei meinen Modifikationen ein Fehler eingeschlichen. Sorry.
Hier ein Update für c:\scripts\ipwatchdog\ipwatchdog.ps1

Code: Alles auswählen

    # LightsOut-IP-Watchdog
    #
    # Überwacht weitere IP-Adressen mittels Ping, ob sie noch online sind.
    # Falls ja, wird der LightsOutService gestoppt, damit er den WHS nicht
    # herunterfährt.
    # Falls keine der IPs mehr online ist, wird der LightsOutService wieder gestartet.
	# Es kann auch geprüft werden, ob bestimmte Dateien vorhanden sind. Wenn ja,
	# wird der LightsOutService auch gestoppt.

    #
    # Dies ist ein Script für Windows PowerShell 1.0
    # geschrieben 2008 von erikzwo für http://forum.home-server-blog.de/
    # inspiriert von <http://powershellcommunity.org/Forums/tabid/54/forumid/1/tpage/1/view/Topic/postid/182/Default.aspx>
    #
	# Erweitert von BartSimpson (Dank an erikzwo).
	# Es kann jetzt zusätzlich geprüft werden, ob Dateien existieren
	#

    Param($list = $(Throw "List is required"),$list2 = $(Throw "List2 is required"),[switch]$Verbose)

    function Ping-Server {
       Param([string]$server)
       $pingresult = Get-WmiObject win32_pingstatus -f "address='$Server'"
       if($pingresult.statuscode -eq 0) {$true} else {$false}
    }

	function CheckIfFileExists {
       Param([string]$file)
       $testresult = Test-Path $file
       if($testresult -match "True") {$true} else {$false}
	}
	
    if($Verbose){$VerbosePreference  = "Continue"}

    Write-Verbose "############"
    Get-Date
    Get-Service "LoService"

    $status = "undefined"

    foreach($server in (get-Content $list))
    {
        $x = 1
        Write-Verbose "Processing IP: $server `r"
        for($i=0;$i -lt 4;$i++)
        {
            Write-Verbose "  Ping Count $i `r"
            $result = Ping-Server $Server
            if(!$result)
            {
                Write-Verbose "  Ping failed for $x times `r"
                $x++
                sleep 2
                if($x -gt 4)
                {
                    # der Gesamtstatus darf nur auf down gesetzt werden, wenn bisher noch keine "ups" zu vermelden waren.
                    if($status -eq "undefined")
                    {
                        Write-Verbose "  Ergebnis: IP $Server ist down `r"
                        $Status = "down"
                    }
                }
            }
            else
            {
                if($status.$Server -ne "up")
                {
                    Write-Verbose "  Ergebnis: IP $Server ist up `r"
                    $Status = "up"
                }
            }
        }
    }
	
    foreach($File in (get-Content $list2))
	{
        Write-Verbose "Processing File: $file `r"
        $result = CheckIfFileExists $File
        if(!$result)
        {
            # der Gesamtstatus darf nur auf down gesetzt werden, wenn bisher noch keine "ups" zu vermelden waren.
            if($status -ne "up")
			{
				Write-Verbose "  Ergebnis: Datei $File ist nicht vorhanden `r"
				$status = "down"
			}
		}
		else
		{
			Write-Verbose "  Ergebnis: Datei $File ist vorhanden `r"
			$status = "up"
		}
	}
	
    if($status -eq "down")
    {
        Write-Verbose "Alle zu ueberwachenden IPs sind down bzw. die zu ueberwachenden Dateien sind nicht vorhanden. Schalte LightsOutService (wieder) ein. `r"
        Start-Service –displayname "Lights Out Service"

    }
    elseif($status -eq "up")
    {
        Write-Verbose "Eine oder mehrere IPs sind up bzw. eine oder mehrere zu ueberwachenden Dateien sind vorhanden. Schalte LightsOutService aus. `r"
        Stop-Service –displayname "Lights Out Service"

    }
    else
    {
        Write-Verbose "Fehler - Status wurde nicht umgesetzt! `r"
    }
    sleep 3

Gruß
Dirk_Platt
Foren-Einsteiger
Beiträge: 9
Registriert: 5. Jan 2009, 20:23

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von Dirk_Platt »

Hallo

die Idee mit dem POwershell Script ist prima ... aber für meine XBOX360 leider nicht so einsetzbar, da diese partout nicht auf einen Ping antwortet.
Allerdings kann man durch Aufrufen der Webseite http://<XBOX-IP-HIER>:1026 ihr eine XML-Seite mit dem folgenden Inhalt entlocken:

Code: Alles auswählen

<?xml version="1.0"?><root xmlns="urn:schemas-upnp-org:device-1-0" xmlns:ms=" urn:microsoft-com:wmc-1-0" xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0">
  <specVersion>
    <major>1</major>
    <minor>0</minor>
  </specVersion>
  <device ms:X_MS_SupportsWMDRM="true">
    <deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
    <manufacturer>Microsoft Corporation</manufacturer>
    <manufacturerURL>http://www.microsoft.com/</manufacturerURL>
    <modelName>Xbox 360</modelName>
    <modelNumber></modelNumber>
    <modelDescription>Xbox 360</modelDescription>
    <modelURL>http://www.xbox.com/</modelURL>
    <friendlyName>Xbox 360</friendlyName>
    <microsoft:X_DeviceCaps>4754</microsoft:X_DeviceCaps>
    <microsoft:HandshakeFlags>1</microsoft:HandshakeFlags>
    <serialNumber>XXXXXXXXXXXX</serialNumber>
    <UDN>YYYYYYYYYYYYYYYYYYYYYYYY</UDN>
    <serviceList>
      <service>
        <serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
        <serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>
        <SCPDURL>/Content/RenderingControl</SCPDURL>
        <controlURL>/Control/RenderingControl</controlURL>
        <eventSubURL>/Event/RenderingControl</eventSubURL>
      </service>
      <service>
        <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
        <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
        <SCPDURL>/Content/ConnectionManager</SCPDURL>
        <controlURL>/Control/ConnectionManager</controlURL>
        <eventSubURL>/Event/ConnectionManager</eventSubURL>
      </service>
    </serviceList>
    <iconList>
      <icon><mimetype>image/png</mimetype><width>48</width><height>48</height><depth>32</depth><url>/xbox360.png</url></icon>
    </iconList>
  </device>
</root>
Ich kenne die Skriptsprache der Powershell nicht genug ... aber wäre das vielleicht eine Basis, um den On-/Offline Status einer XBOX360 zu checken?

Gruß, Dirk
Dirk_Platt
Foren-Einsteiger
Beiträge: 9
Registriert: 5. Jan 2009, 20:23

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von Dirk_Platt »

ich habe mich selbst einmal daran gemacht, auf Basis des http-requests an die XBOX360 (s.o.) eine Lösung auszuarbeiten. Dabei verwende ich folgendes Minimal-Script:

Code: Alles auswählen

$ie = new-object -com "InternetExplorer.Application"
$ie.navigate("http://<IP der XBOX360>:1026")
While($ie.Busy){}
$res = $true
if($ie.document.mimeType -eq $null){
  $res = $false
}
$ie.quit
if($res){
  Stop-Service –displayname "Lights Out Service"
} else {
  Start-Service –displayname "Lights Out Service"
}
$ie wird als COM-Objekt instantiiert und anschliessend mit der navigate Methode die URL zum Prüfen abgeschickt ... wenn die While($ie.Busy){} schleife durch ist, steht im document Attribut das zurückgelieferte Dokument ... wenn keine Seite zurückgeliefert wurde ist dessen mimeType-Attribut offenbar $null. Und daran mache ich fest, ob auf die URL etwas zurückkam oder nicht.

Diese Lösung funktioniert zwar, ist aber natürlich recht minimalistisch (fest einkodierte URL, es wird nur eine URL geprüft) ... für mich reicht das, da ich nur genau eine XBOX360 und sonst kein anderes Device prüfen möchte.

Wenn aber jemand fitter in der powershell-sprache ist und die obige Lösung für IP-Abfragen so erweitern könnte, daß entweder IP-Adressen in der Eingabedatei oder aber URLs nach meinem Verfahren geprüft werden könnten, wäre die Lösung noch ein Stück flexibler :)

Gruß, Dirk
erikzwo
Foren-Einsteiger
Beiträge: 24
Registriert: 27. Mär 2008, 11:00

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von erikzwo »

Urks, du startest den IE als COM-Objekt, um das Vorhandensein einer Webseite zu überprüfen? Das scheint mir ziemlich ressourcen-intensiv zu sein - das müsste doch auch einfacher gehen...

(... einige Minuten Suchen...)

Ich bin ja auch absolut kein PowerShell-Experte, aber schau mal hier:

http://en.wikipedia.org/wiki/Powershell#Examples

Folgendes Beispiel lädt einen RSS-Feed herunter:

Code: Alles auswählen

PS> $rssUrl = "http://blogs.msdn.com/powershell/rss.aspx"
PS> $blog = [xml](new-object System.Net.WebClient).DownloadString($rssUrl)
PS> $blog.rss.channel.item | select title -first 8
Schätze mal, du musst in deinem Fall lediglich überprüfen, ob $blog leer ist oder nicht, und davon den Zustand des LightsOut-Services abhängig machen. Habe hier auf der Maschine leider keine PowerShell und auch keinen WHS in der Nähe, so daß ich da momentan nicht in die Tiefe gehen kann.

Wäre klasse, wenn du "unser" PowerShell-Skript entsprechend erweitern könntest, damit auch das Abfragen einer konfigurierbaren Webseite zum Wachhalten des Servers verwendet werden kann. :)

Viel Erfolg,
erik.
Dirk_Platt
Foren-Einsteiger
Beiträge: 9
Registriert: 5. Jan 2009, 20:23

Re: LightsOut: WHS wach halten auch wenn alle Clients schlafen

Beitrag von Dirk_Platt »

erikzwo hat geschrieben:Urks, du startest den IE als COM-Objekt, um das Vorhandensein einer Webseite zu überprüfen? Das scheint mir ziemlich ressourcen-intensiv zu sein - das müsste doch auch einfacher gehen...
Stimmt schon ... aber die instanz wird mit $ie.quit ja auch wieder beendet ... und der Aufruf des $ie hat für mich zunächst den Vorteil gehabt, daß ich dem einfach eine beliebige URL vorwerfen kann, und mich nicht darauf beschränken muß, daß da eine XML zurückkommt. ich werde Deinen Vorschlag aber natürlich ausprobieren :) Ob ich zur Zeit Die Muße finde, das ganze in das originale Script mit reinzukriegen, kann ich leider nicht versprechen ... aber vielleicht findet sich ja ein Leidensgenosse mit XBOX und einem IP-Client, der das übernimmt :D

Ich versuche es, habe aber leider im moment auch nicht oft Zeit.

Gruß, Dirk

Nachtrag: habe Deinen Vorschlag grad mal in der Powershell probiert ... im Online Zustand steht in $blog.root.device.modelName "Xbox 360" drin ... allerdings steigt der Aufruf im Offline zustand der Box mit einer Exception aus ... das muss ich mich wohl erstmal mit Exception handling beschäftigen :) ...
Antworten