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);
}
?>
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.
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.
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
$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;
}