IP-Symcon Update-Check

Hallo zusammen,

um bei einer IP-Symcon-Installation, die zumeist einfach nur durchläuft und bei der ich mich nur Phasenweise näher mit der Konsole oder gar dem Forum beschäftige, die Weiterentwicklung nicht völlig aus den Augen zu verlieren, habe ich einen kleinen Update-Check gebaut. Dieser zwitschert mir zu, wenn laut Forum eine neuere Version als die installierte offiziell verfügbar ist.

Ich lasse es wöchentlich einmal laufen.

Vielleicht hilft es dem ein oder anderen.


<?
	// IP-Symcon Update-Check
	// Ver. 1.0 
	// 04-JUL-2010 by moishe

	$output='';

	function DoTwitter($output){
	   include_once('twitter/twitter.class.php');
		static $userName="twitteruser";
		static $password="twitterpassword";
		$twitter = new Twitter($userName, $password);
		// um die encoding-Problemchen mit twitter pragmatisch zu umschiffen:
		$output=str_replace("ä","ae",$output);
		$output=str_replace("ö","oe",$output);
		$output=str_replace("ü","ue",$output);
		$output=str_replace("Ä","Ae",$output);
		$output=str_replace("Ö","Oe",$output);
		$output=str_replace("Ü","Ue",$output);
		$output=str_replace("ß","ss",$output);
		print $output;
		$twitter->send($output);
   }


   // create curl resource
	$ch = curl_init();
	// set url
	$url="www.ip-symcon.de/forum/";
	curl_setopt($ch, CURLOPT_URL, $url);
	//return the transfer as a string
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	// $output contains the output string
	$html = curl_exec($ch);
	// close curl resource to free up system resources
	curl_close($ch);
	
	// find Version string:
	$pattern = '/Version\S+(\d+)\.(\d+)\s+\S\d+, (\d+\.\d+\.\d+)/';
	if( preg_match($pattern, $html, $matches, PREG_OFFSET_CAPTURE) ){
		$amaj=$matches[1][0];
		$amin=$matches[2][0];
		$amin = trim($amin, "0");  // remove any trailing zeros on minor version
		$adate=$matches[3][0];
		print_r("Version ".$amaj.".".$amin." has been available since ".$adate.".
");
	}else{
		$output=date('H').":".date('i')." Update-Check could not obtain version available information from ".$url.".";
		DoTwitter($output);
	   print_r($output.".
");
	   exit(1);
	}

	$ver = IPS_GetKernelVersion();  // liefert z.B.: "2.00"
	$pattern = '/(\d+)\.(\d+)/';
	if( preg_match($pattern, $ver, $matches, PREG_OFFSET_CAPTURE) ){
		$imaj=$matches[1][0];
		$imin=$matches[2][0];
		$imin = trim($imin, "0");  // remove any trailing zeros on minor version
		print_r("Version ".$imaj.".".$imin." is installed.
");
	}else{
		$output=date('H').":".date('i')." Update-Check could not parse output of IPS_GetKernelVersion().";
		DoTwitter($output);
	   print_r($output.".
");
	}
	
	if( $imaj == $amaj && $imin == $amin ){
	   print_r("The installation is current.
");
	}else{
	   print_r("You might consider an update.
");
		$output=date('H').":".date('i')." IP-Symcon V.".$amaj.".".$amin." available since ".$adate.". V.".$imaj.".".$imin." installed.";
		DoTwitter($output);
	}

?>

Hallo moishe,

wenn ich das Skript richtig verstehe, dann:

  • muss man ein Twitter-Konto dazu haben?
  • findet ein Versionsvergleich nur für „die Zahl hinter dem Komma statt“? (also nicht das was hinter dem „#“ kommt?)

Kann man per Skript überhaupt die ganz genaue Version herausfinden? (also das was über „IPS_GetKernelVersion“ hinausgeht?)

Joachim


echo IPS_GetLiveUpdateVersion();

Hallo Thomas,

vielen Dank für Deine Antwort. Das beantwortet ja schon mal eine der Fragen…:slight_smile:

Joachim

Und die aktuelle Version einfach per Parser von http://www.ip-symcon.de/forum/ holen.
Einstellung im Anhang.:wink:

Hallo Thomas,

abermals Dank, sieht klasse aus! :wink:

Joachim

Zum eigentlichen Abfragen der Version ist natürlich kein Twitter-Konto notwendig.

In dem Beispiel verwende ich aber eines, um mich auf neue Updates aufmerksam zu machen. Man könnte das auch per E-Mail, SMS oder Hastenichgeshehn machen.

Bei den Versionskennungen beachte ich nur Ziffern direkt vor und hinter einem einzigen Punkt, wobei Nuller in der Dezimalen für den korrekten Vergleich entfernt werden.

Falls sich das Format ändert, muss die Auswertung entsprechend angepasst werden.

Hallo moishe,

ich habe es jetzt mit den Hinweisen von Thomas so gelöst:

  • für die aktuell auf meinem Rechner installierte IPS-Version (es wird ausgeführt nach dem IPS-Start):
$Teile = explode(",",IPS_GetLiveUpdateVersion());
SetValueString(20034 /*[Server\IPS-Server\IPS-Software-Version]*/ ,  (double)IPS_GetKernelVersion()."".$Teile[1].", ".$Teile[0]);

  • für die aktuell verfügbare Version (es muss in Abständen ausgeführt werden):
$Antwort = http_get("http://www.ip-symcon.de/forum/");
$AntwortArray = get_mark($Antwort, '>Version *</a></div>');
$AktuelleVersion = $AntwortArray[0];
SetValueString (13040 /*[Server\IPS-Server\IPS-Software-Update]*/ , $AktuelleVersion);

return;


// Diese Funktion trennt die relevanten Bereiche aus dem Ausschnitt heraus $string ist dabei der zu durchsuchende Gesamtstring,
// in $Mark sind durch "*" getrennt der Beginn des zu suchenden Strings und das Ende des zu suchende Abschnittes. Beispiel für den Text "<div>*</div></li>"
function get_mark($string,$mark)
{
    $ausgabe = array();
    $template = explode("*",$mark);
    $mark = $template[0];
    $end = $template[1];
    $string = strstr($string,$mark);

    $temp = explode($mark,$string);
    $a = 1;
        foreach ($temp as $tempx)
                    {
                    $tempx = explode($end,$tempx);
                    $tempx = $tempx[0];
                    if ($tempx)
                            {
                            array_push ($ausgabe,$tempx);
                            }
                    }
    return $ausgabe;
}

Die Umstellung der Strings sorgt dafür, dass sie beide das gleiche Format haben (aktuell „2.3 #1799, 07.11.10“), damit wären sie sogar vergleichbar und man könnte sich bei Unterscheidung eine Kurzmitteilung, eine Mail oder eine Benachrichtung via Prowl senden lassen (Liste erhebt keinen Anspruch auf Vollständigkeit!;))
Alternativ könnte man aber auch nur die Veränderung der letzte Variable dazu nutzen.

Joachim

Hallo, ist dieses Script noch verwendbar??
Bekomme immer die Fehlermeldung:

Fatal error: Call to undefined function http_get() in C:\IP-Symcon\scripts\58754.ips.php on line 3
PHP-Error-Error: Call to undefined function http_get() Error in Script C:\IP-Symcon\scripts\58754.ips.php on Line 3Abort Processing during Fatal-Error: Call to undefined function http_get() Error in Script C:\IP-Symcon\scripts\58754.ips.php on Line 3

Danke für die Info…

…ist ja schon ein bißchen älter der Beitrag…

Inzwischen sieht es so aus:

$Antwort = Sys_GetURLContent ("http://www.ip-symcon.de/forum/");
$AntwortArray = StringZerlegung($Antwort, '>Version *</a>');
$AktuelleVersion = $AntwortArray[0];
//echo $AktuelleVersion;
SetValueString (13040 /*[Server\Server\IPS-Server\IPS-Software-Update]*/ , $AktuelleVersion);

Return;

// Diese Funktion trennt die relevanten Bereiche aus dem Ausschnitt heraus $string ist dabei der zu durchsuchende Gesamtstring,
// in $Mark sind durch "*" getrennt der Beginn des zu suchenden Strings und das Ende des zu suchende Abschnittes. Beispiel für den Text "<div>*</div></li>"
function StringZerlegung($string,$mark)
{
    $ausgabe = array();
    $template = explode("*",$mark);
    $mark = $template[0];
    $end = $template[1];
    $string = strstr($string,$mark);

    $temp = explode($mark,$string);
    $a = 1;
        foreach ($temp as $tempx)
                    {
                    $tempx = explode($end,$tempx);
                    $tempx = $tempx[0];
                    if ($tempx)
                            {
                            array_push ($ausgabe,$tempx);
                            }
                    }
    return $ausgabe;
}

Joachim

Hallo zusammen,

ich möchte mir darüber hinaus auch gerne die aktuelle Beta Version von der Live Seite holen. Dazu muss man aber angemeldet sein. Geht das irgendwie?

Viele Grüße

Burkhard

Gehen sicherlich, aber praktisch wird es eher schwierig, da du ja den ganzen Anmeldeprozess nachbauen musst.

paresy

Schade, hatte gehofft, es geht einfach;)

Gruß

Burkhard