Benutzer:Kirmse/delixs-userlist
delixs-userlist
- Grundlage fuer dieses Script ist http://www.arktur.th.schule.de/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">
- !/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 = ();
- Initialisieren der Variablen fuer die Parameter
$kategorie = ; $class = ;
%filter = ( SCHUELER => 'gidNumber=1002',
LEHRER => 'gidNumber=1001', KLASSEN => 'gidNumber=1002', ALL => '(|(gidNumber=1001)(gidNumber=1002))' );
- wir holen uns zuerst die Parameter,
- falls --help, dann Ausgabe der Hilfe (siehe &help) und beenden
GetOptions('kategorie=s' => \$kategorie,
'class=s' => \$class, 'help' => \&help);
- 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"
}
- 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"; }
}
- Wenn nur --class uebergeben, dann setzen wir --kategorie=SCHUELER
if ($kategorie eq ) {
$kategorie = 'SCHUELER';
}
- --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";
}
- 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;
- 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";
- 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');
}
- wir trennen uns vom LDAP
$ldap->unbind;
- 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;
}
- wir sortieren noch
@liste = sort @liste;
- wir geben die Liste aus
if (scalar @liste > 0) {
foreach my $element (@liste) { print $element, "\n"; }
} else {
print "Warnung: keinen entsprechenden User gefunden!\n";
}
- Programm-Ende #####################################
- Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden
sub help {
print "Hilfe muss noch erstellt werden.\n"; exit (0);
}
__END__
</source>