Benutzer:Kirmse/flehrer01: Unterschied zwischen den Versionen

Aus Delixs
Zur Navigation springen Zur Suche springen
(ein Teil des Scripts und Screenshot)
 
K (3 Versionen)
 
(2 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
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>
Zeile 199: Zeile 199:
   $formular .= <<ENDE;
   $formular .= <<ENDE;
   
   
 
&lt;head&gt;
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.
&lt;title&gt;Webinterface für Fachlehrer - Austeilen&lt;/title&gt;
&lt;meta name=&quot;author&quot; content=&quot;HD.Kirmse&quot;&gt;
&lt;/head&gt;
&lt;body background=&quot;whttxtr2.jpg&quot;&gt;
&lt;h1&gt;&amp;nbsp;Für Fachlehrer: Austeilen von Dateien&lt;/h1&gt;
&lt;hr noshade size=&quot;2&quot;&gt;
&lt;form action=&quot;/cgi-bin/kopieren.pl&quot; method=&quot;post&quot;&gt;
&lt;p&gt;
&amp;nbsp; &amp;nbsp;&lt;i&gt;Geben Sie hier an, aus welchem Verzeichnis des Fachlehrers kopiert werden soll:&lt;/i&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp;&lt;b&gt;Unterverzeichnis von u: &lt;/b&gt; &lt;input type=&quot;Text&quot; name=&quot;quelle&quot; value=&quot;austeilen&quot; size=&quot;20&quot; maxlength=&quot;80&quot;&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; &amp;nbsp;&lt;i&gt;Geben Sie hier an, in welches Verzeichnis des Schülers kopiert werden soll:&lt;/i&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp;&lt;b&gt;Unterverzeichnis von u: &lt;/b&gt; &lt;input type=&quot;Text&quot; name=&quot;ziel&quot; value=&quot;einsammeln&quot; size=&quot;20&quot; maxlength=&quot;80&quot;&gt;
&lt;/p&gt;
&lt;hr noshade size=&quot;1&quot;&gt;
&lt;p&gt;
&amp;nbsp; &amp;nbsp;&lt;i&gt;Geben Sie hier an, welche Dateitypen kopiert werden sollen (Standard ist alle):&lt;/i&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp;&lt;b&gt;alle: &lt;/b&gt; &lt;input type=&quot;Checkbox&quot; name=&quot;alle&quot; value=&quot;v&quot;&gt; &lt;b&gt;Word: &lt;/b&gt;&lt;input type=&quot;Checkbox&quot; name=&quot;word&quot; value=&quot;v&quot;&gt; &lt;b&gt;Text: &lt;/b&gt;&lt;input type=&quot;Checkbox&quot; name=&quot;text&quot; value=&quot;v&quot;&gt;
&lt;/p&gt;
&lt;hr noshade size=&quot;1&quot;&gt;
&lt;p&gt;
&lt;table &gt;
&lt;tr&gt;
  &lt;td width=&quot;7&quot;&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;&lt;i&gt;Geben Sie hier an, wie kopiert werden soll:&lt;/i&gt;&lt;/td&gt;
  &lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;kopierte Dateien beim Schüler &lt;b&gt;schreibgeschützt&lt;/b&gt;: &lt;/td&gt;
  &lt;td&gt;&lt;input type=&quot;Checkbox&quot; name=&quot;readonly&quot; value=&quot;v&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&amp;nbsp;&lt;/td&gt;
  &lt;td&gt;auch aus Unterverzeichnissen (&lt;b&gt;rekursiv&lt;/b&gt;) kopieren: &lt;/td&gt;
  &lt;td&gt;&lt;input type=&quot;Checkbox&quot; name=&quot;rekursiv&quot; value=&quot;v&quot;&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;hr noshade size=&quot;1&quot;&gt;
&lt;p&gt;
&lt;table border=&quot;0&quot;&gt;
&lt;tr&gt;
  &lt;td width=&quot;7&quot;&gt;&amp;nbsp;&lt;/td&gt;
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 .= &quot; &lt;td colspan=\&quot;$AnzSp\&quot;&gt;&lt;i&gt;Wählen Sie hier die Klassen aus, deren Schüler Kopien erhalten sollen:&lt;/i&gt;&lt;/td&gt;\n&quot;;
  $formular .= '&lt;/tr&gt;';
  <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, '&nbsp;';
    $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  = '&lt;td width=&quot;100&quot; bgcolor=&quot;<font color="#C0C0C0"><i>#F0F0F0&quot;&gt;';</i></font>
    <font color="#C0C0C0"><i># wenn die Klasse kein Leerzeichen ist, dann</i></font>
    if ($klasse ne '&nbsp;') {
      <font color="#C0C0C0"><i># kommt eine Checkbox</i></font>
      $zelle .= &quot;&lt;input type=\&quot;Checkbox\&quot; name=\&quot;$klasse\&quot; value=\&quot;v\&quot;&gt; &quot;;
      $zelle .= &quot;$klasse&lt;/td&gt;\n&quot;;
    <font color="#C0C0C0"><i># sonst</i></font>
    } else {
      <font color="#C0C0C0"><i># nur ein Leerzeichen</i></font>
      $zelle .= '&amp;nbsp;&lt;/td&gt;'.&quot;\n&quot;;
    }
    <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 &lt;tr&gt; und einem leeren Feld und dann die Zelle</i></font>
      $zeile .= '&lt;tr&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;'.$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 &lt;/tr&gt; an die Zelle dran</i></font>
      $zeile .= $zelle.'&amp;lt;/tr&amp;gt;'.&amp;quot;\n&amp;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.'&lt;/table&gt;'.&quot;\n&quot;.'&lt;/p&gt;';
  <font color="#C0C0C0"><i># und haengen noch das Ende der HTML-Seite als HERE-Dokument an</i></font>
  $formular .= <<ENDE;
&lt;input type=&quot;Submit&quot; name=&quot;austeilen&quot; value=&quot;kopieren&quot;&gt;
&lt;/form&gt;
&lt;br&gt;
&lt;hr&gt;
&lt;address&gt;&amp;copy; HD. Kirmse, 10.11.2005&lt;/address&gt;
&lt;/body&gt;
&lt;/html&gt;
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>





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>&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)