#!/usr/bin/perl

use strict;
use warnings;
use IO::Socket::INET;

my $adminport = 5200;
my $mcastport = 8650;
my $sleep_time = 30;

our $dry_run = 0;
our $daemonize = 0;

use Getopt::Long;

Getopt::Long::GetOptions(
                         'd|daemon'     => \$daemonize,
                         'dry-run'      => \$dry_run,
                         'sleep=i'      => \$sleep_time,
                         );


MAIN: while(1) {

    my $addr = "127.0.0.1:$adminport";

    my $sock = IO::Socket::INET->new(PeerAddr => "$addr",
                                     Timeout => 10);

    unless ($sock) {
	warn "Cannot connect to server ($addr)";
	sleep 10;
    }

    my %stats;
    my %output;
    while(1) {
        $sock->write("counters\r\n") || next MAIN;


        while (my $line = $sock->getline || next MAIN) {
            last if $line =~ /^\./;
            $line =~ /^\s*(.+?)\s+(\d+)/;
            my ($key, $val) = ($1, $2);
            next unless($key);
            if (exists $stats{$key}) {
                if ($stats{$key} >= $val) {
                    # someone reset a counter
                    # or there where was no change
                    $output{$key} = 0 if exists $output{$key};
                } else {
                    $output{$key} = (($val - $stats{$key}) / $sleep_time);
                    $stats{$key}  = $val;
                }
            }
            $stats{$key}  = $val;
        }

        use Data::Dumper;

        print Dumper(\%output);
        foreach my $key (keys %output) {
            my $metric_key = $key;
            $metric_key =~ s/\W/_/g;
            run_command("gmetric","-n","dj-$metric_key", "-v" ,"$output{$key}", "-t", "int32","-u", "per sec", "-p$mcastport");
        }


        $sock->write("stats\r\n") || next MAIN;

        while (my $line = $sock->getline || next MAIN) {
            last if $line =~ /^\./;
            $line =~ /^\s*(.+?)\s+([\d.]+)\s+([\w\/]+)/;
            my ($key, $val, $unit) = ($1, $2, $3);
            my $metric_key = $key;
            $metric_key =~ s/\W/_/g;
            run_command("gmetric","-n","dj-stat-$metric_key", "-v" ,"$val", "-t", "int32","-u", "$unit", "-p$mcastport");
        }


        # special case connections
#        run_command("gmetric","-n","dj-connections", "-v" ,$stats{connect} - $stats{disconnect}, "-t", "int32","-u", "current", "-p$mcastport");
        sleep $sleep_time;
    }
 #   exit;
}

sub run_command {

    if($dry_run) {
        print "Would execute: . " . join(" ", @_) . "\n";
    } else {
        system(@_) and die;
    }
}
