###
### Script pro detekci uzivatelu s kvotou vyssi jak 95% - zasilani upozornnění
###


#!/usr/bin/perl

use strict;
use warnings;
use Config::Simple;
use IMAP::Admin; # libimap-admin-perl
use Net::LDAP;  # libnet-ldap-perl 
use Log::Log4perl qw(get_logger :levels);
use MIME::Base64;
use Encode qw(encode decode);


# Logování
Log::Log4perl::init('cyrus_tools.conf');
# stupen logování
# Log::Log4perl->easy_init($INFO);
# instance loggeru
my $logger = Log::Log4perl->get_logger();

# Konfigurační soubor
my $config = new Config::Simple('cyrus_tools.conf');
my $log_dir = $config->param('log_dir');

if (!-d $log_dir) {
    mkdir $log_dir or die "Failed to create directory: $log_dir";
    $logger->info("Directory $log_dir created");
}

# pripojeni a nacteni uzivatelu
my $imap = IMAP::Admin->new( 'Server' => '<>', 'Login' => '<>', 'Password' => '<>');

my @mailboxes_all = $imap->list("user.%");
# pro debug
#@mailboxes_all = ("user.xxxxxxx");

foreach my $user (@mailboxes_all) {
	#	print $imap->get_quota($user);
    my ($mailbox, $used, $quota) = $imap->get_quota($user);
    if ($quota != 0 &&  $used / $quota > 0.95) {
        my $used_mb = $used / 1024;
        my $quota_mb = $quota / 1024;
        my $percent = $used / $quota * 100;
        #round to 2 decimal places
        $used_mb = sprintf("%.2f", $used_mb);
        $quota_mb = sprintf("%.2f", $quota_mb);
        $percent = sprintf("%.2f", $percent);
        $user =~ s/user\.//;
        # Poslání upozornění
        my $msg = "Vážený uživateli elektronické pošty,

velikost Vaší poštovní schránky na VŠB-TU Ostrava se blíží ke svému limitu $quota_mb MB. V tuto chvíli Vaše schránka zabírá $used_mb MB, což je $percent % z dostupné kapacity schránky.

Prosíme, protřiďte si Vaši schránku. Pokud si ji neprotřídíte, nebude Vám po zaplnění Vaší schránky doručována pošta, a to až do doby než si ji protřídíte a uvolníte tak místo pro nové zprávy.

Návody, jak odzálohovat Vaši poštu ze serveru imap.vsb.cz na lokální počítač, naleznete na dokumentačním serveru idoc.vsb.cz.

V případě, že si nejste jisti, co po Vás chceme, můžete kontaktovat oddělení Helpdesku CIT na telefonu 5666 nebo e-mailem na adrese hd\@vsb.cz.

Správci poštovních serverů VŠB-TU Ostrava

VŠB-TU Ostrava
Centrum informačních technologií";


    $logger->info("Sent mail warn quota - User: $user, Used: $used, Quota: $quota");

    # utf8::encode($text_body);
    my $text_body_64 = encode_base64($msg);
    my $text_body = $msg;
    my $subject_mail = "=?UTF-8?B?UHJvdMWZacSPdGUgc2kgVmHFoWkgZS1tYWlsb3ZvdSBzY2hyw6Fua3U=?=
    =?UTF-8?B?IG5hIFbFoEItVFUgT3N0cmF2YSE=?=";
    my $from = "mailbox\@vsb.cz";
    my $to = "$user\@vsb.cz";
    # $msg = "From: $from\n";
    # $msg .= "To: $to\n";
    # $msg .= "Subject: $subject_mail\n";
    $msg = "Content-Type: text/plain; charset=UTF-8\n";
    $msg .= "Content-Transfer-Encoding: base64\n\n";
    $msg .= "$text_body_64";

    # vytvoření adresáře pro uložení emailu
    my $year = `date +%Y`;
    chomp($year);
    my $log_dir = $config->param('log_dir') . '/' . $year;
    unless(-d $log_dir){
        mkdir $log_dir or die "Nelze vytvořit adresář: $log_dir";
    }
    my $message_name_file = $user."-".`date +%Y%m%d%H%M%S`;
    chomp($message_name_file);
    # vytvoření emailu
    open (my $fh, '>', "$log_dir/$message_name_file.txt") or die "Nelze vytvořit soubor: $log_dir/$message_name_file.txt";
    print $fh $msg;
    close $fh;

    my $cert_dir = $config->param('cert_dir');
    system("openssl cms -sign -in $log_dir/$message_name_file.txt -out $log_dir/$message_name_file.msg -certfile $cert_dir/geant_escience_personal_ca_4.pem -signer $cert_dir/mailbox.pem -inkey $cert_dir/robot.key -from '$from' -to '$to' -subject '$subject_mail' ");

    system("cat $log_dir/$message_name_file.msg | sendmail -t");
    
    }
}

# Odhlášení
$imap->close();
