#!/usr/bin/perl -w
# This script (examplix-ldapsearch) was created by Rüdiger Beck
# It is released under the GPL Version 3
# For Bugs send mail to:
# jeffbeck@web.de

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

# insert this to the examplix script
# make host, port, classes configurable with options
# Bei no connect: give hints on port/servername

my $help=0;

# portnumber
my $port=636; # 636
my $host="10.16.1.1";
my $class="";
my @student_list=();


# Parsen der Optionen
my $testopt=GetOptions(
           "port|p=s" => \$port,
           "help|h" => \$help,
           "host=s" => \$host,
           "class|c=s" => \$class,
          );

# Prüfen, ob Optionen erkannt wurden, sonst Abbruch
&check_options($testopt);


# --help
if ($help==1) {
   # Scriptname ermitteln
   my @list = split(/\//,$0);
   my $scriptname = pop @list;
   # Befehlsbeschreibung
   print('
examplix-ldapsearch queries an lDAP-Server for users.  

Options
  -h  / --help

Select LDAP-Server:
  --host <hostname>/<IP>       i.e. localhost
  --port <portnumber>          i.e. 389/636/10636

Select group:
  --class <adminclass/group>   i.e. m2kk3t

');
   print "\n";
   exit;
}


if ($class eq ""){
    print "\n";
    print "ERROR: What class are you looking for?\n";
    print "       use -c <classname>\n";
    print "\n";
    exit;
}

my $url="ldaps://".$host.":".$port;

print "Connecting with:\n";
print "   URL: $url\n";
print "   Class: $class\n";

my $ldap = Net::LDAP->new( $url) or 
           die "\nERROR: Not connected!\n\n";
my $mesg = $ldap->bind ;    # an anonymous bind

$mesg = $ldap->search( # perform a search
                        base   => "ou=groups,dc=bszleo,dc=de",
                        filter => "cn=$class"
                      );

$mesg->code && die $mesg->error;
 
#@entries = $mesg->entries;

my $entry = $mesg->entry(0);
my @members=$entry->get_value('memberUid');
my $gidnumber=$entry->get_value('gidNumber');

print "$class ($gidnumber)\n";
foreach my $member (@members){
    #print "    Member: $member\n";
    my $account = $ldap->search( # perform a search
                         base   => "ou=accounts,dc=bszleo,dc=de",
                         filter => "uid=$member"
                      );
    my $account_entry = $account->entry(0);
    my $pri_gidnumber=$account_entry->get_value('gidNumber');
    my $surname=$account_entry->get_value('sn');
    my $given_name=$account_entry->get_value('givenName');
    my $uidnumber=$account_entry->get_value('uidNumber');
    #print "      * Primary Group ID Number:  $pri_gidnumber\n";
    if ($gidnumber==$pri_gidnumber){
        # This is a student in the class
        # print "      * YES\n";
        #my $line=$given_name." ".$surname." ".$uidnumber."\n";
        my $line=$surname.", ".$given_name.":---:---:".$class."==".
           $surname.", ".$given_name.":---:---:".$class."\n";
        push @student_list, $line;
    }
}

#foreach $entry ($mesg->entries) { $entry->dump; }
 
$mesg = $ldap->unbind;   # take down session

@student_list = sort @student_list;

# write the file
foreach my $line (@student_list){
    print $line;
}


sub  check_options{
   my ($parse_ergebnis) = @_;
   if (not $parse_ergebnis==1){
      my @list = split(/\//,$0);
      my $scriptname = pop @list;
      print "\nYou have made a mistake, when specifying options.\n"; 
      print "See error message above. \n\n";
      print "... $scriptname is terminating.\n\n";
      exit;
   } else {
      print "All options  were recognized.\n";
   }

}
