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 uebergeben werden, 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>