Benutzer:Kirmse/flehrer01: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Kirmse (Diskussion | Beiträge) (ein Teil des Scripts und Screenshot) |
Kirmse (Diskussion | Beiträge) K (das derzeit vollständige Script) |
||
Zeile 199: | Zeile 199: | ||
$formular .= <<ENDE; | $formular .= <<ENDE; | ||
<head> | |||
jetzt kommt | <title>Webinterface für Fachlehrer - Austeilen</title> | ||
<meta name="author" content="HD.Kirmse"> | |||
</head> | |||
<body background="whttxtr2.jpg"> | |||
<h1>&nbsp;Für Fachlehrer: Austeilen von Dateien</h1> | |||
<hr noshade size="2"> | |||
<form action="/cgi-bin/kopieren.pl" method="post"> | |||
<p> | |||
&nbsp; &nbsp;<i>Geben Sie hier an, aus welchem Verzeichnis des Fachlehrers kopiert werden soll:</i><br> | |||
&nbsp; &nbsp;<b>Unterverzeichnis von u: </b> <input type="Text" name="quelle" value="austeilen" size="20" maxlength="80"> | |||
</p> | |||
<p> | |||
&nbsp; &nbsp;<i>Geben Sie hier an, in welches Verzeichnis des Schülers kopiert werden soll:</i><br> | |||
&nbsp; &nbsp;<b>Unterverzeichnis von u: </b> <input type="Text" name="ziel" value="einsammeln" size="20" maxlength="80"> | |||
</p> | |||
<hr noshade size="1"> | |||
<p> | |||
&nbsp; &nbsp;<i>Geben Sie hier an, welche Dateitypen kopiert werden sollen (Standard ist alle):</i><br> | |||
&nbsp; &nbsp;<b>alle: </b> <input type="Checkbox" name="alle" value="v"> <b>Word: </b><input type="Checkbox" name="word" value="v"> <b>Text: </b><input type="Checkbox" name="text" value="v"> | |||
</p> | |||
<hr noshade size="1"> | |||
<p> | |||
<table > | |||
<tr> | |||
<td width="7">&nbsp;</td> | |||
<td><i>Geben Sie hier an, wie kopiert werden soll:</i></td> | |||
<td>&nbsp;</td> | |||
</tr> | |||
<tr> | |||
<td>&nbsp;</td> | |||
<td>kopierte Dateien beim Schüler <b>schreibgeschützt</b>: </td> | |||
<td><input type="Checkbox" name="readonly" value="v"></td> | |||
</tr> | |||
<tr> | |||
<td>&nbsp;</td> | |||
<td>auch aus Unterverzeichnissen (<b>rekursiv</b>) kopieren: </td> | |||
<td><input type="Checkbox" name="rekursiv" value="v"> </td> | |||
</tr> | |||
</table> | |||
</p> | |||
<hr noshade size="1"> | |||
<p> | |||
<table border="0"> | |||
<tr> | |||
<td width="7">&nbsp;</td> | |||
ENDE | |||
<font color="#C0C0C0"><i># die naechste Zeile wurde nicht ins HERE-dokument genommen, weil die</i></font> | |||
<font color="#C0C0C0"><i># Uebergabe der Anzahl der Spalten als Variable so sicherer erscheint</i></font> | |||
$formular .= " <td colspan=\"$AnzSp\"><i>Wählen Sie hier die Klassen aus, deren Schüler Kopien erhalten sollen:</i></td>\n"; | |||
$formular .= '</tr>'; | |||
<font color="#C0C0C0"><i># und jetzt geht die Konstruktion der eigentlichen Tabelle los</i></font> | |||
my $zelle = ""; | |||
my $zeile = ""; | |||
<font color="#C0C0C0"><i># wir holen uns ersteinmal alle Klassen</i></font> | |||
my @liste = split ',', $liste; | |||
<font color="#C0C0C0"><i># und sortieren diese alphabetisch</i></font> | |||
@liste = sort @liste; | |||
<font color="#C0C0C0"><i># wir bestimmen die Anzahl</i></font> | |||
my $anzahl = @liste; | |||
<font color="#C0C0C0"><i># wenn die Anzahl der Klassen durch die Anzahl der Spalten einen Rest</i></font> | |||
<font color="#C0C0C0"><i># ergibt, füllen wir die Liste der Klassen mit Leerzeichen als Klassen auf</i></font> | |||
while (($anzahl % $AnzSp) > 0) { | |||
push @liste, ' '; | |||
$anzahl = @liste; | |||
} | |||
<font color="#C0C0C0"><i># der Zaehler ist 0</i></font> | |||
my $zaehler = 0; | |||
<font color="#C0C0C0"><i># fuer jede unserer Klassen</i></font> | |||
foreach my $klasse (@liste) { | |||
<font color="#C0C0C0"><i># wir setzen von der Zelle die Breite und Hintergrundfarbe</i></font> | |||
$zelle = '<td width="100" bgcolor="<font color="#C0C0C0"><i>#F0F0F0">';</i></font> | |||
<font color="#C0C0C0"><i># wenn die Klasse kein Leerzeichen ist, dann</i></font> | |||
if ($klasse ne ' ') { | |||
<font color="#C0C0C0"><i># kommt eine Checkbox</i></font> | |||
$zelle .= "<input type=\"Checkbox\" name=\"$klasse\" value=\"v\"> "; | |||
$zelle .= "$klasse</td>\n"; | |||
<font color="#C0C0C0"><i># sonst</i></font> | |||
} else { | |||
<font color="#C0C0C0"><i># nur ein Leerzeichen</i></font> | |||
$zelle .= '&nbsp;</td>'."\n"; | |||
} | |||
<font color="#C0C0C0"><i># wenn der Zaehler gleich 0 ist (also die erste Spalte), dann</i></font> | |||
if ($zaehler == 0) { | |||
<font color="#C0C0C0"><i># beginnen wir mit <tr> und einem leeren Feld und dann die Zelle</i></font> | |||
$zeile .= '<tr><td>&nbsp;</td>'.$zelle | |||
<font color="#C0C0C0"><i># wenn der Zaehler gleich Spaltenzahl-1 ist (letzte Spalte), dann</i></font> | |||
} elsif ($zaehler == $AnzSp-1) { | |||
<font color="#C0C0C0"><i># haengen wir noch ein </tr> an die Zelle dran</i></font> | |||
$zeile .= $zelle.'&lt;/tr&gt;'.&quot;\n&quot; | |||
<font color="#C0C0C0"><i># sonst (wenn nicht die erste oder letzte Spalte)</i></font> | |||
} else { | |||
<font color="#C0C0C0"><i># haengen wir nur die Zelle an</i></font> | |||
$zeile .= $zelle | |||
} | |||
<font color="#C0C0C0"><i># Zaehler um 1 erhoehen</i></font> | |||
$zaehler++; | |||
<font color="#C0C0C0"><i># Zaehler ist der Rest bei Division durch Anzahl der Spalten,</i></font> | |||
<font color="#C0C0C0"><i># wobei wir bei 0 mit zaehlen beginnen</i></font> | |||
$zaehler = $zaehler % $AnzSp; | |||
} | |||
<font color="#C0C0C0"><i># wir haengen an unser formular noch diese Tabelle (Zeilen) an</i></font> | |||
$formular .= $zeile.'</table>'."\n".'</p>'; | |||
<font color="#C0C0C0"><i># und haengen noch das Ende der HTML-Seite als HERE-Dokument an</i></font> | |||
$formular .= <<ENDE; | |||
<input type="Submit" name="austeilen" value="kopieren"> | |||
</form> | |||
<br> | |||
<hr> | |||
<address>&copy; HD. Kirmse, 10.11.2005</address> | |||
</body> | |||
</html> | |||
ENDE | |||
<font color="#C0C0C0"><i># wir geben das gesamte Formular als String zurueck</i></font> | |||
return $header.$formular | |||
} | |||
<font color="#C0C0C0"><i># ---------------- Ende das Scripts ---------------------------</i></font> | |||
Version vom 13. November 2005, 14:18 Uhr
das Script
#!/usr/bin/perl -w use strict; # ---------------- Konfigurationsbereich ---------------------- # Anzahl der Spalten in der Tabelle fuer die Auswahl der Klassen my $anzspalten = 6; # das Kommando, dass an den LDAP abgesetzt wird my $kommando = "ich werden den doch hoffentlich noch bekommen :)"; # ---------------- Initialisierungsbereich -------------------- my ($lehrer,@daten,%schueler,$klassen,$teilnehmer,$projekte); my ($datei1,$datei2,$zeit,$liste1,$liste2,$formular); # wir basteln uns eine Zeitmarkierung z.B. 2005-11-5--9-27 my ($sek,$min,$st,$tag,$monat,$jahr,$wt,$tj,$sz) = localtime(time); $zeit = ($jahr+1900).'-'.($monat+1).'-'.$tag.'--'.$st.'-'.$min; # der Dateiname fuer die Zuordnung Schueler-Klasse $datei1 = 'schueler.'.$zeit.'.txt'; # der Dateiname fuer die Zuordnung Projektgruppe-Klasse $datei2 = 'teilnehmer.'.$zeit.'.txt'; # ---------------- Hauptprogramm ------------------------------ # es holt sich das Login des Lehrers (aus der Umgebungsvariablen?) # $lehrer = ... # es setzt ein Shellkommando an den LDAP ab @daten = &hole_daten($kommando); # es erstellt eine Schülerliste (Login -> Klasse) %schueler = &erstelle_schuelerliste(@daten); # diese Schülerliste wird abgespeichert &speichern_schuelerliste($datei1,%schueler); # es erstellt eine Klassenliste (z.B. 5a, 5b, 6a, ...) $liste1 = &erstelle_klassenliste(%schueler); # es erstellt ein Formular $formular = &erstelle_formular($liste1,$anzspalten); print $formular; # ---------------- Prozeduren --------------------------------- #-------------------------------------------------------------------- # Funktion: holt mit einem Shell-Aufruf die Daten aus dem LDAP # Aufruf: @daten = &hole_ldif-Daten($kommando); # Input: der Shellaufruf als String # Output: quasi ein "LDIF-File" als Liste # Bemerk.: Shellaufruf mit eval, d.h. kein Abbruch bei Fehler # : !!! z.Zeit einfach ein passwd-Aufruf als Dummy !!! # Update: 12.11.2005 #-------------------------------------------------------------------- sub hole_daten { my $kommando = shift; # es wird hier als Dummy erstmal eine LDIF-Datei eingelesen. # solange die nicht zur Verfügung steht, eine passwd open (DATEI,'<passwd') or die "passwd konnte nicht geoeffnet werden"; my @daten = <DATEI>; close DATEI; return @daten } #-------------------------------------------------------------------- # Funktion: holt aus dem ldif-File die Logins und die Klasse # Aufruf: %schueler = &erstelle_schuelerliste_aus_ldif(@daten); # Input: das ldif-file als Liste # Output: einen Hash %schueler Login -> Klasse # Bemerk.: derzeit nicht eingebunden, es ist nur eine # Vermutung, dass das LDIF so aussieht # Update: 12.11.2005 #-------------------------------------------------------------------- sub erstelle_schuelerliste_aus_ldif { my @daten = @_; my ($login,$klasse,%schueler); # fuer jede Zeile der Daten tue foreach my $zeile (@daten) { # wenn die Zeile mit gecos beginnt, dann if ($zeile =~ /^gecos:(.*)$/) { # zerlege den Klammerausdruck beim Komma in Login und Klasse ($login,$klasse) = split ',' , $1; # erstelle die Zuordnung Login -> Klasse (Hash: %schueler) $schueler{$login} = $klasse; } } # den Hash (die Zuordnung) %schueler geben wir zurueck return %schueler } #-------------------------------------------------------------------- # Funktion: holt aus der passwd die Logins und die Klasse # Aufruf: %schueler = &erstelle_schuelerliste(@daten); # Input: die passwd als Liste: @daten # Output: einen Hash %schueler Login -> Klasse # Bemerk.: hat nur Dummy-funktion, da kein LDIF-file zur Verfuegung # Update: 10.11.2005 #-------------------------------------------------------------------- sub erstelle_schuelerliste { my @daten = @_; my ($login,$klasse,%schueler,@temp); # fuer jede Zeile der Daten tue foreach my $zeile (@daten) { # wir zerlegen die Zeile @temp = split ':', $zeile; # wenn die Zeile mit gecos beginnt, dann if ($temp[3] == 102) { # zerlege den Klammerausdruck beim Komma in Login und Klasse ($login,$klasse) = split ',' , $temp[4]; # erstelle die Zuordnung Login -> Klasse (Hash: %schueler) if (defined($klasse)) { $schueler{$login} = $klasse } } } # den Hash (die Zuordnung) %schueler geben wir zurueck return %schueler } #-------------------------------------------------------------------- # Funktion: speichert den Hash %schueler # Aufruf: &speichern_schuelerliste(%schueler); # Input: das ldif-file als Liste # Output: enen Hash %schueler Login -> Klasse # Bemerk.: hat nur Dummy-funktion, da kein LDIF-file zur Verfuegung # Update: 10.11.2005 #-------------------------------------------------------------------- sub speichern_schuelerliste { my $datei = shift; my %schueler = @_; # oeffne die Datei $datei zum schreiben oder Abbruch mit Fehlermeldung open (DATEI,">$datei") or die "die Datei $datei konnte nicht geschrieben werden.\n$!"; # fuer jeden User des Hashs tue foreach my $user (keys %schueler) { # schreibe in die Datei das Login ein Leerzeichen und seine Klasse print DATEI $user, ' ', $schueler{$user}, "\n" } # schliesse die Datei close DATEI; } sub erstelle_klassenliste { my %schueler = @_; my %klassen = (); my $liste = ""; my $klasse = ""; # fuer jeden Schueler des Hashs tue foreach my $user (keys %schueler) { # speichere die Klasse des Schuelers in $klasse $klasse = $schueler{$user}; # bringe die Klasse in den Hash %klassen (vernichte Doubletten) $klassen{$klasse} = 1; } # fuer jede Klasse aus dem Hash %klassen foreach my $klasse (keys %klassen) { # hänge den Schluessel (also die Klasse) und ein Komma an $liste $liste .= $klasse.',' } # das letzte Komma war zuviel, also weg chop($liste); # gibt diesen String mit den Klassen zurueck return $liste } sub erstelle_formular { my $liste = shift; my $AnzSp = shift; my $header = "Content-type: text/html\n\n"; my $formular = ""; # das Formular wird als HERE-Dokument definiert. # dieses geht bis "ENDE", danach wird die Tabelle fuer die # Klassen gebaut. Dieses HERE-Dokument ist reines HTML! $formular .= <<ENDE; <head> <title>Webinterface für Fachlehrer - Austeilen</title> <meta name="author" content="HD.Kirmse"> </head> <body background="whttxtr2.jpg"> <h1> Für Fachlehrer: Austeilen von Dateien</h1> <hr noshade size="2"> <form action="/cgi-bin/kopieren.pl" method="post"> <p> <i>Geben Sie hier an, aus welchem Verzeichnis des Fachlehrers kopiert werden soll:</i><br> <b>Unterverzeichnis von u: </b> <input type="Text" name="quelle" value="austeilen" size="20" maxlength="80"> </p> <p> <i>Geben Sie hier an, in welches Verzeichnis des Schülers kopiert werden soll:</i><br> <b>Unterverzeichnis von u: </b> <input type="Text" name="ziel" value="einsammeln" size="20" maxlength="80"> </p> <hr noshade size="1"> <p> <i>Geben Sie hier an, welche Dateitypen kopiert werden sollen (Standard ist alle):</i><br> <b>alle: </b> <input type="Checkbox" name="alle" value="v"> <b>Word: </b><input type="Checkbox" name="word" value="v"> <b>Text: </b><input type="Checkbox" name="text" value="v"> </p> <hr noshade size="1"> <p> <table > <tr> <td width="7"> </td> <td><i>Geben Sie hier an, wie kopiert werden soll:</i></td> <td> </td> </tr> <tr> <td> </td> <td>kopierte Dateien beim Schüler <b>schreibgeschützt</b>: </td> <td><input type="Checkbox" name="readonly" value="v"></td> </tr> <tr> <td> </td> <td>auch aus Unterverzeichnissen (<b>rekursiv</b>) kopieren: </td> <td><input type="Checkbox" name="rekursiv" value="v"> </td> </tr> </table> </p> <hr noshade size="1"> <p> <table border="0"> <tr> <td width="7"> </td> ENDE # die naechste Zeile wurde nicht ins HERE-dokument genommen, weil die # Uebergabe der Anzahl der Spalten als Variable so sicherer erscheint $formular .= " <td colspan=\"$AnzSp\"><i>Wählen Sie hier die Klassen aus, deren Schüler Kopien erhalten sollen:</i></td>\n"; $formular .= '</tr>'; # und jetzt geht die Konstruktion der eigentlichen Tabelle los my $zelle = ""; my $zeile = ""; # wir holen uns ersteinmal alle Klassen my @liste = split ',', $liste; # und sortieren diese alphabetisch @liste = sort @liste; # wir bestimmen die Anzahl my $anzahl = @liste; # wenn die Anzahl der Klassen durch die Anzahl der Spalten einen Rest # ergibt, füllen wir die Liste der Klassen mit Leerzeichen als Klassen auf while (($anzahl % $AnzSp) > 0) { push @liste, ' '; $anzahl = @liste; } # der Zaehler ist 0 my $zaehler = 0; # fuer jede unserer Klassen foreach my $klasse (@liste) { # wir setzen von der Zelle die Breite und Hintergrundfarbe $zelle = '<td width="100" bgcolor="#F0F0F0">'; # wenn die Klasse kein Leerzeichen ist, dann if ($klasse ne ' ') { # kommt eine Checkbox $zelle .= "<input type=\"Checkbox\" name=\"$klasse\" value=\"v\"> "; $zelle .= "$klasse</td>\n"; # sonst } else { # nur ein Leerzeichen $zelle .= ' </td>'."\n"; } # wenn der Zaehler gleich 0 ist (also die erste Spalte), dann if ($zaehler == 0) { # beginnen wir mit <tr> und einem leeren Feld und dann die Zelle $zeile .= '<tr><td> </td>'.$zelle # wenn der Zaehler gleich Spaltenzahl-1 ist (letzte Spalte), dann } elsif ($zaehler == $AnzSp-1) { # haengen wir noch ein </tr> an die Zelle dran $zeile .= $zelle.'</tr>'."\n" # sonst (wenn nicht die erste oder letzte Spalte) } else { # haengen wir nur die Zelle an $zeile .= $zelle } # Zaehler um 1 erhoehen $zaehler++; # Zaehler ist der Rest bei Division durch Anzahl der Spalten, # wobei wir bei 0 mit zaehlen beginnen $zaehler = $zaehler % $AnzSp; } # wir haengen an unser formular noch diese Tabelle (Zeilen) an $formular .= $zeile.'</table>'."\n".'</p>'; # und haengen noch das Ende der HTML-Seite als HERE-Dokument an $formular .= <<ENDE; <input type="Submit" name="austeilen" value="kopieren"> </form> <br> <hr> <address>© HD. Kirmse, 10.11.2005</address> </body> </html> ENDE # wir geben das gesamte Formular als String zurueck return $header.$formular } # ---------------- Ende das Scripts ---------------------------
ein Screenshot
--Kirmse 00:32, 13. Nov 2005 (CET)