#!/usr/bin/env perl
use Getopt::Long;
BEGIN
{
  $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
}
#Modules to use
use lib "$::XCATROOT/lib/perl";
use xCAT::Utils;
use xCAT_monitoring::rrdutil;
use xCAT_monitoring::rmcmetrix;

###############################################################
#Error handle
#Input:
#	$c	error code
#	$m	error msg
#return:
#	None;
##############################################################
sub err_handle
{
	my ($c, $m) = @_;
	if($c != 0){
		print "ERROR: $m\n";
		exit($c);
	}
}
###############################################################
#sub getcrontime
#Input:
#	$minute	interval in minute
#return:
#	string whose format is "MIN HOUR DAY MONTH *"
##############################################################
sub getcrontime
{
	my $minute = shift @_;
	my ($min, $hour, $day, $month);
	my $temp = undef;
	my $temp1 = undef;
	$temp =  $minute % 60 ;
	if($temp < 2){
		$min = '*';
	} else {
		$temp1 = $temp;
		$min = '0';
		while($temp1 < 60){
			$min = $min.",$temp1";
			$temp1 = $temp1 + $temp;
		}
	}
	$minute = int $minute/60;
	$temp = $minute % 24;
	if($temp < 2){
		$hour = '*';
	} else {
		$temp1 = $temp;
		$hour = '0';
		while($temp1 < 24){
			$hour = $hour.",$temp1";
			$temp1 = $temp1 + $temp;
		}
	}
	$minute = int $minute/24;
	$temp = $minute % 31;
	if($temp < 2){
		$day = '*';
	} else {
		$temp1 = $temp;
		$day = '0';
		while($day < 31){
			$day = $day.",$temp1";
			$temp1 = $temp1 + $temp;
		}
	}
	$minute = int $minute/31;
	$temp = $minute % 12;
	if($temp < 2){
		$month = '*';
	} else {
		$month = '0';
		while($month < 12){
			$month = $month.",$temp1";
			$temp1 = $temp1 + $temp;
		}
	}
	return "$min $hour $day $month *";

}
################################################################
#Usage:
#	1. To start RRD server
#	./rmcmetrixmon init rrdserver
#	2. To stop RRD server
#	./rmcmetrixmon clean rrdserver
#	3. To start a data collector
#	./rmcmetrixmon init resourceclass resoucename attr0, attr1, attr2, ... minute
#	4. To stop all data collectors and data consolidators
#	./rmcmetrixmon clean 
#	5. To work as a data collector 
#	./rmcmetrixmon data resourceclass resourcename attr0, attr1, attr2, ... minute
#	6. To work as a data consolidator 
#	./rmcmetrixmon sum resourceclass attr0, attr1, attr2, ... minute
#################################################################	

my $cmd = $ARGV[0];
my @tabs = ();
my $entry = undef;
my $minute = undef;
my $crontime = undef;
my $code = 0;
my $msg = undef;
if($cmd eq 'init'){
	if ($ARGV[1] eq 'rrdserver'){
		$code = xCAT_monitoring::rrdutil::start_RRD_server('13900', "/var/rrd/");
		&err_handle($code, "can't start RRD server");
		exit 0;
	}
	$minute = $ARGV[4];
	$crontime = &getcrontime($minute);
	($code, $msg) = xCAT::Utils->add_cron_job("$crontime /opt/xcat/sbin/rmcmon/rmcmetrixmon data $ARGV[1] $ARGV[2] $ARGV[3] $ARGV[4] > /dev/null");
	&err_handle($code, $msg);
	if(xCAT::Utils->isMN()){
		$minute = $minute * 5;
		$crontime = &getcrontime($minute);
		($code, $msg) = xCAT::Utils->add_cron_job("$crontime /opt/xcat/sbin/rmcmon/rmcmetrixmon sum $ARGV[1] $ARGV[3] $ARGV[4] > /dev/null");
		&err_handle($code, $msg);
	}
} elsif ($cmd eq 'clean'){
	if ($ARGV[1] eq 'rrdserver'){
		$code = xCAT_monitoring::rrdutil::stop_RRD_server();
		&err_handle($code, "can't stop RRD server");
		exit 0;
	}

	$msg = `rm -rf /var/rrd/*`; 
	&err_handle($?, $msg);
	@tabs = `/usr/bin/crontab -l 2>/dev/null;`;
	foreach $entry (@tabs){
		chomp($entry);
		if($entry =~ /rmcmetrixmon/){
			($code, $msg) = xCAT::Utils->remove_cron_job($entry);
			&err_handle($code, $msg);
		}
	}
} elsif ($cmd eq 'data'){
	($code, $msg) = &xCAT_monitoring::rmcmetrix::getmetrix($ARGV[1], $ARGV[2], $ARGV[3], $ARGV[4]);
	&err_handle($code, $msg);
} elsif ($cmd eq 'sum'){
	($code, $msg) = &xCAT_monitoring::rmcmetrix::get_sum_metrix($ARGV[2], $ARGV[3]);
	&err_handle($code, $msg);
} else {
	print "ERROR:Invalid parameter\n";
}

1;