#!/usr/bin/perl -w
# $Id$
# This script (sophomorix-www) is maintained by Rüdiger Beck
# It is Free Software (License GPLv3)
# If you find errors, contact the author
# jeffbeck@web.de  or  jeffbeck@gmx.de


# ===========================================================================
# Bibliotheken
# ===========================================================================
use strict;
use Getopt::Long;
Getopt::Long::Configure ("bundling");
use Sophomorix::SophomorixConfig;
use Sophomorix::SophomorixBase qw(
                                  check_options
                                  log_script_start
                                  log_script_exit
                                  log_script_end
                                  fetchhtaccess_from_user
                                  fetchhtaccess_from_group
                                 );
use Sophomorix::SophomorixAPI;
use Sophomorix::SophomorixPgLdap;
use DBI;
use Net::LDAP;

my @arguments = @ARGV;

# ===========================================================================
# Optionen verarbeiten
# ==========================================================================
# Variablen für Optionen
$Conf::log_level=1;
my $help=0;
my $info=0;
$Conf::log_level=1;
my $user_public_upload="";
my $user_public_noupload="";
my $user_private_upload="";
my $user_private_noupload="";

my $group_public_upload="";
my $group_public_noupload="";
my $group_private_upload="";
my $group_private_noupload="";

my $caller="";

# Parsen der Optionen
my $testopt=GetOptions(
           "help|h" => \$help,
           "info|i" => \$info,
           "verbose|v+" => \$Conf::log_level,
           "caller=s" => \$caller,
           "user-public-upload=s" => \$user_public_upload,
           "user-public-noupload=s" => \$user_public_noupload,
           "user-private-upload=s" => \$user_private_upload,
           "user-private-noupload=s" => \$user_private_noupload,
           "group-public-upload=s" => \$group_public_upload,
           "group-public-noupload=s" => \$group_public_noupload,
           "group-private-upload=s" => \$group_private_upload,
           "group-private-noupload=s" => \$group_private_noupload,
          );

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

if ($info==0
    and $user_public_upload eq ""
    and $user_public_noupload eq ""
    and $user_private_upload eq ""
    and $user_private_noupload eq ""
    and $group_public_upload eq ""
    and $group_public_noupload eq ""
    and $group_private_upload eq ""
    and $group_private_noupload eq ""
   ){
    $help=1;
}


# --help
if ($help==1) {
   # Scriptname ermitteln
   my @list = split(/\//,$0);
   my $scriptname = pop @list;
   # Befehlbeschreibung
   print('
sophomorix-www manages access to public_html and private_html directories

Options
  -h  / --help
  -v  / --verbose
  -vv / --verbose --verbose
  -i  / --info

Managing users (students and teachers):
  --user-public-upload user1,user2,...
  --user-public-noupload user1,user2,... (not for teachers)
  --user-private-upload user1,user2,...
  --user-private-noupload user1,user2,... (not for teachers)

Managing groups (classes and projects):
  --group-public-upload group1,group2,...
  --group-public-noupload group1,group2,...
  --group-private-upload group1,group2,...
  --group-private-noupload group1,group2,...

Please see the sophomorix-www(8) man pages for full documentation
');
   print "\n";
   exit;
}

############################################################
# options
############################################################

&check_connections();

# show size or not
my $size="size";

# --info
if ($info==1){
   # teacher
   my @teachers=&fetchstudents_from_adminclass(${DevelConf::teacher});
   &print_head("Teachers");
   foreach my $teacher (@teachers){
       my ($ht_access,$www_size) = &fetchhtaccess_from_user($teacher,$size);
       if ($ht_access ne "user-private-upload"){
           &print_ht_line($teacher,$ht_access,$www_size);
       }
   }
   &print_foot();

   # students
   my @students=&Sophomorix::SophomorixAPI::fetchstudents_from_school();
   &print_head("Students");
   foreach my $student (@students){
       my ($ht_access,$www_size) = &fetchhtaccess_from_user($student,$size);
       if ($ht_access ne "user-private-noupload"){
           &print_ht_line($student,$ht_access,$www_size);
       }
   }
   &print_foot();

   # classes
   my @admin_classes = &fetchadminclasses_from_school();
   &print_head("Classes");
   foreach my $class (@admin_classes){
       my ($ht_access,$www_size) = &fetchhtaccess_from_group($class,$size);
       if ($ht_access ne "group-private-noupload"){
           &print_ht_line($class,$ht_access,$www_size);
       }
   }
   &print_foot();

   # projects
   my @projects = &fetchprojects_from_school();
   &print_head("Projects");
   foreach my $project (@projects){
       my ($ht_access,$www_size) = &fetchhtaccess_from_group($project,$size);
       if ($ht_access ne "group-private-noupload"){
           &print_ht_line($project,$ht_access,$www_size);
       }
   }
   &print_foot();

   exit;
}


&log_script_start(@arguments);



### user

#  --user-public-upload user1,user2,...
if ($user_public_upload ne ""){
    my @users = split(/,/,$user_public_upload);
    foreach my $user (@users){
	&Sophomorix::SophomorixBase::user_public_upload($user);
    }
}

#  --user-public-noupload user1,user2,...
if ($user_public_noupload ne ""){
    my @users = split(/,/,$user_public_noupload);
    foreach my $user (@users){
	&Sophomorix::SophomorixBase::user_public_noupload($user);
    }
}

#  --user-private-upload user1,user2,...
if ($user_private_upload ne ""){
    my @users = split(/,/,$user_private_upload);
    foreach my $user (@users){
	&Sophomorix::SophomorixBase::user_private_upload($user);
    }
}

#  --user-private-noupload user1,user2,...
if ($user_private_noupload ne ""){
    my @users = split(/,/,$user_private_noupload);
    foreach my $user (@users){
	&Sophomorix::SophomorixBase::user_private_noupload($user);
    }
}





### group

#  --group-public-upload group1,group2,...
if ($group_public_upload ne ""){
    my @groups = split(/,/,$group_public_upload);
    foreach my $group (@groups){
	&Sophomorix::SophomorixBase::group_public_upload($group);
    }
}

#  --group-public-noupload group1,group2,...
if ($group_public_noupload ne ""){
    my @groups = split(/,/,$group_public_noupload);
    foreach my $group (@groups){
	&Sophomorix::SophomorixBase::group_public_noupload($group);
    }
}

#  --group-private-upload group1,group2,...
if ($group_private_upload ne ""){
    my @groups = split(/,/,$group_private_upload);
    foreach my $group (@groups){
	&Sophomorix::SophomorixBase::group_private_upload($group);
    }
}

#  --group-private-noupload group1,group2,...
if ($group_private_noupload ne ""){
    my @groups = split(/,/,$group_private_noupload);
    foreach my $group (@groups){
	&Sophomorix::SophomorixBase::group_private_noupload($group);
    }
}




&log_script_end(@arguments);






############################################################
# sub
############################################################

sub print_foot {
    # print "+-----------------+--------+",
    #        "--------+-------+--------------+\n\n";
    print "\n";
}

sub print_head {
    my ($header) = @_;
    # print "+-----------------+--------+",
    #       "--------+-------+--------------+\n";
    printf "%-18s| %-6s | %-6s | %-5s | %12s |\n",
            $header ,"upload","public","type","used size";
    print "+-----------------+--------+",
          "--------+-------+--------------+\n";
}

sub print_ht_line {
    my ($item,$ht_access,$www_size) = @_;
    my ($type,$pub,$up)=split(/-/,$ht_access);
    if ($pub eq "public"){
        $pub="pub";
    } else {
        $pub="";
    }
    if ($up eq "upload"){
        $up="up";
    } else {
        $up="";
    }
    
    printf "%-18s|   %-2s   |   %-3s  | %-5s | %12s |\n",
            $item ,"$up","$pub","$type","$www_size";

}
