Benutzer:Kirmse/flehrer01: Unterschied zwischen den Versionen

Aus Delixs
Zur Navigation springen Zur Suche springen
K (das derzeit vollständige Script)
K (Login des angemeldeten Lehrers wird ermittelt)
Zeile 31: Zeile 31:
  <font color="#C0C0C0"><i># ---------------- Hauptprogramm ------------------------------</i></font>
  <font color="#C0C0C0"><i># ---------------- Hauptprogramm ------------------------------</i></font>
   
   
  <font color="#C0C0C0"><i># es holt sich das Login des Lehrers (aus der Umgebungsvariablen?)</i></font>
  <font color="#C0C0C0"><i># es holt sich das Login des Lehrers (aus der Umgebungsvariablen REMOTE_USER)</i></font>
  <font color="#C0C0C0"><i># $lehrer = ...</i></font>
  $lehrer = $ENV{REMOTE_USER};
   
   
  <font color="#C0C0C0"><i># es setzt ein Shellkommando an den LDAP ab</i></font>
  <font color="#C0C0C0"><i># es setzt ein Shellkommando an den LDAP ab</i></font>

Version vom 13. November 2005, 17:45 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>&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

  # 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 .= '&nbsp;</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>&nbsp;</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.'&lt;/tr&gt;'.&quot;\n&quot;
    # 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>&copy; 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

Datei:Austeilen.png

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