Benutzer:Kirmse/delixs-classmod
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">
- !/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);
- Initialisieren der Variablen fuer die Parameter
$user = ; $class = ; $oldclass = ;
- wir holen uns zuerst die Parameter,
- falls --help, dann Ausgabe der Hilfe (siehe &help) und beenden
GetOptions('user=s' => \$user,
'class=s' => \$class, 'oldclass=s' => \$oldclass, 'help' => \&help);
- Wenn weder --user noch --oldclass uebergeben, dann Abbruch
if ($user eq and $oldclass eq ) {
die "Abbruch: es muss nicht uebergeben, wer versetzt werden soll!\n";
}
- 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";
}
- Wenn --class nicht uebergeben, dann Abbruch
if ($class eq ) {
die "Abbruch: es muss uebergeben werden, in welche Klasse versetzt werden soll!\n";
}
- 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";
}
- 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;
- 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;
- 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";
- 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";
}
- 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"; }
}
- wir trennen uns vom LDAP
$ldap->unbind;
- Programm-Ende #####################################
- 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 } }
}
- Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden
sub help {
print "Hilfe muss noch erstellt werden.\n"; exit (0);
}
__END__
</source>