Benutzer:Kirmse/flehrer01: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Kirmse (Diskussion | Beiträge) K Login des angemeldeten Lehrers wird ermittelt |
K 3 Versionen |
(kein Unterschied)
| |
Aktuelle Version vom 4. März 2008, 21:08 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 REMOTE_USER)
$lehrer = $ENV{REMOTE_USER};
# 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)