Benutzer:Kirmse/delixs-userdel

Aus Delixs
Version vom 21. Juni 2009, 16:49 Uhr von Kirmse (Diskussion | Beiträge) (Rückmeldungen ergänzt und Löschen in Subroutine ausgelagert)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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


das Script

<source lang="perl">

  1. !/usr/bin/perl

use warnings; use strict;

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

  1. dieses Script loescht einen User oder eine ganze Klasse

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

   @users, $klasse, $nscd_status, @ausgabe);
  1. Initialisieren der Variablen fuer die Parameter

$user = ; $class = ;

  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,
          'help'        => \&help);
  1. 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";

}

  1. 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";

}

  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. das Loeschen
  2. Wenn der User uebergeben wurde

if ($user ne ) {

 &user_delete($user);

}

  1. 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 );
 if (scalar @users == 0) {
   push @ausgabe, "Achtung: Es wurde kein Schueler in Klasse $class gefunden -> nichts geloescht.\n"
 }
 # fuer jeden dieser Schueler
 foreach my $schueler (@users) {
   &user_delete($schueler); 
 }

}

  1. wir trennen uns vom LDAP

$ldap->unbind;

  1. Ausgabe auf der Konsole (Liste ausgeben)

foreach my $element (@ausgabe) {

 print $element;

}

  1. 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);


                                      1. Programm-Ende #####################################
  1. die Routine zum User loeschen

sub user_delete {

 my $user = shift;
 # holen wir uns den DN und das Homeverzeichnis
 my $dn   = ;
 my $home = ;
   
 my $message = $ldap->search(base   => "uid=$user,ou=people,ou=accounts,$ldap_base",
                             filter => "uid=$user",
                             attrs  => 'homeDirectory');
                         
 # da Login eindeutig, haben wir nur einen Treffer 
 my $entry = ($message->entries)[0];
 if (defined($entry)) {
   $dn    = $entry->dn;
   $home  = $entry->get_value('homeDirectory');
   
   # jetzt loeschen wir im LDAP
   $message = $ldap->delete($dn);
   
   # jetzt loeschen wir das Homeverzeichnis
   system('rm', '-rf', $home);
   # Rueckmeldung in eine globale Liste, um Logfile und Konsole zu bedienen
   push @ausgabe, "User $user geloescht.\n"        
 }
 else {
   # Rueckmeldung in eine globale Liste, um Logfile und Konsole zu bedienen
   push @ausgabe, "Achtung: User $user wurde nicht gefunden -> nicht geloescht.\n"
 }

}


  1. 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
   }
 }

}

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

sub help {

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

}

__END__

</source>