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


#creating and/or opening database
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;
	my $test = $lsmem_db{"mem$num"};
	print "this is the mem0 db entry: $test\n";

        my $var2 = $lsmem_db{"mem$var"};

	$var2 =~ /(.{3}\s+.{3}\s+\d{1,2}\s+.{8}\s+\d{4})/;
        print "Last entry was $var on $1\n";
}else{
        print "place holder key mem$num does not exist. created!\n";
	$lsmem_db{"mem0"} = "$num";
}

#close database
untie(%lsmem_db);

$num++;
my $memused = 0;
my $i = 1;
my $stupidvar = 0;
my %value = ();
$value{0} = 0;
my $stop = 1;

####### MAIN LOOP  WRITES 10 1MIN ENTRIES TO DB ONCE EVERY 10MIN 
do{

	my(%coins) = minutes();
	$i = 1;

	$stop = 1;

	while ( $stop == 1) 
	{
        	if (-e "/tmp/lsmemlock")
        	{
                	$stop = 1;

			#if lock file exists copy %coins to %value

			#$value{0} = $value{0} + 10;
			for my $key ( keys %coins ) 
			{
				$stupidvar = $key + $value{0};
				
				$value{$stupidvar} = $coins{$key};
			}

			#let db writing logic know 10 more are going to be added ($backup needs to be made 0 once these are written)
			#$backup = $backup + 10;

			# 10 were added
			$value{0} = $value{0} + 10;

			#grab a fresh set
			my(%coins) = minutes();

        	}else{
			#if lock file does not exist cause while loop to exit and write data to db
                	$stop = 0;
        	}
	}


        #create lock file
        open lsmemlock, ">/tmp/lsmemlock";
        
        #opening database   
        tie (%lsmem_db, DB_File, "/tmp/lsmem.db") ||
        die ("Cannot open /tmp/lsmem.db");

	if ($value{0} > 0)
	{
                
		$i = 1;

        	while($i <= $value{0})
		{
                	$value{$i} =~ /\s*\d+\s+(.{3}\s+.{3}\s+\d{1,2}\s+.{8}\s+\d{4}\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*)\s*/;
                	#Wed Feb  4 10:03:37 2009 2026.77 437.45 459.96 459.29 1589.32 10722.93 10722.92 0.01
                	#print "$1";
                	$num = $lsmem_db{"mem0"};
                	$num++;
                	$lsmem_db{"mem$num"} = "$1";
                	$lsmem_db{"mem0"} = "$num";
                	$i++;
        	}
		
		$value{0} = 0;
	}

        $i = 1;
	while($i <= 10)
	{
		$coins{$i} =~ /\s*\d+\s+(.{3}\s+.{3}\s+\d{1,2}\s+.{8}\s+\d{4}\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*\s+\d+.?\d*)\s*/;
		#Wed Feb  4 10:03:37 2009 2026.77 437.45 459.96 459.29 1589.32 10722.93 10722.92 0.01
		#print "$1";
		$num = $lsmem_db{"mem0"};
		$num++;
		$lsmem_db{"mem$num"} = "$1";
		$lsmem_db{"mem0"} = "$num";
		#$lsnet_db{"mem$1"} = "$2";
		#$test = $lsnet_db{"mem$num"} + 1;
		#$lsnet_db{"mem0"} = "$test";
		#my $test2 = $lsmem_db{"mem$num"};
		#print "db entry mem$num just wrote: $test2\n";
		$i++;
	}

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

}while(1 == 1);
######### END MAIN LOOP

######## 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 1 SEC FOR 1 MIN
sub secondsarray{
	my ($string);
	my $secs = 1;
	my $lastmemused = 0;
	#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(1);
		$secs++;
	} while ($secs<=60);
	#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
