Benutzer:Kirmse/delixs-classmod

Aus Delixs
Zur Navigation springen Zur Suche springen

delixs-classmod

  • Dieses Script dient dazu, einzelne Schüler oder alle Schüler einer Klasse zu versetzen.
  • Aufruf: delixs-classmod --user <login> --class <neue Klasse>

oder

  • Aufruf: delixs-classmod --oldclass <alte Klasse> --class <neue Klasse>
  • Hinweis: User muss ein Schüler sein (GID 1002)


das Script

<source lang="perl">

  1. !/usr/bin/perl

use warnings; use strict;

use Net::LDAP; use Getopt::Long;


my ($ldap, $ldap_base, $pass, $mesg, $entry, $user, $uid, $class,

   $oldclass, $name, $klasse, @liste);
  1. Initialisieren der Variablen fuer die Parameter

$user = ; $class = ; $oldclass = ;

  1. wir holen uns zuerst die Parameter,
  2. falls --help, dann Ausgabe der Hilfe (siehe &help) und beenden

GetOptions('user=s' => \$user,

          'class=s'     => \$class,
          'oldclass=s'  => \$oldclass,  
          'help'        => \&help);
  1. Wenn weder --user noch --oldclass uebergeben, dann Abbruch

if ($user eq and $oldclass eq ) {

 die "Abbruch: es muss uebergeben werden, wer versetzt werden soll!\n";

}

  1. Wenn --user und --oldclass uebergeben, dann auch Abbruch

if ($user ne and $oldclass ne ) {

 die "Abbruch: es kann entweder nur --user oder --oldclass aufgerufen werden!\n";

}

  1. Wenn --class nicht uebergeben, dann Abbruch

if ($class eq ) {

 die "Abbruch: es muss uebergeben werden, in welche Klasse versetzt werden soll!\n";

}

  1. Wenn wir keine root-Rechte haben, dann Abbruch

if ($> != 0) { # siehe $EFFECTIVE_USER_ID,$EUID

 die "Abbruch: das Script muss mit root-Rechten ausgefuehrt werden!\n";

}

  1. wir holen uns die Such-Basis ($ldap_base) aus der ldap.conf

open DATEI, '<', '/etc/ldap/ldap.conf'

 or die "Abbruch: konnte ldap.conf nicht oeffnen, $!\n";

while (my $zeile = <DATEI>) {

 if ($zeile =~ m/^\s*base\s+(\w.*\w)\s*$/i) {
   $ldap_base = $1;
   last;
 }

} close DATEI;

  1. da wir (spaeter) in den LDAP schreiben wollen, brauchen wir noch das Passwort

open DATEI, '<', '/etc/ldap.secret'

 or die "Abbruch: konnte ldap.secret nicht oeffnen, $!\n";

$pass = <DATEI>; chomp($pass); close DATEI;

  1. wir verbinden uns mit dem LDAP

$ldap = Net::LDAP->new('127.0.0.1', version => 3) or die "Abbruch: $@"; $ldap->bind( dn => "cn=admin, $ldap_base", password => $pass)

 or die "Abbruch: konnte mich nicht mit dem LDAP verbinden";
  1. wenn --user uebergeben wurde,

if ($user ne ) {

 $mesg = $ldap->search(base => "ou=people,ou=accounts,$ldap_base",
                       filter => "uid=$user",
                       attrs  => ['gidNumber', 'gecos'] );
 # Wenn der User nicht gefunden wird  dann Abbruch
 if (scalar ($mesg->entries) == 0) {
   die "Abbruch: Der User $user existiert nicht im LDAP!\n";
 }
 # Wenn der User kein Schueler ist, dann Abbruch
 $entry = ($mesg->entries)[0];
 unless ($entry->get_value('gidNumber') == 1002) {
   die  "Abbruch: Der User $user ist kein Schüler!\n";
 } 
 # jetzt wird die neue Klasse eingetragen
 ($name, $klasse) = split /,/ , $entry->get_value('gecos');
 $mesg = $ldap->modify( $entry->dn,
                        replace => { 'gecos' => "$name,$class" } );
 $mesg->code and die $mesg->error;
 
 # Rueckmeldung auf der Kommando-Zeile
 print "User $user in Klasse $class versetzt!\n";

}

  1. wenn --oldclass uebergeben wurde

else {

 $mesg = $ldap->search(base     => "ou=people,ou=accounts,$ldap_base",
                       filter   => 'gidNumber=1002',
                       attrs    => ['uid', 'gecos'],
                       callback => \&user_liste );
 $mesg->code and die $mesg->error;
 # fuer jeden Schueler der Klasse aendern wir das GECOS-Feld
 foreach my $entry (@liste) {
   ($name, $klasse) = split /,/ , $entry->get_value('gecos');
   # wir aendern das GECOS-Feld im LDAP
   $ldap->modify( $entry->dn,
                  replace => { 'gecos' => "$name,$class" } );
   $uid = $entry->get_value('uid');
   # Rueckmeldung auf der Kommando-Zeile
   print "User $uid in Klasse $class versetzt!\n";
 }

}

  1. wir trennen uns vom LDAP

$ldap->unbind;


                                      1. Programm-Ende #####################################
  1. die Callback-Funktion

sub user_liste { # wir suchen Eintraege mit der (alten) Klasse

  my ($mesg, $entry) = @_;
  if (defined($entry)) {
    my ($name, $klasse) = split /,/ , $entry->get_value('gecos');
    if ($klasse eq $oldclass) {
      push @liste, $entry;     # Liste ist eine globale Variable
    }
  }

}


  1. Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden

sub help {

  print "Hilfe muss noch erstellt werden.\n";
  exit (0);

}

__END__


</source>