Benutzer:Kirmse/flehrer01

Aus Delixs
Version vom 12. November 2005, 23:32 Uhr von Kirmse (Diskussion | Beiträge) (ein Teil des Scripts und Screenshot)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
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

Datei:Austeilen.png

--Kirmse 00:32, 13. Nov 2005 (CET)