Benutzer:Kirmse/delixs-userdel
delixs-userdel
- Dieses Script dient dazu, User oder ganze Klassen zu löschen
- Parameter: --help oder -h, --user oder -u, --class oder -c
- Aufruf: delixs-userdel -u mmustermann
oder
- Aufruf: delixs-userdel -c 8c
Achtung: Dieses Scriopt ist noch nicht fertig! es löscht zwar wie angegeben, liefert aber noch keine sinnvolle Rückmeldung auf der Kommandozeile. Zudem ist angedacht, das eigentliche Löschen in eine Subroutine auszulagern, um die zu pflegende Codemenge zu reduzieren.
das Script
<source lang="perl">
- !/usr/bin/perl
use warnings; use strict;
use Net::LDAP; use Getopt::Long;
- dieses Script loescht einen User oder eine ganze Klasse
my ($ldap, $ldap_base, $pass, $mesg, $entry, $user, $class, $dn, $home,
@users, $klasse, $nscd_status);
- Initialisieren der Variablen fuer die Parameter
$user = ; $class = ;
- wir holen uns zuerst die Parameter,
- falls --help, dann Ausgabe der Hilfe (siehe &help) und beenden
GetOptions('user=s' => \$user,
'class=s' => \$class, 'help' => \&help);
- Wenn weder --user noch --class uebergeben, dann Abbruch
if ($user eq and $class eq ) {
die "Abbruch: es wurden nicht uebergeben, wer geloescht werden soll!\n";
}
- Wenn --user und --class uebergeben, dann auch Abbruch
if ($user ne and $class ne ) {
die "Abbruch: es kann entweder nur --user oder --class uebergeben werden!\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 der User uebergeben wurde
if ($user ne ) {
# ueberpruefen wir, ob der User im LDAP ist $mesg = $ldap->search(base => "ou=people,ou=accounts,$ldap_base", filter => "uid=$user", attrs => 'homeDirectory'); # Wenn der User nicht gefunden wird dann Abbruch if (scalar ($mesg->entries) == 0) { die "Abbruch: Der User $user existiert nicht im LDAP!\n"; }
# da Login eindeutig, haben wir nur einen Treffer => ein Element in der Liste $entry = ($mesg->entries)[0]; $dn = $entry->dn; $home = $entry->get_value('homeDirectory'); # jetzt loeschen wir im LDAP $mesg = $ldap->delete($dn); $mesg->code and die "Abbruch: ", $mesg->error; # jetzt loeschen wir das Homeverzeichnis # noch testen, ob das Homeverzeichnis existiert system('rm', '-rf', $home);
}
- wenn eine Klasse geloescht werden soll
else {
# wir suchen alle Schueler der Klasse $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 dieser Schueler foreach my $schueler (@users) { # holen wir uns den DN und das Homeverzeichnis $dn = ; $home = ; $mesg = $ldap->search(base => "uid=$schueler,ou=people,ou=accounts,$ldap_base", filter => "uid=$schueler", attrs => 'homeDirectory'); # da Login eindeutig, haben wir nur einen Treffer $entry = ($mesg->entries)[0]; if (defined($entry)) { $dn = $entry->dn; $home = $entry->get_value('homeDirectory'); # jetzt loeschen wir im LDAP $mesg = $ldap->delete($dn); # jetzt loeschen wir das Homeverzeichnis system('rm', '-rf', $home);
# Rueckmeldung in eine Liste, um Logfile und Konsole zu bedienen } else { # Rueckmeldung in eine Liste, um Logfile und Konsole zu bedienen } }
}
- wir trennen uns vom LDAP
$ldap->unbind;
- Ausgabe auf der Konsole (Liste ausgeben)
print "Bin fertig!\n";
- wir aktualisieren den NSCD (Nameserver Cache Daemon)
$nscd_status = system "/etc/init.d/nscd status >/dev/null 2>&1"; if ($nscd_status == 0) {
system "/etc/init.d/nscd restart > /dev/null 2>&1";
}
exit(0);
- Programm-Ende #####################################
- die Routine zum User loeschen
sub user_delete {
# muss noch erstellt werden
}
- Callback-Routine: wir suchen Eintraege mit der Klasse
sub user_liste {
my ($mesg, $entry) = @_;
if (defined($entry)) { my ($name, $klasse) = split /,/ , $entry->get_value('gecos'); if ($klasse eq $class) { push @users, $entry->get_value('uid'); # das login wird gepusht } }
}
- Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden
sub help {
print "Hilfe muss noch erstellt werden.\n"; exit (0);
}
__END__
</source>