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

script1



#!/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);

@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 legen die Datei an (und lassen sie offen)
open DATEI1, '>', $file
  or die "Abbruch: die Datei $file konnte nicht geoeffnet werden. $!\n";


################# 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 jetzt die Mitglieder der Gruppe (Rolle)
$mesg = $ldap->search(base   => $dn_of_roles{$role},
                      filter => "cn=$role",
                      attrs  => ['member', 'memberUid'] );
$entry   = ($mesg->entries)[0];               # nur ein Element in der Liste
@members = $entry->get_value('memberUid');    # dass ist eine Liste von Logins

# fuer die Ausgabe auf der Kommandozeile holen wir uns die Anzahl
$anz = @members;

# wir speichern alle Elemente der Liste @members in der Datei
foreach my $element (@members) {
  print DATEI1 $element, "\n";
}
close DATEI1;

# alle Eintraege in dieser Rolle loeschen
$mesg = $ldap->modify( $dn_of_roles{$role},
                       delete => ['member', 'memberUid'] );
# wenn Fehlercode, dann das Script mit Fehlermeldung sterben lassen
$mesg->code and die "Abbruch: $mesg->error";

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


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

print "Es wurden $anz Eintraege in der Rolle $role geloescht und in $file geschrieben.\n";


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

# Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden
sub help
{
   print "Dieses Script dient dazu, alle Eintraege einer Rolle zu loeschen.\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.: script1 -r teachers -f daten.txt\n";

   exit (0);
}

__END__






Reply to: