#!/usr/bin/perl
use IO::File;
use DB_File;
use Fcntl;
use Time::localtime;



########creating and/or opening database

if (-e "/tmp/lsmemlock")
{
	print "LOCKFILE /tmp/lsmemlock detected!!!\n";
}else{
	#create lock file
        open lsmemlock, ">/tmp/lsmemlock";

        tie (%lsmem_db, DB_File, "/tmp/lsmem.db", O_CREAT|O_RDWR, 0644) ||
        die ("Cannot create or open /tmp/lsmem.db");

        my $num = 0;
        if (exists $lsmem_db{"mem$num"}) {
        	my $var = $lsmem_db{"mem$num"};
                $num = $var;
                print "DB detected started where left off at entry $num\n";

        }else{
                print "place holder key mem0 does not exist. created!\n";
                $lscpu_db{"mem0"} = "$num";
        }

                #close database
                untie(%lsmem_db);
                #remove lock file
                close lsmemlock;
                unlink "/tmp/lsmemlock";
}

#MEM POLLING: 60
my $success = 0;
if (-e "/var/www/cgi-bin/lsnet.conf")
{
	open lsnetconf, "</var/www/cgi-bin/lsnet.conf";
        while(<lsnetconf>)
        {
        	chomp;
                if(/^MEM\sPOLLING\:\s*(\d+)\s*$/)
                {
                	$frequency = $1;
                        $success = 1;
                        print "success $frequency\n";
                }
	}
        print "$success\n";
        if($success == 0)
        {
	        print "ERROR: Wrong lsnet.conf format consult the instructions\n";
                close lsnetconf;
                exit;
        }
}
close lsnetconf;

main();

####### MAIN LOOP  WRITES 10 1MIN ENTRIES TO DB ONCE EVERY 10MIN
sub main{
        my %value = ();
        my %tenarray = ();

        do{
                %tenarray = minutes();
                if (-e "/tmp/lsmemlock")
                {
                        print "LSMEMLOCK FOUND\n";
                        for my $key ( keys %tenarray )
                        {
                                $stupidvar = $key + $value{0};
                                $value{"$stupidvar"} = $tenarray{"$key"};
                        }
                        # 10 were added   
                        $value{0} += 10;
                }else{
                        writer(\%tenarray,\%value);
                        #$value{0} = 0;
                        my %value = ();
                }

        }while(1 == 1);
}

######### END MAIN LOOP

sub writer {
        my %tenarray = %{$_[0]};
        my %value = %{$_[1]};
        #create lock file
        open lsmemlock, ">/tmp/lsmemlock";
        #opening database
        tie (%lsmem_db, DB_File, "/tmp/lsmem.db") ||
        die ("Cannot open /tmp/lsmem.db");
                        
        if (exists $value{0})
        {
                for ($i = 1; $i <= $value{0}; $i++)
                {
                        $num = $lsmem_db{"mem0"};
                        $num++;
                        $lscpu_db{"mem$num"} = $value{$i};
                        $lscpu_db{"mem0"} = "$num";
                }
        }

        for ($i = 1; $i <= 10; $i++)
        {

                $num = $lsmem_db{"mem0"};
                $num++;  
                $lsmem_db{"mem$num"} = $tenarray{$i};
                $lsmem_db{"mem0"} = "$num";
        }

        #close database
        untie(%lsmem_db);
        #remove lock file
        close lsmemlock;
        unlink "/tmp/lsmemlock";
        #print "DATABASE CLOSED\n";

}

######## GRAB 10min WORTH OF DATA FROM SECONDSARRAY AND PUT IT INTO AN ARRAY
sub minutes{
	my (%coins);
	$i = 1; #+ $backup;
	#$stopi = 10 + $backup;
	#print "in minutes sub! (every 10min) \n";
	#my @coins = ("test","test","test");
	do {
		my($string) = secondsarray();
		#print "string returned to minutes: $string\n";
		$coins{$i} = $string;
		#print "@coins";
		#print "printed from array: $coins{$i}\n";
		$i++;
	} while ($i<=10);
	return (%coins);
}
####### RETURN ARRAY TO MAIN LOOP



###### POLL MEMINFO EVERY X SEC FOR 1 MIN
sub secondsarray{
	my ($string);
	my $secs = 1;
	my $lastmemused = 0;
        my $poll = 60 / $frequency;

	#print "in secondsarray sub! (every 1 min) \n";
	do {
		#my $lastmemused = $memused;
		my($memsize,$memfree,$buffers,$cached,$memused,$swaptotal,$swapfree,$swapused) = meminfo();
		my $datetime = ctime();

		if ($memused > $lastmemused) {
			$string = ("$num $datetime $memsize $memfree $buffers $cached $memused $swaptotal $swapfree $swapused");

		}                       
		$lastmemused = $memused;
		$num++;
		sleep($frequency);
		$secs++;
	} while ($secs<=$poll);

	#print "in secondsarray sub! (every 1 min) $string\n";
	return ($string);
}
##### RETURN HIGHEST MEM USE INSTANCE OF THE 60


##### RETRIEVE MEM INFO
sub meminfo{
        my($memsize,$memfree,$buffers,$cached,$memused,$swaptotal,$swapfree,$swapused);
        open(MEMINFO, "/proc/meminfo") or return undef;
	#print "in meminfo sub! (every second) \n";
        while(<MEMINFO>){
                chomp;
                if(/^MemTotal:\s+(\d+)/){
                        $memsize = sprintf("%.2f",$1/1024);
                }elsif(/^MemFree:\s+(\d+)/){
                        $memfree = sprintf("%.2f",$1/1024);
                }elsif(/^Buffers:\s+(\d+)/){
                        $buffers = sprintf("%.2f",$1/1024);
                }elsif(/^Cached:\s+(\d+)/){
                        $cached = sprintf("%.2f",$1/1024);
                
                }elsif(/^SwapTotal:\s+(\d+)/){
                        $swaptotal = sprintf("%.2f",$1/1024);
                }elsif(/^SwapFree:\s+(\d+)/){
                        $swapfree = sprintf("%.2f",$1/1024);
                }
        }
        my $memused = sprintf("%.2f" ,$memsize - $memfree);
        my $swapused = sprintf("%.2f" ,$swaptotal - $swapfree);
        close(MEMINFO);
        return($memsize,$memfree,$buffers,$cached,$memused,$swaptotal,$swapfree,$swapused);
}
##### RETURN VARIABLES FOR MEM INFO
