mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-03 21:02:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			225 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env perl
 | 
						||
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
						||
#package xCAT_monitoring::performance;
 | 
						||
BEGIN
 | 
						||
{
 | 
						||
    $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
 | 
						||
}
 | 
						||
use lib "$::XCATROOT/lib/perl";
 | 
						||
use xCAT::NodeRange;
 | 
						||
use Sys::Hostname;
 | 
						||
use Socket;
 | 
						||
use xCAT::Utils;
 | 
						||
use xCAT::TableUtils;
 | 
						||
use xCAT::NetworkUtils;
 | 
						||
use xCAT::GlobalDef;
 | 
						||
use xCAT_monitoring::monitorctrl;
 | 
						||
use xCAT::MsgUtils;
 | 
						||
use xCAT_monitoring::xcatmon;
 | 
						||
use strict;
 | 
						||
use warnings;
 | 
						||
1;
 | 
						||
performance();
 | 
						||
 | 
						||
sub performance
 | 
						||
{    #opening subroutine
 | 
						||
 | 
						||
    my $noderef = xCAT_monitoring::monitorctrl->getMonHierarchy();
 | 
						||
 | 
						||
    #identification of this node
 | 
						||
    my @hostinfo = xCAT::NetworkUtils->determinehostname();
 | 
						||
 | 
						||
    #print "hosT:@hostinfo\n";
 | 
						||
    my $isSV = xCAT::Utils->isServiceNode();
 | 
						||
 | 
						||
    #print "is sv is:$isSV \n";
 | 
						||
    my %iphash = ();
 | 
						||
    foreach (@hostinfo) { $iphash{$_} = 1; }
 | 
						||
    if (!$isSV) { $iphash{'noservicenode'} = 1; }
 | 
						||
 | 
						||
    my @children;
 | 
						||
    my $str;
 | 
						||
 | 
						||
    foreach my $key (keys(%$noderef))
 | 
						||
    {    #opening foreach1
 | 
						||
            #print "opening foreach1 \n";
 | 
						||
            #print "key is: $key \n";
 | 
						||
        my @key_a = split(':', $key);
 | 
						||
        if (!$iphash{ $key_a[0] }) { next; }
 | 
						||
        my $mon_nodes = $noderef->{$key};
 | 
						||
 | 
						||
        foreach (@$mon_nodes)
 | 
						||
        {    #opening foreach2
 | 
						||
            my $node     = $_->[0];
 | 
						||
            my $nodetype = $_->[1];
 | 
						||
 | 
						||
            #print "node=$node, nodetype=$nodetype\n";
 | 
						||
            if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/))
 | 
						||
            {
 | 
						||
                push(@children, $node);
 | 
						||
            }
 | 
						||
        }    #closing foreach2
 | 
						||
    }    #closing foreach1
 | 
						||
 | 
						||
    #print "children:@children\n";
 | 
						||
    my $count_child = @children;
 | 
						||
    if ($count_child > 0)
 | 
						||
    {    #opening if count_child 1
 | 
						||
            #print "number of children is $count_child \n";
 | 
						||
        no strict;
 | 
						||
        no warnings;
 | 
						||
 | 
						||
        #my $i=0;
 | 
						||
        my @inactive_children;
 | 
						||
        for ($i = 0 ; $i < $count_child ; $i++)
 | 
						||
        {    #opening if count_child 2
 | 
						||
            $str = `pmdumptext -c $::XCATROOT/lib/perl/xCAT_monitoring/pcp/pcpmon.config -d<> -s1 -h$children[$i] -f%D:%H:%M:%S 2>&1`;
 | 
						||
 | 
						||
            #print "before split is $str \n";
 | 
						||
            #if ($str =~ /\s*No\s*route\s*to\s*host/)
 | 
						||
            if ($str =~ /pmdumptext:\s*Error:\s*host\s*"\w*":/)
 | 
						||
            {
 | 
						||
                #print "host unreachable \n";
 | 
						||
                @inactive_children = $children[$i];
 | 
						||
 | 
						||
                #print "inactive children is @inactive_children \n";
 | 
						||
            }
 | 
						||
 | 
						||
            else
 | 
						||
            {
 | 
						||
                #print "into elso loop \n";
 | 
						||
                $str =~ s/\n//g;
 | 
						||
 | 
						||
                #print "before split_1 is $str \n";
 | 
						||
                my @spl1 = split(/<2F>/, $str);
 | 
						||
 | 
						||
                #print "splitted and #printing \n";
 | 
						||
                #print @spl1;
 | 
						||
                my $count_spl1 = @spl1;
 | 
						||
 | 
						||
                #print "the array has $count_spl1 elements \n";
 | 
						||
                #print "@spl1[0] \n";
 | 
						||
                #print "@spl1[1] \n";
 | 
						||
                #my $count3= `cat $::XCATROOT/lib/perl/xCAT_monitoring/pcp/pcpmon.config | wc -l`;
 | 
						||
                #print "the number of lines in the file is count3:$count3 \n";
 | 
						||
                #`tr "\n" "<22>" <$::XCATROOT/lib/perl/xCAT_monitoring/pcp/pcpmon.config> $::XCATROOT/lib/perl/xCAT_monitoring/pcp/pcpmon.config.tr`;
 | 
						||
                my $fname;
 | 
						||
                if (-e "/var/log/pcpmon.config")
 | 
						||
                {
 | 
						||
                    #print "config under /var/log \n";
 | 
						||
                    $fname = "/var/log/pcpmon.config";
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    #print "config not under /var/log \n";
 | 
						||
                    $fname = "$::XCATROOT/lib/perl/xCAT_monitoring/pcp/pcpmon.config";
 | 
						||
                }
 | 
						||
                print "config file is in $fname \n";
 | 
						||
                unless (open(CONF, $fname))
 | 
						||
                {
 | 
						||
                    return (0);
 | 
						||
                }
 | 
						||
                my @raw_data = <CONF>;
 | 
						||
                close(CONF);
 | 
						||
 | 
						||
                #print "before chopping @raw_data \n";
 | 
						||
                chop(@raw_data);
 | 
						||
 | 
						||
                #print "raw data after chopping is @raw_data \n";
 | 
						||
                my $raw_data = join('<27>', @raw_data);
 | 
						||
 | 
						||
                #print "the contents of the config file are $raw_data \n";
 | 
						||
                my @spl2 = split(/<2F>/, $raw_data);
 | 
						||
 | 
						||
                #print "splitted and #printing \n";
 | 
						||
                #print @spl2;
 | 
						||
                my $count_spl2 = @spl2;
 | 
						||
 | 
						||
                #print "the array has $count_spl2 elements \n";
 | 
						||
                #print @spl2[0] ;
 | 
						||
                #print @spl2[1] ;
 | 
						||
                #print "updating table \n";
 | 
						||
                my $table1 = xCAT::Table->new("performance", -create => 1, -autocommit => 1);
 | 
						||
 | 
						||
                #print "table created \n";
 | 
						||
                my $j;
 | 
						||
 | 
						||
                #my $k;
 | 
						||
                my $l = $j + 1;
 | 
						||
 | 
						||
                #print "l is $l \n";
 | 
						||
                my %setting_hash = ();
 | 
						||
                for ($j = 0 ; $j < $count_spl2 ; $j++)
 | 
						||
                {
 | 
						||
 | 
						||
                    #print "inside j loop \n";
 | 
						||
                    #print "spl1[0] is $spl1[0] \n";
 | 
						||
                    my %key_col1 = (timestamp => $spl1[0]);
 | 
						||
 | 
						||
                    #print "time stamp updated \n";
 | 
						||
                    #print "node is $children[$i] \n";
 | 
						||
                    $key_col1{node} = $children[$i];
 | 
						||
 | 
						||
                    #print "children updatesd \n";
 | 
						||
                    #print "spl2 is $spl2[$j] \n";
 | 
						||
                    $key_col1{attrname} = $spl2[$j];
 | 
						||
 | 
						||
                    #$setting_hash{attrname}=$spl2[$j];
 | 
						||
                    #print "spl1 is $spl1[$j+1] \n";
 | 
						||
                    $setting_hash{attrvalue} = $spl1[ $j + 1 ];
 | 
						||
                    $table1->setAttribs(\%key_col1, \%setting_hash);
 | 
						||
                }
 | 
						||
                $table1->close();
 | 
						||
            }
 | 
						||
        }    #closing if count_child 2
 | 
						||
 | 
						||
 | 
						||
        my $table2 = xCAT::Table->new("monitoring", -create => 1);
 | 
						||
        if (!$table2)
 | 
						||
        {
 | 
						||
            my $rsp = {};
 | 
						||
            $rsp->{data}->[0] = "Cannot open the monitoring table.\n";
 | 
						||
            $callback->($rsp);
 | 
						||
            return 1;
 | 
						||
        }
 | 
						||
 | 
						||
        my $ref = $table2->getAttribs({ 'name' => 'pcpmon' }, 'nodestatmon');
 | 
						||
 | 
						||
        #print "array is $ref \n";
 | 
						||
        my $node_stat = $ref->{nodestatmon};
 | 
						||
 | 
						||
        #print "nodestatmon is $node_stat \n";
 | 
						||
        if ($node_stat = 'Y')
 | 
						||
        {    #opening ifnodestatusmon
 | 
						||
                #print "inside nodestatus mon $node_stat \n";
 | 
						||
            my %node_status = ();
 | 
						||
 | 
						||
            #print "2nd set is @inactive_children \n";
 | 
						||
            my $count_inactive = @inactive_children;
 | 
						||
            if ($count_inactive > 0)
 | 
						||
            {
 | 
						||
                #print "more than 0 inactive children \n";
 | 
						||
                #print "3rd set is @inactive_children \n";
 | 
						||
                $node_status{$::STATUS_INACTIVE} = \@inactive_children;
 | 
						||
                my $changed1 = $nodes_status{$::STATUS_INACTIVE};
 | 
						||
 | 
						||
                #print "the changed1 is $changed1 \n";
 | 
						||
                my @final_inactive = @$changed1;
 | 
						||
 | 
						||
                #print "final inactive is @final_inactive \n";
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
            #only set the node status for the changed ones
 | 
						||
            if (keys(%node_status) > 0)
 | 
						||
            {
 | 
						||
                #print %node_status, "\n";
 | 
						||
                #print "updating nodelist table \n";
 | 
						||
                xCAT_monitoring::xcatmon::setNodeStatusAttributes(\%node_status);
 | 
						||
            }
 | 
						||
 | 
						||
        }    #closing if nodestatusmon
 | 
						||
    }    #closing if count_child 1
 | 
						||
 | 
						||
}    # closing subroutine
 |