"Scannen" des Netzwerkes per Code

Hallo Leute,

ich bin neu hier und habe schon sehr viele nette Hilfe erfahren. Deswegen möchte ich hier und dort - im Rahmen meines Wissensstandes - etwas „zurückgeben“. Auch hier habe ich Wissen aus diesem Forum - dazu gehören auch wichtige Funktionen des nachfolgenden Codes - neu zusammengewürfelt.
Das Skript scannt alle fünf Minuten (Zeit ist aber änderbar) das lokale Netzwerk und prüft, welche Rechner noch online sind. Sind einige nicht mehr am Netz können danach z.B. der Fileserver runtergefahren oder der Netzwerkdrucker ausgeschaltet werden (z.B. per FS20).
Hier mal der Code:

<?
// $PC[x][0] = Name der angezeigten Variable
// $PC[x][1] = IP-Adresse des zu prüfenden PC
// $PC[x][2] = Relevanz für File-Server oder z.B. Netzwerkdrucker -> wenn alle als relevant erklärten Rechner von Netz sind, kann der Server heruntergefahren werden

// Hier alle zu prüfenden Rechner eintragen
$PC[0][0] = "PC Joachim"; $PC[0][1] = "192.168.178.20"; $PC[0][2] = True;
$PC[1][0] = "PC Dennis"; $PC[1][1] = "192.168.178.21"; $PC[1][2] = True;
$PC[2][0] = "HTPC"; $PC[2][1] = "192.168.178.37"; $PC[2][2] = True;
// usw....

$FileServer = False;

$parentID = IPS_GetObject($IPS_SELF);
$parentID = $parentID['ParentID'];

for ($i = 0; $i < count($PC); $i++)
{
	//Prüfen aller oben angegeben Rechner im internen Netzwerk
	$AktuellerPCStatus = Sys_Ping($PC[$i][1], 1000);
	SetValueBoolean(CreateVariableByName($parentID, $PC[$i][0], 0, '~Switch'), $AktuellerPCStatus);
	// Hier wird geprüft, ob mindestes einer der relevanten Rechner online ist, der Fileserver bleibt dann eingeschaltet
	If(($PC[$i][2] == True) and ($AktuellerPCStatus == True))
	{
	$FileServer = true;
	}
}

// Hier wird der der umsetzbare Fileserver-Status in die (manuell zu erstellende!) Variable geschrieben
SetValueBoolean(31656 /*[Sonstige Daten\Netzwerk-Daten\Netzwerk-Daten\FileServer erforderlich]*/ , $FileServer);

// Setzen des Timers
IPS_SetScriptTimer($IPS_SELF, 5*60);

function CreateVariableByName($id, $name, $type, $profile = "")
{
   global $IPS_SELF;
   $vid = @IPS_GetVariableIDByName($name, $id);
   if($vid === false)
   {
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetIcon($vid, "Information");
		IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
      if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
   }
return $vid;
    }

?>

Wenn dann z.B. der FileServer (bei mir FreeNAS) eigentlich nicht mehr benötigt wird, kann er per Script heruntergefahren werden. (Hochgefahren kann er dann auch per Skript oder besser: per WakeOnLan im Autostart des jeweiligen Rechners)

<?

if($IPS_SENDER == "TimerEvent")
{
//Timer ausschalten
IPS_SetScriptTimer($IPS_SELF, 0);
//Server herunterfahren
IPS_LogMessage(IPS_GetName($IPS_SELF), "Der FileServer wird heruntergefahren");
//http://Benutzername:Passwort@192.168.178.32/exec_raw.php?cmd=shutdown%20-p%20now
$Datei = fopen ("http://Benutzername:Passwort@192.168.178.32/exec_raw.php?cmd=shutdown%20-p%20now", "r");
}
else
{
	If (GetValueBoolean(31656 /*[Sonstige Daten\Netzwerk-Daten\Netzwerk-Daten\FileServer erforderlich]*/ ) == false)
	{
	//Timer anschalten
	IPS_SetScriptTimer($IPS_SELF, 15 * 60);
	
	IPS_LogMessage(IPS_GetName($IPS_SELF), "Der Timer für die FileServer-Nachlaufzeit wurde gestartet");
	}
	Else
	{
	//Timer ausschalten
	IPS_SetScriptTimer($IPS_SELF, 0);
	
	IPS_LogMessage(IPS_GetName($IPS_SELF), "Der Timer für die FileServer-Nachlaufzeit wurde zurückgesetzt");
	}
}


?>

Damit der Server nicht gleich heruntergefahren wird, weil ein Rechner neu gestartet wird, habe ich eine „Sicherheitszeit“ von 15 min angebaut.

Der Profi wird da wahrscheinlich müde lächeln, aber vielleicht ist es ja etwas für andere Anfänger (wie mich).:wink:

Joachim