Ankündigung
Einklappen
Keine Ankündigung bisher.
Baustein 19000690 Problem mit CentOS 7
Einklappen
X
-
Bei mir läuft noch alles mit CentOS6.5 und dem zugehörigen PHP 5.x (?) sehr stabil. Bisher habe ich keine Notwendigkeit für ein Update resp. Neuinstallation.
Meine PHP-Kentnisse sind nicht so gut, dass ich Unterschiede in den Versionen erkenne.
Leider habe ich Monemtan keine Zeit, mich da einzuarbeiten. Also ist der LBS erst einmal ohne Support für CentOS 7 von mir.
Sorry und Gruß
Marco
-
mars
Ok, danke für die Info.
hier angepasst der Code für CentOS7, falls Bedarf besteht.
Code:###[DEF]### [name = Jahrestage v0.6] [e#1 = Trigger #init=1] [e#2 = LogLevel #init=0] [e#3 = Datei(URL) ] [e#4 = Trennzeichen #init=:] [e#5 = Listenlänge #init=0] [a#1 = Ereignis] (Name / Bezeichnung des Ereignisses) [a#2 = Datum1] (Datum des Ereignisses als 'TT.MM.JJJJ') [a#3 = Datum2] (Datum des Ereignisses als Unix-Timestamp) [a#4 = Anz. Tage] (bis zum nächsten Jahrestag) [a#5 = Jahrestag1] (Datum des nächsten Jahrestages als 'TT.MM.JJJJ') [a#6 = Jahrestag2] (Datum des nächsten Jahrestages als Unix-Timestamp) [a#7 = Anz. Jahre] (wievielter Jahrestag) [v#1 = v0.6] (LBS-Version) ###[/DEF]### ###[HELP]### Dieser EDOMI-Logikbaustein (LBS) ermittelt aus einer Textdatei mit Ereignisbezeichnungen und zugehörigen Datumsangaben (Aufbau siehe unten) eine Liste mit Jahrestagen. Die Ausgabe erfolgt dabei so geordnet, dass die Daten des nächsten anstehenden Jahrestagen als jeweils erstes Listenenelemt ausgegeben wird. (Ich verwende dies, um mir die nächsten Geburtstage der Verwandschaft in der Visu anzuzeigen.) Die Textdatei mit den Jahrestagen wird über den Eingang E3 (URL) angegeben. Wenn die Datei auf dem Edomi-Server liegt (z.B. /usr/local/edomi/www/jahrestage.txt), ist die URL der folgende Pfad: http://<EDOMI-IP>/jahrestage.txt Die Textdatei muss für jedes Ereignis genau eine Zeile der Form '<Bezeichnung_des_Ereignisses><Trennzeichen><Datum _im_Format_TT.MM.JJJJ>' enthalten. Also Tag und Monat immer 2stellig und das Jahr 4stellig mit Punkt als Trennzeichen. Das Datum muss gültig sein (MM == 13 oder 30.02.1999 geht nicht ;-). Ab v0.5 kann das Datum auch in der Form TT.MM. (also ohne Jahr) angegeben werden. Die korrespondierenden Angaben an A3 und A7 bleiben dann leer. HINWEIS: Es sind nur positive Jahresangaben (also alles n. Chr.) zulässig, da negative Jahreszahlen intern zur Behandlung fehlender Jahresangaben genutzt werden. ab Version 0.2: Jede Zeile, die mit # beginnt (Raute als erstes Zeichen) wird als Kommentarzeile interpretiert und nicht ausgewertet. Beispieldatei (Trennzeichen ist der Doppelpunkt) Konrad Zuse (geb.): 22.06.1910 Mondlandung: 21.07.1969 Gründung KNX Association: 20.10.1990 EDOMI-Launch: 27.12.2015 E1: = !=0 = Trigger (Es empfiehlt sich ein Edomi System-KO, z.B. Trigger: Täglich 00:00:00). E2: = debug (1=true, 0=false / Bei true wird detailliert in das Individual-Log geschrieben.) E3: = url (Pfad zum Textfile mit den Ereignissen) E4: = Trennzeichen (, dass in der Datei zur Trennung von Bezeichnung und Datum verwendet wird.) E5: = Anzahl der auszugebenden Jahrestage / Länge der Listen an den Ausgängen (0=alle) A1: = Liste mit den Bezeichnungen der Ereignisse (wie in der Datei _vor_ dem Trennzeichen angegeben) A2: = Liste mit den Daten der Ereignisse als TT.MM.JJJJ (wie in der Datei _hinter_ dem Trennzeichen angegeben) A3: = Liste wie A3, jedoch als UNIX-Timestamp A4: = Liste mit Anzahl der Tage (vom aktuellen System-Datum) bis zum nächsten Jahrestag A5: = Liste mit den Daten der nächsten Jahrestage als TT.MM.JJJ A6: = Liste wie A6, jedoch als UNIX-Timestamp A7: = Liste mit Anzahl der 'wievielten' Jahrestage Hinweise: - als Listentrenner an den Ausgängen dient das Zeichen '|' (ohne Anführungszeichen, also der senkrechte Strich) - Daten ist die Mehrzahl von Datum ;-) Beispiel: Mit o.g. Beispieldatei liefert der LBS am 28.10.2016 folgende Werte an den Ausgängen: A1 = EDOMI-Launch|Konrad Zuse (geb.)|Mondlandung|Gründung KNX Association A2 = 27.12.2015|22.06.1910|21.07.1969|20.10.1990 A3 = 1451170800|-1878596372|-14173200|656377200 A4 = 60|237|266|357 A5 = 27.12.2016|22.06.2017|21.07.2017|20.10.2017 A6 = 1482793200|1498082400|1500588000|1508450400 A7 = 1|107|48|27 Changelog: v0.1 - initial Version v0.2 - Kommentarzeilen möglich (mittels vorangestelltem #) v0.3 - div. Gültigkeitsprüfungen ergänzt und Logging angepasst v0.4 - BOM gefixt, thx @starwarsfan v0.5 - Datumsangaben ohne Jahr zulässig v0.5a - Bugfix u.a. bzgl. Kommentarzeilen ###[/HELP]### ###[LBS]### <? function LB_LBSID($id) { $Version = logic_getVar($id,1); // LBS-Version $LogFileName = 'LBS19000690_Jahrestage-'.$id; // Dateiname fürs Logging if ($E=logic_getInputs($id)) { if ($E[1]['refresh']==1 && trim($E[3]['value'])!='') { if ($E[2]['value']==1) { writeToCustomLog($LogFileName,'-','LBS '.$Version.', EXEC-Teil startet mit E2 == 1 (Debug)'); } logic_callExec(LBSID,$id); }}} ?> ###[/LBS]### ###[EXEC]### <? require(dirname(__FILE__).'/../../../../main/include/php/incl_lbsexec.php'); sql_connect(); //------------------------------------------------------------------------------------- $Debug = 0; // von E2 $TxtDatei = ''; // von E3 $Trenner = ':'; // von E4 $ListLen = 0; // von E5 $ErgName = ''; // Variable zur Ausgabe an A1 (Bezeichnung / Name des Ereignisses) $ErgDatum = ''; // Variable zur Ausgabe an A2 (Datum des Ereignisses als 'TT.MM.JJJJ') $ErgDatum2 = ''; // Variable zur Ausgabe an A3 (Datum des Ereignisses als Unix-Timestamp) $AnzTage = ''; // Variable zur Ausgabe an A4 (Tage bis zum nächsten Jubiläum) $JTgDatum = ''; // Variable zur Ausgabe an A5 (Datum des nächstes Jahrestages als 'TT.MM.JJJJ') $JTgDatum2 = ''; // Variable zur Ausgabe an A6 (Datum des nächstes Jahrestages als Unix-Timestamp) $AnzJahre = ''; // Variable zur Ausgabe an A7 (wievielter Jahrestag) $LogFileName = 'LBS19000690_Jahrestage-'.$id; // Dateiname fürs Logging // LBS-Eingänge lesen und ggf. loggen if ($E=logic_getInputs($id)) { $Debug = !($E[2]['value'] == 0) ; $TxtDatei = $E[3]['value']; $Trenner = $E[4]['value']; $ListLen = $E[5]['value']; if ($Debug) { writeToCustomLog($LogFileName,'-','E3(URL) ist '.$TxtDatei); writeToCustomLog($LogFileName,'-','E4(Trennzeichen) ist '.$Trenner); writeToCustomLog($LogFileName,'-','E4(Anzahl) ist '.$ListLen); } } // Prüfen, ob die Datei gefunden wird. Ggf. wird der LBS (nach Eintrag ins LogFile) abgebrochen. $file_headers = @get_headers($TxtDatei); if (stripos($file_headers[0],'404 Not Found') >0 || (stripos($file_headers[0], '302 Found') > 0 && stripos($file_headers[7],'404 Not Found') > 0)) { if ($Debug) { writeToCustomLog($LogFileName,'-','Datei/URL nicht gefunden!'); } if ($Debug) { writeToCustomLog($LogFileName,'-','LBS Jahrestage ABGEBROCHEN'); writeToCustomLog($LogFileName,'-',' ------------------------ '); writeToCustomLog($LogFileName,'-',' '); } logic_setState($id,0); sql_disconnect(); exit(); } // Zeitzohne setzen setlocale (LC_TIME, 'de_DE'); // zeilenweise die $TxtZeilen aus der $TxtDatei einlesen $i = 0; $TxtZeilen = file($TxtDatei, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); if ($Debug) { writeToCustomLog($LogFileName,'-','Datei ist eingelesen, wird verarbeitet ...'); } // jede eingelesene Textzeile (aus der Datei) ... foreach ($TxtZeilen as $Index => $Zeile) { $Zeile = trim($Zeile," \t\n\r\0\x0B\xEF\xBB\xBF"); // Whitespaces und BOM am Anfang und Ende entfernen $ZeileOK = TRUE; // (vorläufiges) Kennzeichen, dass die Datenzeile OK ist // ggf. Eintragungen ins Logfile if ($Debug) { writeToCustomLog($LogFileName,'-',$Zeile); } // diverse Gültigkeitsprüfungen // prüfen, ob die Zeile eine Kommentarzeile ist if ($Zeile[0] == '#') { $ZeileOK = FALSE; if ($Debug) { writeToCustomLog($LogFileName,'-','... Kommentar, Zeile wird ignoriert!'); } continue; // Abbruch (und weiter mit nächster Zeile) } else { $Werte = explode($Trenner[0], $Zeile); // Zeile aus der Textdatei am Trennzeichen in (zwei) Werte teilen } // prüfen, ob genau ein Trennzeichen, d.h. genau ein Wertepaar in der Zeile vorhanden ist if ($ZeileOK &&(count($Werte) != 2)) { $ZeileOK = FALSE; if ($Debug) { writeToCustomLog($LogFileName,'-','... kein oder mehrere Trennzeichen, Zeile wird ignoriert!'); } continue; // Abbruch (und weiter mit nächster Zeile) } else { $Werte[0] = trim($Werte[0]," \t\n\r\0\x0B\xEF\xBB\xBF"); // Whitespaces und BOM am Anfang und Ende entfernen $Werte[1] = trim($Werte[1]," \t\n\r\0\x0B\xEF\xBB\xBF"); // Whitespaces und BOM am Anfang und Ende entfernen $Jahrestage[$i]['Name'] = $Werte[0]; // ... Feld 'Name' befüllen mit dem ersten Wert (also alles vor dem Trennzeichen) } // prüfen, ob das Datumsformat gültig (also TT.MM.JJJJ oder TT.MM.) ist if ($ZeileOK && (!(preg_match('/^\d\d\.\d\d\.\d\d\d\d$/', $Werte[1])||(preg_match('/^\d\d\.\d\d\.$/', $Werte[1]))))) { $ZeileOK = FALSE; if ($Debug) { writeToCustomLog($LogFileName,'-','... ungültiges Datumsformat, Zeile wird ignoriert!'); } continue; // Abbruch (und weiter mit nächster Zeile) } // prüfen, ob das Datum gültig (also z.B. nicht 30.02.xxxx oder xx.13.xxxx etc.) if ($ZeileOK) { $TempDatum = explode('.', $Werte[1]); if (preg_match('/^\d\d\.\d\d\.$/', $Werte[1])) { // Datumsangabe ohne Jahr $DatumOK = checkdate($TempDatum[1], $TempDatum[0], 2000); // Jahr 2000 ist Schaltjahr, somit ist 29.02.xxxx gültig $TempDatum[2] = -9999; // Jahr 9999 v.Chr. als Kennzeichen für "kein Jahr angegeben" } else { // Datumsangaben komplett $DatumOK = checkdate($TempDatum[1], $TempDatum[0], $TempDatum[2]); } if (!($DatumOK)) { if ($Debug) { writeToCustomLog($LogFileName,'-','... Datum ('.$Werte[1].') ist ungültig, Zeile wird ignoriert!'); } $ZeileOK = FALSE; continue; // Abbruch (und weiter mit nächster Zeile) } $Jahrestage[$i]['Tag'] = intval($TempDatum[0]); $Jahrestage[$i]['Monat'] = intval($TempDatum[1]); $Jahrestage[$i]['Jahr'] = intval($TempDatum[2]); // writeToCustomLog($LogFileName,'-','TT= '.intval($TempDatum[0]).' / MM= '.intval($TempDatum[1]).' / JJJJ= '.intval($TempDatum[2])); } // div. Gültigkeitsprüfungen abgeschlossen // Weiterverarbeitung für gültige Daten if ($ZeileOK) { // Gültigkeitsprüfung für die Zeile bestanden, dann ... $Datum = mktime(0, 0, 0, $Jahrestage[$i]['Monat'], $Jahrestage[$i]['Tag'], $Jahrestage[$i]['Jahr']); $Jahrestage[$i]['Datum'] = $Datum; // aktuelles 'Alter' des Jahrestages ermitteln und Feld 'Alter' befüllen $Jahrestage[$i]['Alter'] = date('Y') - date('Y', mktime(0, 0, 0, date('m'), date('d'), date('Y', $Datum))); // Ermitteln, wann der nächste Jahrestag (also die nächste Party ;-) anliegt, // dazu Timestamp für Tag und Monat aus Textdatei und aktuelles Jahr ... $Feiertag = mktime(0, 0, 0, date('m', $Datum), date('d', $Datum), date('Y', time())); $Jahrestage[$i]['Party'] = $Feiertag; // ... ins Feld 'Party' // dann noch prüfen, ob die diesjährige Party schon vorbei ist // dazu prüfen, ob der diesjährige Feiertag bereits vergangen ist if ($Feiertag < mktime(0, 0, 0, date('m', time()), date('d', time()), date('Y', time()))){ // dann ist die nächste Party erst im kommenden Jahr (date('Y', time())+1) $Jahrestage[$i]['Party'] = mktime(0, 0, 0, date('m', $Datum), date('d', $Datum), date('Y', time())+1); // und das 'Alter' ist schon ein Jahr mehr $Jahrestage[$i]['Alter'] = $Jahrestage[$i]['Alter'] +1; } // ermitteln, wie lange (wie viele Tage) es noch bis zur nächsten Party dauert $Dauer = ($Jahrestage[$i]['Party'] - mktime(0, 0, 0, date('m',time()), date('d',time()), date('Y',time()))); $Jahrestage[$i]['Tage'] = floor($Dauer / 86400); $i++; // Index-Zähler (zur Bearbeitung der nächsten Zeile) erhöhen ... } // div. Berechnungen bzgl. Datumsangaben abgeschlossen } // ... und weiter mit der nächsten Zeile aus der Datei // hier sind nun alle gültigen Zeilen der Datei durch und für jede Zeile sind 'Name', 'Datum', 'Alter', 'Party' und 'Tage' im array $Jahrestage if ($Debug) { writeToCustomLog($LogFileName,'-','Daten sind berechnet, Sortierung folgt ...'); } // nun die $Jahrestage nach 'Tage' sortieren, mit dem kleinsten Wert für 'Tage beginnend, also der nächste zuerst usort($Jahrestage,'cmp'); // Jahrestage sortieren (siehe http://php.net/manual/de/function.usort.php) // Ausgabe der Ergebnisse $AnzJahrestage = count($Jahrestage); // Anzahl der Jahrestage feststellen if ($Debug) { writeToCustomLog($LogFileName,'-','Daten sind sortiert, LBS-Ausgänge werden gesetzt ...'); } if ($ListLen == 0) { // wenn Listenlänge (also Wert von E4) == 0, dann ... $ListLen = $AnzJahrestage; // ... Ausgabe begrenzen auf Anzahl der Jahrestage } $i = 0; // Zähler für ausgegeben Anzahl, um ggf. vor Erreichen des Endes abzubrechen // String für Ausgaben zusammensetzen, ... for ($f=0; ($f<$AnzJahrestage && $i<$ListLen); $f++){ $ErgName = $ErgName . $Jahrestage[$f]['Name'] . '|'; $JTgDatum = $JTgDatum . date('d.m.Y',$Jahrestage[$f]['Party']) . '|'; $JTgDatum2 = $JTgDatum2 . $Jahrestage[$f]['Party'] . '|'; $AnzTage = $AnzTage . $Jahrestage[$f]['Tage'] . '|'; // ... dabei berücksichtigen, ob im Datenfile das Jahr angegeben war if ($Jahrestage[$i]['Jahr'] > 0) { $ErgDatum = $ErgDatum . date('d.m.Y',$Jahrestage[$f]['Datum']) . '|'; $ErgDatum2 = $ErgDatum2 . $Jahrestage[$f]['Datum'] . '|'; $AnzJahre = $AnzJahre . $Jahrestage[$f]['Alter'] . '|'; } else { $ErgDatum = $ErgDatum . date('d.m.',$Jahrestage[$f]['Datum']) . '|'; $ErgDatum2 = $ErgDatum2 . '|'; $AnzJahre = $AnzJahre . '|'; } $i++; } // Bereinigen (letztes Zeichen, also das '|' am Ende löschen) $ErgName = substr($ErgName, 0, -1); $ErgDatum = substr($ErgDatum, 0, -1); $ErgDatum2 = substr($ErgDatum2, 0, -1); $AnzJahre = substr($AnzJahre, 0, -1); $JTgDatum = substr($JTgDatum, 0, -1); $JTgDatum2 = substr($JTgDatum2, 0, -1); $AnzTage = substr($AnzTage, 0, -1); // LBS-Ausgänge setzten logic_setOutput($id, 1, $ErgName); //$ErgName an A1 logic_setOutput($id, 2, $ErgDatum); //$ErgDatum an A2 logic_setOutput($id, 3, $ErgDatum2); //$ErgDatum2 an A3 logic_setOutput($id, 4, $AnzTage); //$AnzTage an A4 logic_setOutput($id, 5, $JTgDatum); //$JTgDatum an A5 logic_setOutput($id, 6, $JTgDatum2); //$JTgDatum2 an A6 logic_setOutput($id, 7, $AnzJahre); //$AnzJahre an A7 if ($Debug) { writeToCustomLog($LogFileName,'-','Ausgänge mit '.$ListLen.' Datensätzen beschrieben ...'); } logic_setState($id,0); //------------------------------------------------------------------------------------- sql_disconnect(); if ($Debug) { writeToCustomLog($LogFileName,'-','... LBS normal beendet'); writeToCustomLog($LogFileName,'-',' '); } // Sortierfunktion von hier: http://php.net/manual/de/function.usort.php function cmp($a, $b) { if ($a['Tage'] == $b['Tage']) { return 0; } return ($a['Tage'] < $b['Tage']) ? -1 : 1; } ?> ###[/EXEC]###
...and I thought my jokes were bad!
- Likes 1
Kommentar
Kommentar