[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

script2



#!/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@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__





Reply to: