/perl/monitor/topparse.pl
Perl | 160 lines | 106 code | 40 blank | 14 comment | 6 complexity | 38a29816e0f3f03cbe19d39b619eebc9 MD5 | raw file
Possible License(s): GPL-2.0, Apache-2.0, GPL-3.0, AGPL-1.0
- #!/usr/bin/perl
- # Copyright GPL (c) 2005 mmc Mike Chirico
- # Version 0.0.1
- # Last Updated: Thu Mar 17 16:51:10 EST 2005
- # TODO
- # a. please fix that very long line
- use DBI;
- $dbh0 = DBI->connect( "dbi:SQLite:database/monitor.db" ) || die "Cannot connect: $DBI::errstr";
- $dbh1 = DBI->connect( "dbi:SQLite:database/monitor.db" ) || die "Cannot connect: $DBI::errstr";
- sub top{
- $server=$_[0];
- $pid = open $readme, "ssh root\@$server top -b -n 1 2>/dev/null|" or die "Could not ssh into $_[0]\n";
- # Quick test of top -b -n 1 2>/dev/null|
- my $H_flag=1;
- # Not all values are collected
- my $loadavg0=-1;
- my $loadavg1=-1;
- my $loadavg2=-1;
- my $processes=-1;
- my $sleeping=-1;
- my $running=-1;
- my $zombie=-1;
- my $stopped=-1;
- while(<$readme>) {
- $line=$_;
- # First only dealing with the heading
- if ($H_flag==1) {
- if($line =~ /load average:\s\s*(\d\d*\.?\d*),\s\s*(\d\d*\.?\d*),\s\s*(\d\d*\.?\d*)\s*/) {
- $loadavg0=$1;
- $loadavg1=$2;
- $loadavg2=$3;
- }elsif ($line =~ /(^\d\d*)\s\s*processes:\s\s*(\d\d*)\s\s*sleeping,\s\s*(\d\d*)\s\s*running,\s\s*(\d\d*)\s\s*zombie,\s\s*(\d\d*)\s\s*stopped/) {
- $processes=$1;
- $sleeping=$2;
- $running=$3;
- $zombie=$4;
- $stopped=$5;
- }elsif ($line =~ /\s*PID\s\s*USER.*COMMAND/) {
- $H_flag=0;
- } # PID USER(-) PRI NI SIZE RSS SHARE STAT CPU MEM TIME CMD
- }elsif (/\s*(\d\d*)\s\s*(\w\w*\-*\w\w*)\s\s*(\d\d*)\s\s*(\d\d*)\s\s*(\d\d*)\s\s*(\d\d*)([M|G|K])\s\s*(\d\d*)\s\s*(\w\w*)\s\s*(\d\d*\.?\d)\s\s*(\d\d*\.?\d)\s\s*(\d\d*\:?\d\d\.?\d*m?)\s\s*/){
- $cmd=($');
- chomp($cmd);
- $cmp =~ s/^M//g;
- $cmp =~ s/\n//g;
- # print "-> $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} -$cmd-\n";
- # print " $line\n";
- $pid=$1;
- $user=$2;
- $pri=$3;
- $ni=$4;
- $size=$5;
- $rss=$6;
- $rss_unit=$7;
- $share=$8;
- $stat=$9;
- $cpu=${10};
- $mem=${11};
- $time=${12};
- $dbh1->do( "INSERT INTO top_process_data
- (server,pid,user,pri,ni,size,rss,rss_unit,share,stat,cpu_pcrt,mem,cmd)
- VALUES
- ( '$server', $pid,'$user',$pri,$ni,$size,$rss,'$rss_unit',$share,'$stat',$cpu,$mem,'$cmd'); ");
- # PI can be negative. These are the bad ones we want to look at.
- }elsif (/\s*(\d\d*)\s\s*(\w\w*\-*\w\w*)\s\s*(\d\d*)\s\s*(\d\d*)\s\s*(\d\d*)\s\s*(\d\d*)\s\s*(\d\d*)\s\s*(\w\w*)\s\s*(\d\d*\.?\d)\s\s*(\d\d*\.?\d)\s\s*(\d\d*\:?\d\d\.?\d*m?)\s\s*/){
- $cmd=($');
- chomp($cmd);
- $cmp =~ s/^M//g;
- $cmp =~ s/\n//g;
- # print "-> $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} -$cmd-\n";
- # print " $line\n";
- $pid=$1;
- $user=$2;
- $pri=$3;
- $ni=$4;
- $size=$5;
- $rss=$6;
- $share=$7;
- $stat=$8;
- $cpu=$9;
- $mem=${10};
- $time=${11};
- $dbh1->do( "INSERT INTO top_process_data
- (server,pid,user,pri,ni,size,rss,share,stat,cpu_pcrt,mem,cmd)
- VALUES
- ( '$server', $pid,'$user',$pri,$ni,$size,$rss,$share,'$stat',$cpu,$mem,'$cmd'); ");
- }else {
- $dbh1->do( "INSERT INTO top_process_data
- (server,extra)
- VALUES
- ( '$server', '$line'); ");
- # print "********************** ERRor: $line \n";
- }
-
- }
- #
- # The heading is actually done last
- $dbh1->do( "INSERT INTO top_heading_data
- (server,loadavg0,loadavg1,loadavg2,processes,sleeping,running,zombie,stopped)
- VALUES
- ( '$server', $loadavg0,$loadavg1,$loadavg2,$processes,$sleeping,$running,$zombie,$stopped); ");
- close $readme;
- }
- $res0 = $dbh0->selectall_arrayref( q( SELECT server
- FROM computers
- ));
- foreach( @$res0 ) {
- if($_->[0] == 'sbc2') {
- &top($_->[0]);
- }
- }
- $dbh0->disconnect;