Benutzer:Kirmse/delixs-userdel

Aus Delixs
Version vom 21. Juni 2009, 14:48 Uhr von Kirmse (Diskussion | Beiträge) (erste Version zum Löschen von Usern)
(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

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">

  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, $dn, $home,

   @users, $klasse, $nscd_status);
  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. 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);  

}

  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 );
 # $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
   }
 }

}

  1. wir trennen uns vom LDAP

$ldap->unbind;

  1. Ausgabe auf der Konsole (Liste ausgeben)

print "Bin fertig!\n";

  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 {

 # muss noch erstellt werden

}

  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>