script2

Hans-Dietrich Kirmse hd.kirmse at gmx.de
Tue Jan 12 21:56:02 CET 2010


#!/usr/bin/perl
use warnings;
use strict;

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


############ Lizenz, Autor und Copyright ####################

# dieses Script unterliegt der GPLv3
# (c) Hans-Dietrich Kirmse <hd.kirmse at gmx.net>


############ Konfigurationsteil #############################

# hier wird die Datei angegeben, wo das LDAP-Root-Passwort
# ausgelesen werden kann. Mögliche Files sind /etc/ldap.secret
# und /etc/pam_ldap.secret. Prinzipiell ist es auch auch bei
# den smbldap-Tools hinterlegt, aber dann muss die Routine
# angepasst werden oder ...
my $passfile = '/etc/pam_ldap.secret';

# die entsprechenden DNs fuer die Rollen
my %dn_of_roles = (
   teachers => 'cn=teachers,ou=Group,dc=skole,dc=skolelinux,dc=no',
   students => 'cn=students,ou=Group,dc=skole,dc=skolelinux,dc=no',
   admins   => 'cn=admins,ou=Group,dc=skole,dc=skolelinux,dc=no',
   jradmins => 'cn=jradmins,ou=Group,dc=skole,dc=skolelinux,dc=no');

# der DN für den LDAP-Admin
my $dn = 'cn=admin,ou=People,dc=skole,dc=skolelinux,dc=no';


################# Variablen & Co ############################

my ($ldap, $pass, $mesg, $entry, $role, $file, %param, @rollen,
     @members, $anz, @newmembers, $help, @neu);

@rollen = keys %dn_of_roles;


################# Parameter #################################

# wir holen die Parameter
GetOptions(  'role|r=s'     => \$param{'role'},
              'file|f=s'     => \$param{'file'},
              'help|h'       => \$param{'help'} );


# wenn help aufgerufen wurde, dann die Subroutine aufrufen
if (defined($param{'help'})) {
   &help;
}

# wir testen, ob beide Parameter uebergeben wurden
if (!defined($param{'role'}) or $param{'role'} eq '' or
     !defined($param{'file'}) or $param{'file'} eq '') {
   die "Abbruch: es muessen beide Parameter -r und -f uebergeben werden!\n";
}

# wir holen uns den Value des Parameters in eine eigene Variable
$role  = $param{'role'};
$file  = $param{'file'};

# Der Parameter -r muss in @rollen aufgelistet sein
$anz = grep /^$role$/, @rollen;
if ( $anz == 0) {
   die "Abbruch: Diese Rolle $role gibt es bei Skolelinux nicht!\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 lesen die Logins aus der Datei ein
open DATEI1, '<', $file
   or die "Abbruch: die Datei $file konnte nicht geoeffnet werden. $!\n";
@newmembers = <DATEI1>;  # eine while-Schleife lohnt den Aufwand nicht ;)
close DATEI1;
chomp(@newmembers);


################# LDAP ######################################

# da wir in den LDAP schreiben wollen, holen wir das Passwort
open DATEI2, '<', $passfile
     or die "Abbruch: konnte  $passfile nicht oeffnen, $!\n";
$pass = <DATEI2>;
close DATEI2;
chomp($pass);

# wir verbinden uns mit dem LDAP
$ldap = Net::LDAP->new('127.0.0.1', version => 3) or die "Abbruch: $@";
$ldap->bind( dn => $dn, password => $pass)
   or die "Abbruch: konnte mich nicht mit dem LDAP verbinden";


# wir holen uns die schon vorhandenen Mitglieder der Gruppe (Rolle)
$mesg = $ldap->search(base   => $dn_of_roles{$role},
                       filter => "cn=$role",
                       attrs  => ['memberUid'] );
$entry   = ($mesg->entries)[0];                 # nur ein Element in der Liste
@members = $entry->get_value('memberUid');      # dass ist eine Liste von Logins

# wir ermitteln jetzt, welche Logins noch nicht in der Gruppe eingetragen sind
foreach my $eintrag (@newmembers) {
   $anz = grep /^$eintrag$/, @members;
   if ($anz == 0) {   # also wenn nicht gefunden
     $help = 'uid=' . $eintrag . ',ou=People,dc=skole,dc=skolelinux,dc=no';
     $mesg = $ldap->modify( $dn_of_roles{$role},
                            add => { member    => [ $help    ] } ,
                            add => { memberUid => [ $eintrag ] } );
     push @neu, $eintrag;
   }
}

# wir trennen uns vom LDAP
$ldap->unbind;


################# Ausgabe ###################################

print "Es wurden folgende User in die Rolle $role eingetragen: \n";
foreach my $login (@neu) {
   print $login, ' ';
}
print "\n";


################# Programm-Ende #############################

# Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden
sub help
{
    print "Dieses Script dient dazu, weitere Eintraege einer Rolle hinzuzufuegen.\n";
    print "Parameter: --help oder -h, --role oder -r , --file oder -f\n";
    print "moegliche Rollen sind: teachers, students, admins, jradmins\n";
    print "die Reihenfolge der Parameter ist beliebig.\n";
    print "Aufruf z.B.: script2 -r teachers -f daten.txt\n";

    exit (0);
}

__END__





More information about the User mailing list