Benutzer:Kirmse/flehrer01
Zur Navigation springen
Zur Suche springen
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;
jetzt kommt leider Murks, weil das HERE-Dokument nicht richtig angezeigt wird (wegen den HTML-Befehlen). Da muss ich mir doch noch was einfallen lassen.
ein Screenshot
--Kirmse 00:32, 13. Nov 2005 (CET)