Commit 546ba2e5113880d78e2b226ab40e2aa7449d79e6

Authored by Georg Hopp
1 parent d4082eed

--no commit message

  1 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2 + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1 3 <html>
2 4 <head>
3 5 <title>Meine ersten Ajax Erfahrungen</title>
... ... @@ -27,11 +29,10 @@
27 29 german_field.value = translation.german;
28 30 french_field.value = translation.french.val1;
29 31 }
30   - break;
  32 + return true;
31 33
32 34 default:
33 35 return false;
34   - break;
35 36 }
36 37 }
37 38
... ...
  1 +<?
  2 +//-------------------------------------------
  3 +//
  4 +// ocs_user_add - last update 2006-10-23
  5 +//
  6 +// based on:
  7 +//
  8 +// Adressupdate - last update wgi 2006-05-23
  9 +//
  10 +//-------------------------------------------
  11 +
  12 +header("Content-Type: text/html; charset=UTF-8");
  13 +$basepath="/data/www/localhost/htdocs/inc";
  14 +
  15 +
  16 +include "$basepath/mkhead.php";
  17 +
  18 +
  19 +function load_users ()
  20 +{
  21 + $localFile = "/var/www/localhost/htdocs/osc_user_add/xfer/web-useradd";
  22 +
  23 + exec ("scp webuseradd@vam-osc5:/etc/web-useradd ".$localFile." 2>&1",
  24 + $out, $ret);
  25 +
  26 + if ($ret != 0)
  27 + {
  28 + print "scp returns: ".$ret."<BR>\n";
  29 + print "Output was:<BR><PRE>\n";
  30 +
  31 + print_r ($out);
  32 +
  33 + print "</PRE>\n";
  34 + }
  35 + else
  36 + {
  37 + $fh = fopen ($localFile, "r");
  38 +
  39 + $line = fgets ($fh);
  40 + while (! feof ($fh))
  41 + {
  42 + $buf = explode (":", trim ($line));
  43 + if ($buf[1] == "")
  44 + $buf[1] = "no-change";
  45 + if ($buf[4] != "delete")
  46 + $users[$buf[0]] = array ($buf[1], $buf[2], $buf[3], $buf[4]);
  47 +
  48 + $line = fgets ($fh);
  49 + }
  50 +
  51 + fclose ($fh);
  52 + }
  53 +
  54 + exec ("scp webuseradd@vam-osc6:/etc/web-useradd ".$localFile." 2>&1",
  55 + $out, $ret);
  56 +
  57 + if ($ret != 0)
  58 + {
  59 + print "scp returns: ".$ret."<BR>\n";
  60 + print "Output was:<BR><PRE>\n";
  61 +
  62 + print_r ($out);
  63 +
  64 + print "</PRE>\n";
  65 + }
  66 + else
  67 + {
  68 + $fh = fopen ($localFile, "r");
  69 +
  70 + $line = fgets ($fh);
  71 + while (! feof ($fh))
  72 + {
  73 + $buf = explode (":", trim ($line));
  74 + if ($buf[1] == "")
  75 + if ($users[$buf[0]] && $users[$buf[0]][0] != "")
  76 + $buf[1] = $users[$buf[0]][0];
  77 + else
  78 + $buf[1] = "no-change";
  79 + if ($buf[4] != "delete")
  80 + $users[$buf[0]] = array ($buf[1], $buf[2], $buf[3], $buf[4]);
  81 +
  82 + $line = fgets ($fh);
  83 + }
  84 +
  85 + fclose ($fh);
  86 + }
  87 +
  88 + exec ("rm ".$localFile." 2>&1", $out, $ret);
  89 +
  90 + return $users;
  91 +}
  92 +
  93 +function load_cats ()
  94 +{
  95 + /*
  96 + * OK, ich hole dir verfügbaren Rubriken anhand der existierenden
  97 + * Verzeichniss unter /vol1/www/bhi_upload. Will man also eine
  98 + * Rubrik hinzufügen, so muß man dort nur das Verzeichnis anlegen.
  99 + */
  100 + exec ("ssh -l webuseradd vam-osc5 ".
  101 + "\"ls -p /vol1/www/bhi_upload | sed '/\/$/p;d'\" ".
  102 + "2>/dev/null",
  103 + $out, $ret);
  104 +
  105 + foreach ($out as $key=>$line)
  106 + $out[$key] = preg_replace ("/^(.*)\/$/", "\\1", $line);
  107 +
  108 + return $out;
  109 + /* return array ("kfz", "immo", "trauer"); */
  110 +}
  111 +
  112 +function update_users ($users)
  113 +{
  114 + $fh = fopen ("/tmp/web-useradd", "w");
  115 +
  116 + foreach ($users as $key => $value)
  117 + {
  118 + fputs ($fh, $key.":".$value[0].":".$value[1].":".
  119 + $value[2].":".$value[3]."\n");
  120 + }
  121 +
  122 + fclose ($fh);
  123 +
  124 + exec ("scp /tmp/web-useradd webuseradd@vam-osc5:/etc/web-useradd 2>&1",
  125 + $out, $ret);
  126 +
  127 + if ($ret != 0)
  128 + {
  129 + print "scp to vam-osc5 returns: ".$ret."<BR>\n";
  130 + print "Output was:<BR><PRE>\n";
  131 +
  132 + print_r ($out);
  133 +
  134 + print "</PRE>\n";
  135 + }
  136 +
  137 + exec ("scp /tmp/web-useradd webuseradd@vam-osc6:/etc/web-useradd 2>&1",
  138 + $out, $ret);
  139 +
  140 + if ($ret != 0)
  141 + {
  142 + print "scp to vam-osc6 returns: ".$ret."<BR>\n";
  143 + print "Output was:<BR><PRE>\n";
  144 +
  145 + print_r ($out);
  146 +
  147 + print "</PRE>\n";
  148 + }
  149 +
  150 + exec ("rm /tmp/web-useradd 2>&1", $out, $ret);
  151 +}
  152 +
  153 +
  154 +function show_users ($users)
  155 +{
  156 + print "<H1>User auf vam-osc5 und vam-osc6</H1>\n";
  157 +
  158 + if ($_SESSION['editable'] == TRUE)
  159 + {
  160 + print "<A href=\"".$SCRIPT_NAME."?action=add\">";
  161 + print "Benutzer hinzufügen</A>";
  162 + }
  163 + else
  164 + {
  165 + print "<A href=\"".$SCRIPT_NAME."?action=startedit\">";
  166 + print "Benutzer bearbeiten</A>";
  167 + }
  168 +
  169 + print "<TABLE border=\"0\">";
  170 +
  171 + $rownum = 0;
  172 +
  173 + if (isset ($users))
  174 + {
  175 + foreach ($users as $name => $data)
  176 + {
  177 + if (($rownum % 2) != 0)
  178 + {
  179 + $bg="#EEEEEE"; // leight
  180 + }
  181 + else
  182 + {
  183 + $bg="#CCCCCC"; // dark
  184 + }
  185 +
  186 + $tdStyle = "";
  187 + $delText = "l&ouml;schen";
  188 +
  189 + if ($data[3] == "delete")
  190 + {
  191 + $tdStyle = "style=\"text-decoration: line-through;\"";
  192 + $delText = "nicht l&ouml;schen";
  193 + }
  194 +
  195 + print "<TR><TD width=70 bgcolor=".$bg." ".$tdStyle.">".$name."</TD>";
  196 + print "<TD width=150 bgcolor=".$bg." ".$tdStyle.">".$data[1]."</TD>";
  197 + print "<TD width=50 bgcolor=".$bg." ".$tdStyle.">".$data[2]."</TD>";
  198 + if ($_SESSION['editable'] == TRUE)
  199 + {
  200 + if ($data[3] != "delete")
  201 + {
  202 + print "<TD><A href=\"";
  203 + print $SCRIPT_NAME."?action=edit&name=".$name."\">";
  204 + print "bearbeiten</A></TD>";
  205 + print "<TD><A href=\"";
  206 + }
  207 + else
  208 + print "<TD colspan=2><A href=\"";
  209 + print $SCRIPT_NAME."?action=delete&name=".$name."\">";
  210 + print $delText."</A></TD>";
  211 + }
  212 + print "</TR>\n";
  213 +
  214 + $rownum ++;
  215 + }
  216 + }
  217 +
  218 + if ($_SESSION['editable'] == TRUE)
  219 + {
  220 + print "<TR><TD colspan=\"3\">";
  221 + print "<A href=\"".$SCRIPT_NAME."?action=update\">abschicken</A>";
  222 + print "&nbsp;<A href=\"".$SCRIPT_NAME."?action=abort\">abbrechen</A>";
  223 + print "</TD></TR>";
  224 + }
  225 + print "</TABLE>\n";
  226 +}
  227 +
  228 +function edit_user ($users, $cats, $name)
  229 +{
  230 + print "<FORM action=\"".$SCRIPT_NAME."?".strip_tags (SID)."\">";
  231 + print "<INPUT type=\"HIDDEN\" name=\"action\" value=\"set\">";
  232 + print "<INPUT type=\"HIDDEN\" name=\"oldpass\" value=\"".$users[$name][0]."\">";
  233 + print "<TABLE border=\"0\">";
  234 + print "<TR><TD>Username: </TD>";
  235 + print "<TD width=\"300\">";
  236 +
  237 + if (! isset ($name))
  238 + {
  239 + print "<INPUT type=\"text\" name=\"name\" value=\"".$name."\"></TD>";
  240 + }
  241 + else
  242 + {
  243 + print "<INPUT type=\"hidden\" name=\"name\" value=\"".$name."\">";
  244 + print $name."</TD>";
  245 + }
  246 +
  247 + print "</TR>\n";
  248 + print "<TR><TD>Rubrik: </TD>";
  249 + print "<TD width=\"300\">";
  250 + print "<SELECT name=\"cat\" size=\"1\">";
  251 +
  252 + foreach ($cats as $cat)
  253 + {
  254 + print "<OPTION";
  255 + if ($users[$name][2] == $cat)
  256 + print " SELECTED>";
  257 + else
  258 + print ">";
  259 +
  260 + print $cat."</OPTION>";
  261 + }
  262 +
  263 + print "</SELECT>";
  264 + print "</TD>";
  265 + print "</TR>\n";
  266 + print "<TR><TD>Vollst&auml;ndiger Name: </TD>";
  267 + print "<TD width=\"300\">";
  268 + print "<INPUT type=\"text\" name=\"full\" value=\"".$users[$name][1]."\">";
  269 + print "</TD>";
  270 + print "</TR>\n";
  271 + print "<TR><TD>Passwort: </TD>";
  272 + print "<TD width=\"300\">";
  273 + print "<INPUT type=\"password\" name=\"pass\" value=\"".$users[$name][0]."\">";
  274 + print "</TD>";
  275 + print "</TR>\n";
  276 + print "<TR><TD colspan=\"2\" align=\"right\">";
  277 + print "<A href=\"".$SCRIPT_NAME."?action=show\">abbrechen</A>";
  278 + print "&nbsp;<INPUT type=\"submit\" value=\"abschicken\">";
  279 + print "</TABLE>\n";
  280 + print "</FORM>";
  281 +}
  282 +
  283 +/*
  284 + * gibt FALSE zurück falls kein Lock gesetzt werden konnte, ansonsten die
  285 + * aktuelle lockid. Diese wird bei free_lock benötigt um den lock wieder
  286 + * freizugeben.
  287 + * Folgende Fälle können eintreten:
  288 + * 1. Das Lockfile enthält keine Daten und myId ist leer.
  289 + * Das bedeutet: es existiert keine Sperre auf die Daten und wir hatten
  290 + * bisher keine Sperre auf die Daten.
  291 + * Daraufhin wird eine neue lock-id generiert und zusammen mit dem
  292 + * aktuellen Timestamp in das lockfile gegeben. Die generierte lock-id
  293 + * wird zurückgegeben.
  294 + * 2. Das Lockfile enthält eine Sperre und myId ist leer.
  295 + * Das bedeutet: es existiert eine Sperre auf die Daten, die nicht von
  296 + * dieser PHP session generiert wurde.
  297 + * 2 Faelle:
  298 + * (lockTime + 300) >= time (): Die Sperre ist nicht abgelaufen => es
  299 + * kann keine neue Sperre angelegt werden.
  300 + * (lockTime + 300) < time (): Die Sperre ist abgelaufen => neue lock-id
  301 + * generieren, in Datei eintragen und
  302 + * zurückgeben.
  303 + * 3. Das Lockfile enthält eine Sperre und myId != lockId.
  304 + * Das bedeutet: In der aktuellen PHP session wurde erfolgreich eine
  305 + * Sperre erzeugt, die aber aufgrund dessen das ein timeout
  306 + * eingetreten ist (d.h. in der aktuellen Session wurde länger
  307 + * als 5 Minuten auf keinen link mehr geklickt.) nicht mehr
  308 + * gültig war und in der zwischenzeit hat jemand anderes
  309 + * daher eine neue Sperre auf die Daten eingerichtet siehe 2.
  310 + * folgende Fälle:
  311 + * die 2 Unterfälle von 2.
  312 + * 4. Das Lockfile enthält keine Daten, aber myId ist nicht leer.
  313 + * Das bedeutet: In der aktuellen PHP session wurde ein lock eingerichtet.
  314 + * Der Timeout verstrich und jemand anderes hat änderungen
  315 + * an den Daten vorgenommen. Konsequenz: Die Daten in dieser
  316 + * PHP session sind nicht mehr aktuell.
  317 + * Da der aktuelle Lock daher komplett ungültig geworden ist wird nichts
  318 + * in die Datei eingetragen und eine leere lock-id zurückgegeben.
  319 + * An anderer Stelle (check_lock) werden anhand der Information das myId
  320 + * nich leer war, aber die zurückgegebene id leer ist alle anderen Daten
  321 + * neu initialisiert.
  322 + * 5. Das Lockfile enthält eine Sperre und myId == lockId.
  323 + * Das bedeutet: Innerhalb dieser PHP session wurde eine Sperre eingerichtet
  324 + * die auch weiterhin gültig ist.
  325 + * Die lockTime wird in der Datei aktualisiert und lockId zurückgegeben.
  326 + */
  327 +function get_lock ($lockFile, $myId)
  328 +{
  329 + $newId = "";
  330 +
  331 + $lockFd = fopen ($lockFile, "a+");
  332 + if ($lockFd != FALSE)
  333 + {
  334 + if (flock ($lockFd, LOCK_EX) != FALSE)
  335 + {
  336 + rewind ($lockFd);
  337 + $lockEntry = explode ('/', trim (fgets ($lockFd)));
  338 + $lockId = $lockEntry[0];
  339 + $lockTime = $lockEntry[1];
  340 +
  341 + if ($lockId == $myId ||
  342 + /* lockTime nur pruefen wenn Sie in der Datei stand */
  343 + ($lockTime != "" && ($lockTime + 300) < time ()))
  344 + {
  345 + ftruncate ($lockFd, 0);
  346 + if ($lockId != "" && $lockId == $myId)
  347 + $newId = $myId;
  348 + else
  349 + $newId = uniqid ();
  350 + fputs ($lockFd, $newId."/".time ()."\n");
  351 + }
  352 +
  353 + fclose ($lockFd);
  354 + }
  355 + }
  356 +
  357 + return $newId;
  358 +}
  359 +
  360 +function free_lock ($lockFile, $lockId)
  361 +{
  362 + $lockFd = fopen ($lockFile, "r+");
  363 + if ($lockFd != FALSE)
  364 + {
  365 + if (flock ($lockFd, LOCK_EX) != FALSE)
  366 + {
  367 + $lockEntry = explode ('/', trim (fgets ($lockFd)));
  368 + $oldId = $lockEntry[0];
  369 +
  370 + if ($lockId == $oldId)
  371 + ftruncate ($lockFd, 0);
  372 +
  373 + fclose ($lockFd);
  374 + }
  375 + }
  376 +}
  377 +
  378 +function check_lock ($lockFile, $lockId)
  379 +{
  380 + if ($_SESSION['editable'] == TRUE)
  381 + {
  382 + $gotId = get_lock ($lockFile, $lockId);
  383 +
  384 + if ($gotId == FALSE)
  385 + {
  386 + if ($lockId == FALSE)
  387 + {
  388 + print "<TABLE BGCOLOR=\"yellow\"><TR><TD>Konnte keine Sperre zum ";
  389 + print "bearbeiten der Benutzerdaten anlegen. Jemand anderes ";
  390 + print "bearbeitet die Daten bereits. Bitte versuchen Sie es in ein ";
  391 + print "paar Minuten noch einmal.</TD></TR></TABLE>";
  392 + }
  393 + else
  394 + {
  395 + print "<TABLE BGCOLOR=\"yellow\"><TR><TD>Ihre Sperre ist ";
  396 + print "ung&uuml;ltig. Vermutlich haben Sie l&auml;nger als f&uuml;nf ";
  397 + print "Minuten keine Modifikationen vorgenommen und jemand ";
  398 + print "anderes bearbeitet jetzt Benutzerdaten. Leider sind ihre ";
  399 + print "bisherigen &Auml;nderungen dadurch ung&uuml;ltig geworden. ";
  400 + print "Bitte versuchen Sie es in ein paar Minuten noch einmal.";
  401 + print "</TD></TR></TABLE>";
  402 + }
  403 + }
  404 +
  405 + return $gotId;
  406 + }
  407 +
  408 + return "";
  409 +}
  410 +
  411 +
  412 +
  413 +
  414 +$_action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'load';
  415 +
  416 +session_start ();
  417 +
  418 +$_SESSION['lockFile'] =
  419 + '/var/www/localhost/htdocs/osc_user_add/webuseradd.lck';
  420 +
  421 +mkhead ("Benutzer auf vam-osc5 und vam-osc6 anlegen ...",
  422 + "bar-edvtools",
  423 + "Benutzertool vam-osc5 und vam-osc6");
  424 +
  425 +if ($_action == "load" || $_action == "startedit")
  426 +{
  427 + session_unregister ("users");
  428 + session_unregister ("cats");
  429 +}
  430 +
  431 +if (! isset ($_SESSION['users']))
  432 + $_SESSION['users'] = load_users ();
  433 +
  434 +if (! isset ($_SESSION['cats']))
  435 + $_SESSION['cats'] = load_cats ();
  436 +
  437 +if (! isset ($_SESSION['editable']))
  438 + $_SESSION['editable'] = FALSE;
  439 +
  440 +if ($_action == 'startedit')
  441 + $_SESSION['editable'] = TRUE;
  442 +
  443 +$_SESSION['lockId'] = check_lock ($_SESSION['lockFile'], $_SESSION['lockId']);
  444 +if ($_SESSION['lockId'] == FALSE)
  445 +{
  446 + $_SESSION['editable'] = FALSE;
  447 +
  448 + show_users ($_SESSION['users']);
  449 +}
  450 +else
  451 +{
  452 + switch ($_action)
  453 + {
  454 + case 'edit':
  455 + edit_user ($_SESSION['users'], $_SESSION['cats'], $_REQUEST['name']);
  456 + break;
  457 + case 'set':
  458 + $pass = $_REQUEST['pass']=="no-change"?$_REQUEST['pass']:
  459 + $_REQUEST['oldpass']==$_REQUEST['pass']?$_REQUEST['pass']:
  460 + crypt ($_REQUEST['pass'], $_REQUEST['name']);
  461 +
  462 + $_SESSION['users'][$_REQUEST['name']] =
  463 + array ($pass,
  464 + $_REQUEST['full'],
  465 + $_REQUEST['cat'],
  466 + time ());
  467 + show_users ($_SESSION['users']);
  468 + break;
  469 + case 'update':
  470 + update_users ($_SESSION['users']);
  471 + print "<TABLE><TR><TD bgcolor=\"yellow\">Daten wurden aktualisiert. ";
  472 + print "Es kann einige Minuten dauern bis das System die ";
  473 + print "&Auml;nderung &uuml;bernimmt.</TD></TR></TABLE>\n";
  474 + case 'abort':
  475 + free_lock ($_SESSION['lockFile'], $_SESSION['lockId']);
  476 + $_SESSION['lockId'] = "";
  477 + $_SESSION['editable'] = FALSE;
  478 + show_users ($_SESSION['users']);
  479 + break;
  480 + case 'add':
  481 + edit_user ($_SESSION['users'], $_SESSION['cats'], $_REQUEST['name']);
  482 + break;
  483 + case 'delete':
  484 + if ($_SESSION['users'][$_REQUEST['name']][3] != "delete")
  485 + $_SESSION['users'][$_REQUEST['name']][3] = "delete";
  486 + else
  487 + $_SESSION['users'][$_REQUEST['name']][3] = time ();
  488 + show_users ($_SESSION['users']);
  489 + break;
  490 + case 'show':
  491 + default:
  492 + show_users ($_SESSION['users']);
  493 + }
  494 +}
  495 +?>
  496 +</td>
  497 +</tr>
  498 +<tr>
  499 +</tr>
  500 +</table>
  501 +<PRE>
  502 +</PRE>
  503 +</body>
  504 +</html>
... ...
  1 +<?php
  2 +
  3 +/**
  4 + * Mit der Funktion printCachedPage kann ein Script/Modul seinen dynamisch
  5 + * erzeugten HTML-Inhalt cachen und als statisches HTML einbinden. Die
  6 + * erzeugten HTML-Dateien liegen unter CACHEDIR/<subclientid>/<script-path>/
  7 + * <scriptname>?md5(<request-parameter-liste>).html
  8 + *
  9 + * Es wird für jede Seite und jeden Request-Parameter-Kombination, der in
  10 + * $allowed_req_params angegeben ist, eine Seite im Cache angelegt.
  11 + *
  12 + * Parameter:
  13 + * - $auto_update: erzeugt bei Scriptaufruf eine neue Cache-Datei, wenn:
  14 + * a) die Cachedatei älter ist als die Scriptdatei oder
  15 + * b) die Cachedatei älter ist als eine per include/require eingebunden
  16 + * Scriptdatei
  17 + * - $update_interval: eine Erneuerung der Cachedatei wird vorgenommen, wenn
  18 + * die Cachedatei älter als $update_interval ist.
  19 + * - $script-file: das Script, dessen Inhalt gecached werden soll, i.d.R
  20 + * __FILE__
  21 + * - $allowed_req_params: Liste der erlaubten Request-Parameter, dient zur
  22 + * Bildung des Cachedateinamens
  23 + * - $debug: erzeugt Debug-Ausgaben
  24 + *
  25 + * Die Einbindung in ein Script erfolgt nach Einbindung per include/require
  26 + * der zusätzlich erforderlichen Bibliothen mit:
  27 + *
  28 + * if (printCachedPage($auto_update,$update_interval,__FILE__))
  29 + * return;
  30 + *
  31 + * Der mit printCachedPage erzeugte HTML-Bereich wird mit HTML-Kommentaren
  32 + * umrandet und kann so im Gesamt-Quelltext identifiziert werden.
  33 + */
  34 +
  35 +define ('MAX_CACHE_WAIT_SECS',1);
  36 +
  37 +function printCachedPage (
  38 + $script_file,
  39 + $auto_update = true,
  40 + $update_interval = 86400,
  41 + $allowed_req_params = -1,
  42 + $debug = 0)
  43 +{
  44 + if (USE_SCRIPT_CACHE == 0)
  45 + return 0;
  46 +
  47 + $em_parameter = "";
  48 + if (isset ($_REQUEST["em_parameter"]))
  49 + $em_parameter = $_REQUEST["em_parameter"];
  50 + if (!empty($em_parameter))
  51 + $GLOBALS["em_parameter"] = $em_parameter;
  52 + if (!empty($GLOBALS["em_parameter"]))
  53 + $em_parameter = $GLOBALS["em_parameter"];
  54 +
  55 + $content = "";
  56 + if (isset($_REQUEST["NOCACHE"]))
  57 + {
  58 + if (isset($_REQUEST["PHP_SELF"]))
  59 + {
  60 + $_SERVER["PHP_SELF"]=$_REQUEST["PHP_SELF"];
  61 +
  62 + // --- DEBUG OUTPUT -------
  63 + if ($debug)
  64 + echo "<br />PHP_SELF wurde gesetzt: " . $_SERVER["PHP_SELF"];
  65 + // --- END DEBUG OUTPUT ---
  66 +
  67 + }
  68 + return 0;
  69 + }
  70 +
  71 + // --- DEBUG OUTPUT -------
  72 + $t1 = NULL;
  73 +
  74 + if ($debug)
  75 + $t1 = getMilliSeconds ();
  76 +
  77 + if ($debug)
  78 + {
  79 + echo "<br />Startzeit: ".strftime("%H:%M:%S");
  80 + echo "<br />Script-Datei: ".$script_file;
  81 + echo "<br />PHP_SELF: ".$_SERVER["PHP_SELF"];
  82 + echo "<br />Erlaubte Cache-Dateien pro Verzeichnis: " .
  83 + MAX_FILES_IN_CACHE_DIR;
  84 + }
  85 + // --- END DEBUG OUTPUT ---
  86 +
  87 + $subclient_id = getSubclientIDByUrl();
  88 +
  89 + $len = strlen ($_SERVER["DOCUMENT_ROOT"]);
  90 + $script_name = substr ($script_file, $len);
  91 +
  92 + // --- DEBUG OUTPUT -------
  93 + if ($debug)
  94 + echo "<br>DOCUMENT ROOT: " . $_SERVER["DOCUMENT_ROOT"];
  95 +
  96 + if ($debug)
  97 + echo "<br />Script-Name: $script_name";
  98 + // --- END DEBUG OUTPUT ---
  99 +
  100 + $cache_file = realpath (CACHEDIR) . "/" . $subclient_id . "/" .
  101 + substr(dirname($script_name),1) . "/" . basename($script_name) . "/" .
  102 + basename($script_name,".php");
  103 +
  104 + $params = "";
  105 + $query_string = "";
  106 +
  107 + foreach ($_REQUEST as $key => $val)
  108 + {
  109 + if (is_array ($allowed_req_params) &&
  110 + in_array ($key,$allowed_req_params))
  111 + {
  112 + $val = urlencode (trim($val));
  113 + $key = urlencode (trim($key));
  114 +
  115 + // --- DEBUG OUTPUT -------
  116 + if ($debug)
  117 + echo "<br />Hänge Request-Parameter an: _$key-$val";
  118 + // --- END DEBUG OUTPUT ---
  119 +
  120 + $params .= "_". $key . "-" . $val;
  121 + $query_string .= $key . "=" . $val . "&";
  122 + }
  123 + }
  124 +
  125 + if (!empty ($em_parameter))
  126 + {
  127 + $params .= "_" . $em_parameter;
  128 + $query_string .= "em_parameter=" . $em_parameter;
  129 + }
  130 +
  131 + if (!empty ($params))
  132 + $cache_file = $cache_file . "_" . md5($params) . ".html";
  133 + else
  134 + $cache_file = $cache_file . ".html";
  135 +
  136 + $url = getProtocol () . "://" . $_SERVER["SERVER_NAME"] . $script_name .
  137 + "?" . $query_string;
  138 + $cached_dir = dirname($cache_file);
  139 +
  140 + // --- DEBUG OUTPUT -------
  141 + if ($debug)
  142 + {
  143 + echo "<br />Cache-Datei: $cache_file";
  144 + echo "<br />Script-Datei: $script_file";
  145 + echo "<br />URL: ".htmlspecialchars($url);
  146 + echo "<br />Cache Dir: $cached_dir";
  147 + }
  148 + // --- END DEBUG OUTPUT ---
  149 +
  150 + if (!is_dir ($cached_dir))
  151 + {
  152 + if (!is_dir (CACHEDIR . $subclient_id))
  153 + mkdir (CACHEDIR . $subclient_id);
  154 + $cachedir = CACHEDIR . $subclient_id;
  155 +
  156 + $dir_arr = explode ("/", dirname($script_name) . "/" .
  157 + basename($script_name));
  158 +
  159 + foreach ($dir_arr as $dir)
  160 + {
  161 + if (!is_dir($cachedir . "/" . $dir))
  162 + {
  163 + mkdir ($cachedir. "/" . $dir);
  164 + chmod ($cachedir. "/" . $dir, 0777);
  165 +
  166 + // --- DEBUG OUTPUT -------
  167 + if ($debug)
  168 + echo "<br />Erzeuge Verzeichnis: $cachedir/$dir";
  169 + // --- END DEBUG OUTPUT ---
  170 + }
  171 + $cachedir .= "/" . $dir;
  172 + }
  173 + }
  174 +
  175 + $is_updated = 0;
  176 + if (!file_exists ($cache_file))
  177 + {
  178 + $file_count = count (scandir ($cached_dir)) - 2;
  179 +
  180 + // --- DEBUG OUTPUT -------
  181 + if ($debug)
  182 + echo "<br />Es sind $file_count im Cacheverzeichnis. " .
  183 + "Erlaubt sind " . MAX_FILES_IN_CACHE_DIR. ".";
  184 + // --- END DEBUG OUTPUT ---
  185 +
  186 + if ($file_count <= MAX_FILES_IN_CACHE_DIR)
  187 + {
  188 + $content = makeCacheFile ($cache_file, $url, $debug);
  189 + $is_updated = 1;
  190 +
  191 + // --- DEBUG OUTPUT -------
  192 + if ($debug)
  193 + echo "<br />Cache-Datei wurde erzeugt, " .
  194 + "weil diese nicht existierte.";
  195 + // --- END DEBUG OUTPUT ---
  196 + }
  197 + else
  198 + {
  199 + // --- DEBUG OUTPUT -------
  200 + if ($debug)
  201 + {
  202 + echo "<br />Es sind mehr Dateien im Cacheverzeichnis als " .
  203 + "erlaubt: " . $file_count .
  204 + "<br />Die Seite kann daher nicht gecached werden.";
  205 + }
  206 + // --- END DEBUG OUTPUT ---
  207 + }
  208 + }
  209 + else
  210 + {
  211 + if ($auto_update)
  212 + {
  213 + $do_update=0;
  214 +
  215 + if (filemtime($cache_file) < filemtime($script_file))
  216 + {
  217 + $do_update = 1;
  218 +
  219 + // --- DEBUG OUTPUT -------
  220 + if ($debug)
  221 + echo "<br />Cache-Datei wird erzeugt, weil die Cache-Datei " .
  222 + "älter als die Script-Datei ist.";
  223 + // --- END DEBUG OUTPUT ---
  224 + }
  225 + else
  226 + {
  227 + $includes = get_included_files ();
  228 +
  229 + foreach($includes as $inc)
  230 + {
  231 + if (strstr ($inc, realpath (HOME . "/../")))
  232 + {
  233 + // --- DEBUG OUTPUT -------
  234 + if ($debug)
  235 + echo "<br />Untersuche Abhängigkeiten von $inc";
  236 + // --- END DEBUG OUTPUT ---
  237 +
  238 + if (filemtime($inc) > filemtime($cache_file))
  239 + {
  240 + $do_update=1;
  241 +
  242 + // --- DEBUG OUTPUT -------
  243 + if ($debug)
  244 + echo "<br />Cache-Datei wird erzeugt, weil " .
  245 + $inc . "verändert wurde.";
  246 + // --- END DEBUG OUTPUT ---
  247 +
  248 + break;
  249 + }
  250 + }
  251 + }
  252 + }
  253 +
  254 + if (!$do_update)
  255 + {
  256 + $content = getCacheContent ($cache_file, $debug);
  257 + }
  258 + else
  259 + {
  260 + $content = makeCacheFile ($cache_file, $url, $debug);
  261 + $is_updated = 1;
  262 +
  263 + // --- DEBUG OUTPUT -------
  264 + if ($debug)
  265 + echo "<br />Cache-Datei wurde erzeugt: Auto-Update";
  266 + // --- END DEBUG OUTPUT ---
  267 + }
  268 + }
  269 +
  270 + if ($update_interval >= 10 && !$is_updated)
  271 + {
  272 + $diff = time() - filemtime($cache_file);
  273 +
  274 + // --- DEBUG OUTPUT -------
  275 + if ($debug)
  276 + echo "<br />Noch " . $update_interval - $diff .
  277 + " Sekunden bis zum nächsten Interval-Update";
  278 + // --- END DEBUG OUTPUT ---
  279 +
  280 + if ($diff > $update_interval)
  281 + {
  282 + $content = makeCacheFile($cache_file, $url, $debug);
  283 + $is_updated=1;
  284 +
  285 + // --- DEBUG OUTPUT -------
  286 + if ($debug)
  287 + echo "<br />Cache-Datei wurde erzeugt: Interval-Update";
  288 + // --- END DEBUG OUTPUT ---
  289 + }
  290 + else
  291 + {
  292 + $content = getCacheContent($cache_file, $debug);
  293 + }
  294 + }
  295 + }
  296 +
  297 + // --- DEBUG OUTPUT -------
  298 + if ($debug)
  299 + echo "<hr />";
  300 + // --- END DEBUG OUTPUT ---
  301 +
  302 + if (!empty($content))
  303 + echo "\n<!-- Cache-Bereich Anfang: ".basename($script_name)." -->\n";
  304 + echo $content;
  305 + if (!empty($content))
  306 + echo "\n<!-- Cache-Bereich Ende: ".basename($script_name)." -->\n";
  307 +
  308 + // --- DEBUG OUTPUT -------
  309 + if ($debug)
  310 + echo "<hr /><p />Gecachter Content wurde ausgeliefert.";
  311 + if ($debug)
  312 + echo "<br />Verarbeitungsdauer (in ms): ".(intval(getMilliSeconds()-$t1));
  313 + // --- END DEBUG OUTPUT ---
  314 +
  315 + if (empty($content))
  316 + return 0;
  317 + else
  318 + return 1;
  319 +}
  320 +
  321 +function makeCacheFile($cache_file, $url, $debug)
  322 +{
  323 + if (preg_match("/^http.*\?.*/",$url))
  324 + $url = $url."&NOCACHE=1&PHP_SELF=".urlencode($_SERVER["PHP_SELF"]);
  325 + else
  326 + $url = $url."?NOCACHE=1&PHP_SELF=".urlencode($_SERVER["PHP_SELF"]);
  327 +
  328 + if ($debug)
  329 + echo "<br />Encoded URL: $url";
  330 +
  331 + // --- DEBUG OUTPUT -------
  332 + $t1 = '';
  333 + if ($debug)
  334 + $t1=getMilliSeconds();
  335 + // --- END DEBUG OUTPUT ---
  336 +
  337 + $content = file_get_contents($url);
  338 +
  339 + // --- DEBUG OUTPUT -------
  340 + if ($debug)
  341 + echo "<br />Laden der Seite ohne Cache dauerte: " .
  342 + getMilliSeconds() - $t1 . " ms";
  343 + flush();
  344 +
  345 + if ($debug)
  346 + {
  347 + echo "<br />Cache-Datei ist gesperrt: ";
  348 + var_dump (is_file ($cache_file.".LCK"));
  349 + }
  350 + // --- END DEBUG OUTPUT ---
  351 +
  352 + $ctr = 0;
  353 + while (cacheFileIsLocked ($cache_file))
  354 + {
  355 + usleep (100000);
  356 + $ctr++;
  357 + if ($debug)
  358 + {
  359 + echo "<br />Cache-Datei ist gesperrt ...";
  360 + flush();
  361 + }
  362 + if ($ctr>(MAX_CACHE_WAIT_SECS*10))
  363 + return $content;
  364 + clearstatcache();
  365 + }
  366 + $is_locked = lockCacheFile($cache_file);
  367 + if ($is_locked)
  368 + {
  369 + $fp = fopen($cache_file, "w");
  370 + if ($fp)
  371 + {
  372 + fwrite($fp,$content);
  373 +
  374 + // for ($x=0;$x<25;$x++)
  375 + // {
  376 + // echo "<br />Test sleep ... $x";
  377 + // flush();
  378 + // sleep(1);
  379 + // }
  380 +
  381 + fclose($fp);
  382 + chmod($cache_file,0777);
  383 + }
  384 + } else
  385 + if ($debug)
  386 + echo "<br />Cache-Datei konnte nicht geschrieben werden, " .
  387 + "weil die Lock-Datei nicht gesperrt werden konnte";
  388 + if ($is_locked)
  389 + unlockCacheFile($cache_file);
  390 + return $content;
  391 +}
  392 +
  393 +function lockCacheFile($cache_file)
  394 +{
  395 + $lock_file = $cache_file.".LCK";
  396 + if (is_file($lock_file))
  397 + {
  398 + if (is_writable($lock_file))
  399 + {
  400 + chmod($lock_file,0555);
  401 + clearstatcache();
  402 + return 1;
  403 + }
  404 + else
  405 + return 0;
  406 + } else
  407 + {
  408 + $fp = fopen($lock_file,'w');
  409 + if ($fp)
  410 + {
  411 + fclose($fp);
  412 + chmod($lock_file,0555);
  413 + clearstatcache();
  414 + return 1;
  415 + } else
  416 + return 0;
  417 + }
  418 +}
  419 +
  420 +function unlockCacheFile($cache_file)
  421 +{
  422 + $lock_file = $cache_file.".LCK";
  423 + chmod($lock_file,0777);
  424 + if (is_file($lock_file))
  425 + {
  426 + unlink($lock_file);
  427 + clearstatcache();
  428 + }
  429 +}
  430 +
  431 +function cacheFileIsLocked($cache_file)
  432 +{
  433 + $lock_file = $cache_file.".LCK";
  434 + $is_locked = is_file($lock_file);
  435 +
  436 + if ($is_locked)
  437 + return 1;
  438 + return 0;
  439 +}
  440 +
  441 +function getProtocol()
  442 +{
  443 + $proto = $_SERVER["SERVER_PROTOCOL"];
  444 + if (preg_match("/^HTTP\/.*$/",$proto))
  445 + return 'http';
  446 + if (preg_match("/^HTTPS\/.*$/",$proto))
  447 + return 'https';
  448 +}
  449 +
  450 +function getCacheContent($cache_file, $debug)
  451 +{
  452 + $ctr = 0;
  453 + while (cacheFileIsLocked($cache_file))
  454 + {
  455 + usleep(100000);
  456 + $ctr++;
  457 + if ($debug)
  458 + {
  459 + echo "<br />Kann Content nicht ausliefern, da Cache-Datei gesperrt ist ...";
  460 + flush();
  461 + }
  462 + if ($ctr>(MAX_CACHE_WAIT_SECS*10))
  463 + return "";
  464 + clearstatcache();
  465 + }
  466 + return file_get_contents($cache_file);
  467 +}
  468 +
  469 +function cleanupCache()
  470 +{
  471 + $log = "<h3>Cleanup Cache Script</h3>\n<ul>";
  472 + $def_vars = get_defined_constants();
  473 +
  474 + if (!array_key_exists('CACHE_CLEANUP_TIME',$def_vars))
  475 + {
  476 + $log .= "<li>Konstante CACHE_CLEANUP_TIME ist nicht definiert - breche Cleanup-Skript ab.</li></ul>";
  477 + return $log;
  478 + } else if (!array_key_exists('CACHECLEANUPFILE',$def_vars))
  479 + {
  480 + $log .= "<li>Konstante CACHECLEANUPFILE ist nicht definiert - breche Cleanup-Skript ab.</li></ul>";
  481 + return $log;
  482 + } else
  483 + if (!preg_match("/^([0-9][0-9]:[0-9][0-9],{0,1})*$/",CACHE_CLEANUP_TIME))
  484 + {
  485 + $log .= "<li>Konstante CACHE_CLEANUP_TIME '".CACHE_CLEANUP_TIME."' ist im falschen Format - breche Cleanup-Skript ab.</li></ul>";
  486 + return $log;
  487 + }
  488 +
  489 + $cachecleanup_file = CACHEDIR.CACHECLEANUPFILE;
  490 + $cleanup = 0;
  491 + $err_reporting = ini_get("error_reporting");
  492 + ini_set("error_reporting",0);
  493 +
  494 + if (file_exists($cachecleanup_file))
  495 + {
  496 + $lastmodified = filemtime($cachecleanup_file);
  497 + $cachecleanup_file = realpath($cachecleanup_file);
  498 + $log .= "<li>Cache-Cleanup-Datei $cachecleanup_file existiert.</li>";
  499 + $log .= "<li>Cache-Cleanup-Datei $cachecleanup_file wurde letzmals aktualisiert am: ".strftime("%d.%m.%Y %H:%M:%S",$lastmodified)." Uhr</li>";
  500 +
  501 + }
  502 + else
  503 + $lastmodified = -1;
  504 + $cleanuptime_arr = explode(",",CACHE_CLEANUP_TIME);
  505 + foreach($cleanuptime_arr as $cleanup_time)
  506 + {
  507 + $log .= "<li><b>Checke Cleanup-Time $cleanup_time Uhr</b><ul>";
  508 + $ct_arr = explode(":",$cleanup_time);
  509 + if (count($ct_arr)>=2)
  510 + {
  511 + $hour = $ct_arr[0];
  512 + $minute = $ct_arr[1];
  513 + $today = getdate();
  514 + $cleanup_timestamp = mktime($hour,$minute,0,$today["mon"],$today["mday"],$today["year"]);
  515 + $now = time();
  516 + $diff1 = $now-$cleanup_timestamp;
  517 + $log .= "<li>Untersuche Differenz: now()-$cleanup_time=$diff1 Sekunden</li>";
  518 + if ($diff1>0)
  519 + {
  520 + $log .= "<li>Cleanup-Zeitpunkt ist überschritten</li>";
  521 + if ($cleanup_timestamp>$lastmodified)
  522 + {
  523 + $cleanup=1;
  524 + $log .= "<li>Cleanup-Zeitpunkt muss durchgeführt werden.</li>";
  525 + } else
  526 + $log .= "<li>Kein Cleanup erforderlich, weil ".basename($cachecleanup_file)." nach der Cleanup-Zeit" .
  527 + " $cleanup_time Uhr verändert wurde.";
  528 + } else
  529 + $log .= "<li>Kein Cleanup erforderlich. Es dauert noch ".(-$diff1)." Sekunden bis zum nächsten Cleanup.</li>";
  530 + }
  531 + $log .= "</ul></li>";
  532 + }
  533 +
  534 + if ($cleanup)
  535 + {
  536 + $log .= "<li><b>Führe jetzt Cleanup durch ...</b>";
  537 + $files = scandir(CACHEDIR);
  538 +
  539 + foreach($files as $key=>$file)
  540 + {
  541 + if ($file=='.' ||
  542 + $file=='..' ||
  543 + $file=='.svn' ||
  544 + $file==LASTLOGFILE ||
  545 + $file==CACHECLEANUPFILE)
  546 + unset($files[$key]);
  547 + }
  548 +
  549 + if (count($files)==0)
  550 + $log .= "<li>Cache ist leer.</li>";
  551 + foreach($files as $file)
  552 + {
  553 + $file = realpath(CACHEDIR.$file);
  554 + $success = 0;
  555 + if (is_file($file))
  556 + {
  557 + $log .= "<li>lösche Datei $file : ";
  558 + $success = unlink($file);
  559 + } else if (is_dir($file))
  560 + {
  561 + $log .= "<li>lösche Verzeichnis $file : ";
  562 +
  563 + delTree($file);
  564 + if (!is_dir($file))
  565 + $success = 1;
  566 + }
  567 +
  568 + if ($success)
  569 + $log .= " gelöscht.</li>";
  570 + else
  571 + $log .= " <b style=\"color:red\">Löschen fehlgeschlagen.</b></li>";
  572 + }
  573 + $fp = fopen($cachecleanup_file,"w");
  574 + fclose($fp);
  575 + }
  576 + $log .= "\n</ul>\nCleanup beendet.";
  577 + ini_set($err_reporting);
  578 + return $log;
  579 +}
  580 +
  581 +function delTree($path) {
  582 + if (is_dir($path)) {
  583 + $entries = scandir($path);
  584 + foreach ($entries as $entry) {
  585 + if ($entry != '.' && $entry != '..') {
  586 + deltree($path.DIRECTORY_SEPARATOR.$entry);
  587 + }
  588 + }
  589 + rmdir($path);
  590 + } else {
  591 + unlink($path);
  592 + }
  593 +}
  594 +
  595 +?>
... ...
Please register or login to post a comment