#!/usr/bin/perl -w

# soucast userap modulu pro QoS na klfree debian
# ==============================================

use lib "/usr/lib/qos/scripts/userap_files";

use UserapCommon;
use UserapParser;
use UserapTcTools;
use UserapHtml;
use strict;

my $STATFILE = "$DATADIR/tc_dump.xml";

# ========================================================
#inicialization (not allow to run multiple instances)
sub init_sheduller {
    my $psout = `ps -e | grep userapd`;
    my (undef, $l2) = split ('\n', $psout);
    if ($l2) {
	print "Another userapd is apparently running !!\nTerminating\n";
	exit 0;
    }
    if (open PIDF, "$PIDFILE") {
	my $opid = <PIDF>;
	print "Pid-file found! but no userpad process running!\n";
	close PIDF;
    } 
    open PIDF, ">$PIDFILE";
    print PIDF "$$";
    close PIDF;
}

sub check_pid {
    #to avoid the file deleted accidently ...
    if (!(open PIDF, "$PIDFILE")) {
	open PIDF, ">$PIDFILE";
	print PIDF "$$";
	close PIDF;
    } else {
	close PIDF;
    }
}
    

# ==========================================================
init_sheduller;
print "-starting main loop\n";
while (1) {
    if ( -e $STATFILE) {
	my $mtime=(stat("$STATFILE"))[9];
	print ("waiting ");
	$| = 1;
	while (time < $mtime + $UPERIOD) {
	    print (".");
	    sleep 10;
	}
	print ("\n");
    } else {
	#stat file is not there (=shaping just started, or file deleted)
	sleep 20;
	print "\nPRE) call is_updater\n";
	`killall is_updater.pl 2>/dev/null`;
        `$QOSBIN/scripts/userap_files/is_updater.pl &`;
        sleep 10;
	UserapTcTools::initFaces();
        UserapTcTools::set_auto_rates();
	UserapTcTools::set_manual_rates();
        UserapTcTools::saveResults();
    }
    print "=============================================\n";
    my $ll = localtime;
    print "starting update cycle - $ll\n";
    check_pid;

    # ==========================================================
    #1) dump current state of tc classes
    print "\n1) dumping current class status\n";
    UserapTcTools::parseTcStatus();	#get data from tc tool
    UserapTcTools::saveHistory();	#save info about data transfers

    # ==========================================================
    #2) check the IS for updates
    print "\n2) call is_updater\n";
    `killall is_updater.pl 2>/dev/null`;
    `$QOSBIN/scripts/userap_files/is_updater.pl &`;
    sleep 10;

    # ==========================================================
    #3) update classes
    print "\n3) updating classes\n";
    UserapTcTools::initFaces();
    UserapTcTools::set_auto_rates();
    UserapTcTools::set_manual_rates();
    UserapTcTools::saveResults();

    # ==========================================================
    print "\n4) printing stats\n";
    UserapTcTools::genStats();		#save xml & html info
    
    # ==========================================================

    #5) call pinger
    print "\n5) calling pinger in background\n";
    `killall pinger.pl 2>/dev/null`;
    `$QOSBIN/scripts/userap_files/pinger.pl -q 2>/dev/null >/dev/null &`;
    
    $ll = localtime;
    print "DONE $ll - sleeping\n";
    sleep $UPERIOD;
}

