&1", $out, $ret); if ($ret != 0) { print "scp returns: ".$ret."
\n"; print "Output was:
\n";

		print_r ($out);

		print "
\n"; } else { $fh = fopen ($localFile, "r"); $line = fgets ($fh); while (! feof ($fh)) { $buf = explode (":", trim ($line)); if ($buf[1] == "") $buf[1] = "no-change"; if ($buf[4] != "delete") $users[$buf[0]] = array ($buf[1], $buf[2], $buf[3], $buf[4]); $line = fgets ($fh); } fclose ($fh); } exec ("scp webuseradd@vam-osc6:/etc/web-useradd ".$localFile." 2>&1", $out, $ret); if ($ret != 0) { print "scp returns: ".$ret."
\n"; print "Output was:
\n";

		print_r ($out);

		print "
\n"; } else { $fh = fopen ($localFile, "r"); $line = fgets ($fh); while (! feof ($fh)) { $buf = explode (":", trim ($line)); if ($buf[1] == "") if ($users[$buf[0]] && $users[$buf[0]][0] != "") $buf[1] = $users[$buf[0]][0]; else $buf[1] = "no-change"; if ($buf[4] != "delete") $users[$buf[0]] = array ($buf[1], $buf[2], $buf[3], $buf[4]); $line = fgets ($fh); } fclose ($fh); } exec ("rm ".$localFile." 2>&1", $out, $ret); return $users; } function load_cats () { /* * OK, ich hole dir verfügbaren Rubriken anhand der existierenden * Verzeichniss unter /vol1/www/bhi_upload. Will man also eine * Rubrik hinzufügen, so muß man dort nur das Verzeichnis anlegen. */ exec ("ssh -l webuseradd vam-osc5 ". "\"ls -p /vol1/www/bhi_upload | sed '/\/$/p;d'\" ". "2>/dev/null", $out, $ret); foreach ($out as $key=>$line) $out[$key] = preg_replace ("/^(.*)\/$/", "\\1", $line); return $out; /* return array ("kfz", "immo", "trauer"); */ } function update_users ($users) { $fh = fopen ("/tmp/web-useradd", "w"); foreach ($users as $key => $value) { fputs ($fh, $key.":".$value[0].":".$value[1].":". $value[2].":".$value[3]."\n"); } fclose ($fh); exec ("scp /tmp/web-useradd webuseradd@vam-osc5:/etc/web-useradd 2>&1", $out, $ret); if ($ret != 0) { print "scp to vam-osc5 returns: ".$ret."
\n"; print "Output was:
\n";

		print_r ($out);

		print "
\n"; } exec ("scp /tmp/web-useradd webuseradd@vam-osc6:/etc/web-useradd 2>&1", $out, $ret); if ($ret != 0) { print "scp to vam-osc6 returns: ".$ret."
\n"; print "Output was:
\n";

		print_r ($out);

		print "
\n"; } exec ("rm /tmp/web-useradd 2>&1", $out, $ret); } function show_users ($users) { print "

User auf vam-osc5 und vam-osc6

\n"; if ($_SESSION['editable'] == TRUE) { print ""; print "Benutzer hinzufügen"; } else { print ""; print "Benutzer bearbeiten"; } print ""; $rownum = 0; if (isset ($users)) { foreach ($users as $name => $data) { if (($rownum % 2) != 0) { $bg="#EEEEEE"; // leight } else { $bg="#CCCCCC"; // dark } $tdStyle = ""; $delText = "löschen"; if ($data[3] == "delete") { $tdStyle = "style=\"text-decoration: line-through;\""; $delText = "nicht löschen"; } print ""; print ""; print ""; if ($_SESSION['editable'] == TRUE) { if ($data[3] != "delete") { print ""; print ""; } print "\n"; $rownum ++; } } if ($_SESSION['editable'] == TRUE) { print ""; } print "
".$name."".$data[1]."".$data[2].""; print "bearbeiten"; print $delText."
"; print "abschicken"; print " abbrechen"; print "
\n"; } function edit_user ($users, $cats, $name) { print "
"; print ""; print ""; print ""; print ""; print ""; } else { print ""; print $name.""; } print "\n"; print ""; print ""; print "\n"; print ""; print ""; print "\n"; print ""; print ""; print "\n"; print "
Username: "; if (! isset ($name)) { print "
Rubrik: "; print ""; print "
Vollständiger Name: "; print ""; print "
Passwort: "; print ""; print "
"; print "abbrechen"; print " "; print "
\n"; print "
"; } /* * gibt FALSE zurück falls kein Lock gesetzt werden konnte, ansonsten die * aktuelle lockid. Diese wird bei free_lock benötigt um den lock wieder * freizugeben. * Folgende Fälle können eintreten: * 1. Das Lockfile enthält keine Daten und myId ist leer. * Das bedeutet: es existiert keine Sperre auf die Daten und wir hatten * bisher keine Sperre auf die Daten. * Daraufhin wird eine neue lock-id generiert und zusammen mit dem * aktuellen Timestamp in das lockfile gegeben. Die generierte lock-id * wird zurückgegeben. * 2. Das Lockfile enthält eine Sperre und myId ist leer. * Das bedeutet: es existiert eine Sperre auf die Daten, die nicht von * dieser PHP session generiert wurde. * 2 Faelle: * (lockTime + 300) >= time (): Die Sperre ist nicht abgelaufen => es * kann keine neue Sperre angelegt werden. * (lockTime + 300) < time (): Die Sperre ist abgelaufen => neue lock-id * generieren, in Datei eintragen und * zurückgeben. * 3. Das Lockfile enthält eine Sperre und myId != lockId. * Das bedeutet: In der aktuellen PHP session wurde erfolgreich eine * Sperre erzeugt, die aber aufgrund dessen das ein timeout * eingetreten ist (d.h. in der aktuellen Session wurde länger * als 5 Minuten auf keinen link mehr geklickt.) nicht mehr * gültig war und in der zwischenzeit hat jemand anderes * daher eine neue Sperre auf die Daten eingerichtet siehe 2. * folgende Fälle: * die 2 Unterfälle von 2. * 4. Das Lockfile enthält keine Daten, aber myId ist nicht leer. * Das bedeutet: In der aktuellen PHP session wurde ein lock eingerichtet. * Der Timeout verstrich und jemand anderes hat änderungen * an den Daten vorgenommen. Konsequenz: Die Daten in dieser * PHP session sind nicht mehr aktuell. * Da der aktuelle Lock daher komplett ungültig geworden ist wird nichts * in die Datei eingetragen und eine leere lock-id zurückgegeben. * An anderer Stelle (check_lock) werden anhand der Information das myId * nich leer war, aber die zurückgegebene id leer ist alle anderen Daten * neu initialisiert. * 5. Das Lockfile enthält eine Sperre und myId == lockId. * Das bedeutet: Innerhalb dieser PHP session wurde eine Sperre eingerichtet * die auch weiterhin gültig ist. * Die lockTime wird in der Datei aktualisiert und lockId zurückgegeben. */ function get_lock ($lockFile, $myId) { $newId = ""; $lockFd = fopen ($lockFile, "a+"); if ($lockFd != FALSE) { if (flock ($lockFd, LOCK_EX) != FALSE) { rewind ($lockFd); $lockEntry = explode ('/', trim (fgets ($lockFd))); $lockId = $lockEntry[0]; $lockTime = $lockEntry[1]; if ($lockId == $myId || /* lockTime nur pruefen wenn Sie in der Datei stand */ ($lockTime != "" && ($lockTime + 300) < time ())) { ftruncate ($lockFd, 0); if ($lockId != "" && $lockId == $myId) $newId = $myId; else $newId = uniqid (); fputs ($lockFd, $newId."/".time ()."\n"); } fclose ($lockFd); } } return $newId; } function free_lock ($lockFile, $lockId) { $lockFd = fopen ($lockFile, "r+"); if ($lockFd != FALSE) { if (flock ($lockFd, LOCK_EX) != FALSE) { $lockEntry = explode ('/', trim (fgets ($lockFd))); $oldId = $lockEntry[0]; if ($lockId == $oldId) ftruncate ($lockFd, 0); fclose ($lockFd); } } } function check_lock ($lockFile, $lockId) { if ($_SESSION['editable'] == TRUE) { $gotId = get_lock ($lockFile, $lockId); if ($gotId == FALSE) { if ($lockId == FALSE) { print "
Konnte keine Sperre zum "; print "bearbeiten der Benutzerdaten anlegen. Jemand anderes "; print "bearbeitet die Daten bereits. Bitte versuchen Sie es in ein "; print "paar Minuten noch einmal.
"; } else { print "
Ihre Sperre ist "; print "ungültig. Vermutlich haben Sie länger als fünf "; print "Minuten keine Modifikationen vorgenommen und jemand "; print "anderes bearbeitet jetzt Benutzerdaten. Leider sind ihre "; print "bisherigen Änderungen dadurch ungültig geworden. "; print "Bitte versuchen Sie es in ein paar Minuten noch einmal."; print "
"; } } return $gotId; } return ""; } $_action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'load'; session_start (); $_SESSION['lockFile'] = '/var/www/localhost/htdocs/osc_user_add/webuseradd.lck'; mkhead ("Benutzer auf vam-osc5 und vam-osc6 anlegen ...", "bar-edvtools", "Benutzertool vam-osc5 und vam-osc6"); if ($_action == "load" || $_action == "startedit") { session_unregister ("users"); session_unregister ("cats"); } if (! isset ($_SESSION['users'])) $_SESSION['users'] = load_users (); if (! isset ($_SESSION['cats'])) $_SESSION['cats'] = load_cats (); if (! isset ($_SESSION['editable'])) $_SESSION['editable'] = FALSE; if ($_action == 'startedit') $_SESSION['editable'] = TRUE; $_SESSION['lockId'] = check_lock ($_SESSION['lockFile'], $_SESSION['lockId']); if ($_SESSION['lockId'] == FALSE) { $_SESSION['editable'] = FALSE; show_users ($_SESSION['users']); } else { switch ($_action) { case 'edit': edit_user ($_SESSION['users'], $_SESSION['cats'], $_REQUEST['name']); break; case 'set': $pass = $_REQUEST['pass']=="no-change"?$_REQUEST['pass']: $_REQUEST['oldpass']==$_REQUEST['pass']?$_REQUEST['pass']: crypt ($_REQUEST['pass'], $_REQUEST['name']); $_SESSION['users'][$_REQUEST['name']] = array ($pass, $_REQUEST['full'], $_REQUEST['cat'], time ()); show_users ($_SESSION['users']); break; case 'update': update_users ($_SESSION['users']); print "
Daten wurden aktualisiert. "; print "Es kann einige Minuten dauern bis das System die "; print "Änderung übernimmt.
\n"; case 'abort': free_lock ($_SESSION['lockFile'], $_SESSION['lockId']); $_SESSION['lockId'] = ""; $_SESSION['editable'] = FALSE; show_users ($_SESSION['users']); break; case 'add': edit_user ($_SESSION['users'], $_SESSION['cats'], $_REQUEST['name']); break; case 'delete': if ($_SESSION['users'][$_REQUEST['name']][3] != "delete") $_SESSION['users'][$_REQUEST['name']][3] = "delete"; else $_SESSION['users'][$_REQUEST['name']][3] = time (); show_users ($_SESSION['users']); break; case 'show': default: show_users ($_SESSION['users']); } } ?>