#!/usr/bin/perl -w
use strict;

##########################################
##
## DESCRIPTION
##
##   The tc-graph daemon script: "tc-collector"
##   Which is part of the ADSL-optimizer.
##
##   The script will become a daemon and periodically collect data
##   from the Linux traffic control system.  The collected data is
##   stored in some RRD-data files, which is created automatically by
##   the script if they don't exist.
##
## GRAPHs
##
##   How the RRD-data is displayed as graphs is not part of the
##   tc-collector tool.  But we recommend using the RRD-frontend 'ddraw'.
##   We have included some 'ddraw' examples (which is hardcoded to use
##   files from '/var/spool/rrdqueues').
##
##      drraw:  http://web.taranis.org/drraw/
##
##
## REQUIRES
##
##   RRDtools Perl interface RRDs
##   The "tc" command.
##
##
## AUTHOR
##   Jesper Dangaard Brouer <hawk@diku.dk>, d.16/4-2004
##
## CHANGELOG
##   2004-04-16:  Initial version.
##   2004-05-27:  Daemon version.
##
## $Id: tc-collector.pl,v 1.12 2005/03/19 19:31:08 hawk Exp $
##########################################

# TODO:
#  * Calc time used to parse, use to make time steps more precise
#  * Device list support
#  * Detecting the correct devices

# Configuration options:
#
my  $device        = "$ARGV[0]";

our %mainsettings = ();
require '/var/ipfire/general-functions.pl';
&General::readhash("${General::swroot}/main/settings", \%mainsettings);

our $rrd_datadir   = $mainsettings{'RRDLOG'}."/";
our $event_datadir = $mainsettings{'RRDLOG'};
our $STEP          = 10;
our $tc_command    = "/sbin/tc";

# A trick is to set the environment PERL5LIB to include $GRAPHDIR
#  This is done by the init-script
# ($GRAPHDIR is obtained from /usr/local/etc/ADSL-optimizer.conf)
my $include_dir = '/var/ipfire/qos/bin';


# Create the $mainsettings{'RRDLOG'} if it doesn't exists
if ( ! -d $mainsettings{'RRDLOG'} ) {
    print "RRD-datadir not found, creating it: $mainsettings{'RRDLOG'} \n";
    my $status = system("mkdir $mainsettings{'RRDLOG'}");
    die "\nERROR cannot create \"$mainsettings{'RRDLOG'}\"\n" unless $status == 0;
}

# use POSIX;
#
#POSIX::setsid()
#    or die "Can't become a daemon: $!";

# The init scripts will do the right "daemon" thing...
# Become a daemon
print "Becoming a daemon...\n";
my $pid = fork;
exit if $pid;
die "Couldn't fork: $!" unless defined($pid);

my $time_to_die = 0;
sub signal_handler {
    $time_to_die = 1;
}
# Trap signals
$SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&signal_handler;
$SIG{PIPE} = 'IGNORE';

our %classes_data;
our %classes_info;
require "$include_dir/parse-func.pl";
require "$include_dir/event-func.pl";
require "$include_dir/RRD-func.pl";

until ($time_to_die) {

    #print "Parsing tc statistics on $device\n";
    my $res = parse_class($device);
    if ( ! $res ) {
	print " Error when parsing classes on $device\n";
    }

    #print "Updating RRD data-files\n";
    $res = update_rrds();
    #if ( $res ) {
    #	print " Error updating RRDs: \"$res\"\n";
    #}

#    my $timestamp = time;
#    print "$timestamp\n";

    sleep($STEP);
}

print "tc-collector daemon exiting ... bye bye!\n";
