Benutzer:Kirmse/delixs-usermod

Aus Delixs
Version vom 21. Juni 2009, 14:38 Uhr von Kirmse (Diskussion | Beiträge) (nun auch Behandlung von mehreren vor- und Nachnamen)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

delixs-usermod

  • Dieses Script dient dazu, von einem User die Daten zu aktualisieren (Vorname, Nachname, Klasse).
  • Aufruf: delixs-usermod --user <login> --name <neuer Nachname> --vorname <neuer Vorname> --class <neue Klasse>
  • Hinweis: --user ist zwingend, es muss mindestens ein Parameter von --name oder --vorname angegeben werden, --class ist optional


das Script

<source lang="perl">

  1. !/usr/bin/perl

use warnings; use strict;

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


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

   $name, $vorname, $temp, @temp);
  1. Initialisieren der Variablen fuer die Parameter

$user = ; $name = ; $vorname = ; $class = ;


  1. wir holen uns zuerst die Parameter,
  2. falls --help, dann Ausgabe der Hilfe (siehe &help) und beenden

GetOptions('user=s' => \$user,

          'name=s'      => \$name,
          'vorname=s'   => \$vorname,
          'class=s'     => \$class,
          'help'        => \&help);
  1. Wenn --user nicht uebergeben, dann Abbruch

if ($user eq ) {

 die "Abbruch: es muss uebergeben, wessen Daten geaendert werden sollen!\n";

}

  1. Wenn weder --name noch --vorname uebergeben, dann auch Abbruch

if ($name eq and $vorname eq ) {

 die "Abbruch: es wurden keine neuen Daten uebergeben!\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";

$mesg = $ldap->search(base => "ou=people,ou=accounts,$ldap_base",

                     filter => "uid=$user",
                     attrs  => 'gecos');
  1. Wenn der User nicht gefunden wird dann Abbruch

if (scalar ($mesg->entries) == 0) {

 die "Abbruch: Der User $user existiert nicht im LDAP!\n";

}

  1. jetzt werden die neuen Daten zusammengetragen

$entry = ($mesg->entries)[0]; ($temp, $klasse) = split /,/ , $entry->get_value('gecos');

  1. ($vname, $nname) = split /\s+/, $temp; # wir zerlegen den Name

@temp = split /\s+/, $temp; # wir zerlegen den Name

  1. wenn der Nachname und der Vorname nicht eindeutig zugeordnet werden kann

if (scalar @temp > 2) {

 if ($name eq  or $vorname eq ) {
   die "Abbruch: Da Vorname oder Nachname aus mehreren Woertern besteht,
        koennen die alten Werte nicht eindeutig zugeordnet werden.
        Geben Sie deshalb --name und --vorname an!\n";
 }

}

  1. wenn kein Nachname uebergeben wurde, dann nehmen wir den alten Nachname

if ($name eq ) {

 $name = $temp[1];

}

  1. Wenn kein Vorname uebergeben wurde, dann nehmen wir den alten Vorname

if ($vorname eq ) {

 $vorname = $temp[0];

}

  1. wenn keine Klasse uebergeben wurde, dann nehmen wir die alte Klasse

if ($class eq ) {

 $class = $klasse;  

}

  1. wir bauen uns den String fuer GECOS zusammen

$temp = $vorname . ' ' . $name . ',' . $class;

  1. und tragen den in den LDAP ein

$mesg = $ldap->modify( $entry->dn,

                      replace => { 'gecos' => $temp } );

$mesg->code and die $mesg->error;

  1. wir trennen uns vom LDAP

$ldap->unbind;

  1. Rueckmeldung auf der Kommando-Zeile

print "Von User $user wurden die Daten aktualisiert!\n";


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

sub help {

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

}

__END__


</source>