Benutzer:Kirmse/delixs-userdel: Unterschied zwischen den Versionen

Aus Delixs
Zur Navigation springen Zur Suche springen
(erste Version zum Löschen von Usern)
 
(Rückmeldungen ergänzt und Löschen in Subroutine ausgelagert)
 
Zeile 11: Zeile 11:
* Aufruf: delixs-userdel -c 8c  
* 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 ====
==== das Script ====
Zeile 26: Zeile 25:
# dieses Script loescht einen User oder eine ganze Klasse
# dieses Script loescht einen User oder eine ganze Klasse


my ($ldap, $ldap_base, $pass, $mesg, $entry, $user, $class, $dn, $home,
my ($ldap, $ldap_base, $pass, $mesg, $entry, $user, $class,  
     @users, $klasse, $nscd_status);
     @users, $klasse, $nscd_status, @ausgabe);


# Initialisieren der Variablen fuer die Parameter
# Initialisieren der Variablen fuer die Parameter
Zeile 77: Zeile 76:
   or die "Abbruch: konnte mich nicht mit dem LDAP verbinden";
   or die "Abbruch: konnte mich nicht mit dem LDAP verbinden";


# das Loeschen
# Wenn der User uebergeben wurde
# Wenn der User uebergeben wurde
if ($user ne '') {
if ($user ne '') {
   # ueberpruefen wir, ob der User im LDAP ist
   &user_delete($user);
  $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
# wenn eine Klasse geloescht werden soll
Zeile 108: Zeile 88:
                         attrs    => ['uid', 'gecos'],
                         attrs    => ['uid', 'gecos'],
                         callback => \&user_liste );
                         callback => \&user_liste );
   # $mesg->code and die $mesg->error;
   if (scalar @users == 0) {
    
    push @ausgabe, "Achtung: Es wurde kein Schueler in Klasse $class gefunden -> nichts geloescht.\n"
   }
 
   # fuer jeden dieser Schueler
   # fuer jeden dieser Schueler
   foreach my $schueler (@users) {
   foreach my $schueler (@users) {
     # holen wir uns den DN und das Homeverzeichnis
     &user_delete($schueler);  
   
    $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
    }
   }
   }
}
}
Zeile 145: Zeile 102:


# Ausgabe auf der Konsole (Liste ausgeben)
# Ausgabe auf der Konsole (Liste ausgeben)
print "Bin fertig!\n";
foreach my $element (@ausgabe) {
  print $element;
}


# wir aktualisieren den NSCD (Nameserver Cache Daemon)
# wir aktualisieren den NSCD (Nameserver Cache Daemon)
Zeile 161: Zeile 120:
sub user_delete
sub user_delete
{
{
   # muss noch erstellt werden
  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"
  }
}
}


# Callback-Routine: wir suchen Eintraege mit der Klasse
# Callback-Routine: wir suchen Eintraege mit der Klasse

Aktuelle Version vom 21. Juni 2009, 16:49 Uhr

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>