Benutzer:Kirmse/delixs-userlist

Aus Delixs
Zur Navigation springen Zur Suche springen

delixs-userlist

  • Dieses Script dient dazu, User (Lehrer, Schüler, Klassen) aufzulisten.
  • Aufruf: delixs-userlist --help

oder

  • Aufruf: delixs-userlist --kategorie LEHRER       (oder SCHUELER oder ALL oder KLASSEN)

oder

  • Aufruf: delixs-userlist --class 8b
  • Hinweis: wenn --class aufgerufen wurde, dann sollte --kategorie nicht aufgerufen werden oder muss mit SCHUELER belegt werden, sonst Abbruch.


das Script

<source lang="perl">

  1. !/usr/bin/perl

use warnings; use strict;

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


my ($ldap, $ldap_base, $mesg, $kategorie, $class, %filter, @user, @liste,

   $login, $name, $klasse, %temp);

@user = (); @liste = ();


  1. Initialisieren der Variablen fuer die Parameter

$kategorie = ; $class = ;

%filter = ( SCHUELER => 'gidNumber=1002',

           LEHRER   => 'gidNumber=1001',
           KLASSEN  => 'gidNumber=1002',
           ALL      => '(|(gidNumber=1001)(gidNumber=1002))' );


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

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

          'class=s'     => \$class,
          'help'        => \&help);


  1. Wenn weder Parameter --kategorie noch --class uebergeben, dann Abbruch

if ($kategorie eq and $class eq ) {

 die "Abbruch: es muss entweder --kategorie oder --class angegeben werden!\n"

}

  1. Wenn --class und --kategorie uebergeben,

if ($kategorie ne and $class ne ) {

 # dann muss --kategorie SCHUELER sein
 if ($kategorie ne 'SCHUELER') {
   die "Abbruch: wenn beide Parameter uebergeben, dann -k=SCHUELER !\n";
 }

}

  1. Wenn nur --class uebergeben, dann setzen wir --kategorie=SCHUELER

if ($kategorie eq ) {

 $kategorie = 'SCHUELER';

}

  1. --kategorie muss nun SCHUELER | LEHRER | KLASSEN oder ALL sein

unless ($kategorie eq 'SCHUELER' or $kategorie eq 'LEHRER' or

       $kategorie eq 'KLASSEN'  or $kategorie eq 'ALL') {
 die "Abbruch: --kategorie muss SCHUELER, LEHRER, KLASSEN oder ALL sein!\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. wir verbinden uns mit dem LDAP

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

  1. wir holen uns das uid- und das GECOS-Feld

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

                     filter => $filter{$kategorie},
                     attrs  => ['uid', 'gecos'] );

foreach my $entry ($mesg->entries) {

 # Format der Listeneintraege: dmobby,Mobby Dick,abi2012
 push @user, $entry->get_value('uid') . ',' . $entry->get_value('gecos');

}

  1. wir trennen uns vom LDAP

$ldap->unbind;

  1. wir "filtern" noch die Ergebnisse der LDAP-Suche entsprechend der Parameter

if ($kategorie eq 'KLASSEN') {

 # wir holen uns die Klasse und stecken die in einen Hash. Dadurch werden
 # automatisch Doubletten vernichtet. Dann erstellen wir eine Liste.
 foreach my $eintrag (@user) {
   ($login, $name, $klasse) = split /,/, $eintrag;
   $temp{$klasse} = 1;                     # die "1" ist nur ein Dummy
 }
 foreach my $key (sort keys %temp) {
   push @liste, $key;
 }

} elsif ($kategorie eq 'SCHUELER' and $class ne ) {

 foreach my $eintrag (@user) {
   ($login, $name, $klasse) = split /,/, $eintrag;
   if ($klasse eq $class) {
     push @liste, $login . ',' . $name;
   }
 }

} elsif ($kategorie eq 'LEHRER') {

 foreach my $eintrag (@user) {
   ($login, $name, $klasse) = split /,/, $eintrag;
   push @liste, $login . ',' . $name;
 }

} else {

 @liste = @user;

}

  1. wir sortieren noch

@liste = sort @liste;

  1. wir geben die Liste aus

if (scalar @liste > 0) {

 foreach my $element (@liste) {
   print $element, "\n";
 }

} else {

 print "Warnung: keinen entsprechenden User gefunden!\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>