#!/usr/bin/perl -w
#
# set_default_access_for_room.pl
#
use strict;
use Net::LDAP;
use Net::Netmask;
# Hier bitte die Werte aus /etc/openldap/slapd.conf
# eintragen. Gesucht wird die "rootdn"
my $LDAP_BASE="ou=DHCP,dc=example,dc=com";
my $logfile="/var/log/set_default_access_for_room.log";
my $ip="";
my $user="noname";

# kleine Hilfe:
sub usage {
    print "Usage:  $0  <ip-address> [username]\n";
    exit 1;
}

# Wir brauchen mindestens eine IP - also bitte ;-)
usage() unless $ARGV[1] ne '';

if ( $ARGV[0] eq "-h" || $ARGV[0] =~ /-help$/ ) {
    usage();
}

$ip=$ARGV[0];

if ( defined($ARGV[1])) {
    $user = $ARGV[1];
}

# erst mal brauchen wir ein Objekt zum arbeiten:
my $ldap=Net::LDAP->new('ldap',port => 389 , version => 3) or die "Could not connect to LDAP Server: $!\n";

# jetzt schauen wir mal, ob wir eine Verbindung kriegen:
my $mesg = $ldap->bind ;

# ...und jetzt suchen wir im LDAP Baum:
$mesg = $ldap->search(base   => $LDAP_BASE,
                      filter => '(&(Objectclass=SchoolRoom)(description=*))',
                      attrs  => ['description','dhcpRange','dhcpNetMask']
					 );

# War das Ergebnis brauchbar?
if ( $mesg->code != 0 ){
    print STDERR "Keine Räume gefunden\n";
    $mesg = $ldap->unbind;
    exit 1;
}

##########################################
# ok. Dann stellen wir jetzt was damit an
##########################################

# jetzt holen wir uns erst einmal alle Räume, die es gibt...
my @rooms;
foreach my $entry ($mesg->all_entries) {
    my $val = $entry->get_value("description");
    my $key = $val.'::'.$entry->get_value("dhcpRange").'/'.$entry->get_value('dhcpNetMask');
    if ( defined $key && $key ne "" ) {
        push @rooms, $key;
    }
}

# ...und anschließen schauen wir mal wo wir sind...
foreach my $name (@rooms){
    my ($room, $network) = split /::/ ,$name;
    my $block = new Net::Netmask($network);

    # befindet sich die übermittelte IP-Adresse im Netzwerkbereich des Raumes?
    if( $block->match($ip)){
        # dann holen wir uns jetzt mal die DEFAULTS für diesen Raum
        $mesg = $ldap->search(base   => $LDAP_BASE,
                              filter => "(&(Objectclass=SchoolRoom)(description=$room))",
                              attrs  => ['serviceAccesControl']
                             );
        # gibt es wirklich default Werte für diesen Raum?
        if ( $mesg->code != 0 ){
            print STDERR "Keine DEFAULT Werte für Raum $room gefunden\n";
            print STDERR "Bitte im Adminfrontend definieren.\n";
            $mesg = $ldap->unbind;
            exit 1;
        }

        # Dann schauen wir jetzt nach den einzelnen Werten.
        foreach my $entry ($mesg->all_entries) {
          foreach my $access ($entry->get_value('serviceAccesControl')) {
            my @defaults = split / /,$access;
            my $tmp      = shift @defaults;
            if($tmp eq 'DEFAULT')  {
                foreach my $serv (@defaults){
                    my ($srv,$param)=split /:/,$serv;
                    # und jetzt setzen wir die ermittelten Werte
                    system("/usr/sbin/control_access $param $network $srv");
                }
            }
          }
        }
    # eigentlich sind wir hier fertig - aber wir wollen noch wissen, wie
    # fleißig die Kollegen waren.
    open(LOG,">>$logfile") or die "Kann $logfile nicht öffnen: $!\n";
    my $time=`date`;
    chomp($time);
    print LOG "$time [$user] $room\n";
    close(LOG);
    }
}

# so - die Verbindung zum LDAP Server brauchen wir nun nicht mehr
$mesg = $ldap->unbind; 
