mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 11:22:27 +00:00 
			
		
		
		
	New code for xcat probe component
This commit is contained in:
		
							
								
								
									
										317
									
								
								xCAT-probe/lib/perl/ProbeUtils.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										317
									
								
								xCAT-probe/lib/perl/ProbeUtils.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,317 @@ | ||||
| package ProbeUtils; | ||||
| use strict; | ||||
| use File::Path; | ||||
| use File::Copy; | ||||
|  | ||||
| #----------------------------------------- | ||||
| =head3 | ||||
|     Description: | ||||
|         Format output message depending on probe framework requirement | ||||
|         Format is [<flag>] : <message> | ||||
|         The valid <flag> are debug, warning, failed and ok | ||||
|     Attribute:  list by input sequence | ||||
|         output: where should output the message  | ||||
|         num:  the number of <flag> | ||||
|               0: debug | ||||
|               1: warning | ||||
|               2: failed | ||||
|               3: ok | ||||
|         msg:  the information need to output | ||||
|      Return value: | ||||
|         1 : Failed  | ||||
|         0 : success  | ||||
| =cut | ||||
| #---------------------------------------- | ||||
| sub send_msg { | ||||
|     my $output=shift; | ||||
|     $output=shift if(($output) && ($output =~ /ProbeUtils/)); | ||||
|     my $num = shift; | ||||
|     my $msg = shift; | ||||
|     my $flag; | ||||
|  | ||||
|     if ($num == 0) { | ||||
|         $flag = "[debug]  :"; | ||||
|     }elsif($num == 1) { | ||||
|         $flag = "[warning]:"; | ||||
|     }elsif($num == 2) { | ||||
|         $flag = "[failed] :"; | ||||
|     }elsif($num == 3){ | ||||
|          $flag = "[ok]     :"; | ||||
|     } | ||||
|     if($output eq "stdout"){ | ||||
|         print "$flag $msg\n"; | ||||
|     }else{ | ||||
|         if (!open (LOGFILE, ">> $output") ) { | ||||
|            return 1; | ||||
|         } | ||||
|         print LOGFILE "$flag $msg\n"; | ||||
|         close LOGFILE; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| #------------------------------------------ | ||||
| =head3 | ||||
|     Description: | ||||
|         Judge if a string is a IP address  | ||||
|     Attribute:  list by input sequence | ||||
|         addr: the string want to be judged  | ||||
|     Return value: | ||||
|         1 : yes | ||||
|         0 : no | ||||
| =cut | ||||
| #------------------------------------------ | ||||
| sub isIpAddr{ | ||||
|     my $addr = shift; | ||||
|     $addr=shift if(($addr) && ($addr =~ /ProbeUtils/)); | ||||
|     return 0 unless($addr); | ||||
|     return 0 if($addr !~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); | ||||
|     return 0 if ($1 > 255 || $1 == 0 || $2 > 255 || $3 > 255 || $4 > 255); | ||||
|     return 1; | ||||
| }   | ||||
|  | ||||
| #------------------------------------------ | ||||
| =head3 | ||||
|     Description: | ||||
|         Judge if a IP address belongs to a network | ||||
|     Attribute:  list by input sequence | ||||
|         net : network address, such like 10.10.10.0 | ||||
|         mask: network mask.  suck like 255.255.255.0 | ||||
|         ip:   a ip address | ||||
|     Return value: | ||||
|         1 : yes | ||||
|         0 : no | ||||
| =cut | ||||
| #------------------------------------------ | ||||
| sub isIpBelongToNet{ | ||||
|     my $net=shift; | ||||
|     $net=shift if(($net) && ($net =~ /ProbeUtils/)); | ||||
|     my $mask=shift; | ||||
|     my $targetip=shift; | ||||
|  | ||||
|     return 0 if($net !~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); | ||||
|     return 0 if($mask !~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); | ||||
|     return 0 if(! isIpAddr($targetip)); | ||||
|  | ||||
|     my $bin_mask=0; | ||||
|     $bin_mask=(($1+0)<<24)+(($2+0)<<16)+(($3+0)<<8)+($4+0) if($mask =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); | ||||
|  | ||||
|     my $bin_ip=0; | ||||
|     $bin_ip=(($1+0)<<24)+(($2+0)<<16)+(($3+0)<<8)+($4+0) if($targetip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); | ||||
|  | ||||
|     my $tmp_net = $bin_mask&$bin_ip; | ||||
|  | ||||
|     my $bin_net=0; | ||||
|     $bin_net=(($1+0)<<24)+(($2+0)<<16)+(($3+0)<<8)+($4+0) if($net =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); | ||||
|  | ||||
|     return 0 if( $tmp_net != $bin_net); | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| #------------------------------------------ | ||||
| =head3 | ||||
|    Description: | ||||
|         Get distro name of current operating system | ||||
|     Attribute:  list by input sequence | ||||
|         None | ||||
|     Return value: | ||||
|         A string, include value are sles, redhat and ubuntu | ||||
| =cut | ||||
| #------------------------------------------ | ||||
| sub getOS{ | ||||
|     my $os="unknown"; | ||||
|     my $output = `cat /etc/*release* 2>&1`; | ||||
|     if($output =~ /suse/i){ | ||||
|         $os="sles"; | ||||
|     }elsif($output =~ /Red Hat/i){ | ||||
|         $os="redhat"; | ||||
|     }elsif($output =~ /ubuntu/i){ | ||||
|         $os="ubuntu"; | ||||
|     } | ||||
|      | ||||
|     return  $os; | ||||
| } | ||||
|  | ||||
| #------------------------------------------ | ||||
| =head3 | ||||
|     Description: | ||||
|         Judge if a IP address is a static IP address  | ||||
|     Attribute:  list by input sequence | ||||
|         ip:   a ip address | ||||
|         nic:  the network adapter which ip belongs to | ||||
|     Return value: | ||||
|         1 : yes | ||||
|         0 : no | ||||
| =cut | ||||
| #------------------------------------------ | ||||
| sub isStaticIp{ | ||||
|     my $ip=shift; | ||||
|     $ip=shift if(($ip) && ($ip =~ /ProbeUtils/)); | ||||
|     my $nic=shift; | ||||
|     my $os = getOS(); | ||||
|     my $rst=0; | ||||
|  | ||||
|     if($os =~ /redhat/){ | ||||
|         my $output1=`cat /etc/sysconfig/network-scripts/ifcfg-$nic 2>&1 |grep -i IPADDR`; | ||||
|         my $output2=`cat /etc/sysconfig/network-scripts/ifcfg-$nic 2>&1 |grep -i BOOTPROTO`; | ||||
|         $rst=1  if(($output1 =~ /$ip/) && ($output2 =~ /static/i));  | ||||
|     }elsif($os =~ /sles/){ | ||||
|         my $output1=`cat /etc/sysconfig/network/ifcfg-$nic 2>&1 |grep -i IPADDR`; | ||||
|         my $output2=`cat /etc/sysconfig/network/ifcfg-$nic 2>&1 |grep -i BOOTPROTO`; | ||||
|         $rst=1 if(($output1 =~ /$ip/) && ($output2 =~ /static/i)); | ||||
|     }elsif($os =~/ubuntu/){ | ||||
|         my $output=`cat /etc/network/interfaces 2>&1|grep -E "iface\s+$nic"`; | ||||
|         $rst=1 if($output =~ /static/i); | ||||
|     } | ||||
|     return $rst; | ||||
| } | ||||
|  | ||||
| #------------------------------------------ | ||||
| =head3 | ||||
|     Description: | ||||
|         Judge if SELinux is opened in current operating system  | ||||
|     Attribute:  list by input sequence | ||||
|          None | ||||
|     Return value: | ||||
|         1 : yes | ||||
|         0 : no | ||||
| =cut | ||||
| #------------------------------------------ | ||||
| sub isSelinuxEnable{ | ||||
|     if (-e "/usr/sbin/selinuxenabled") { | ||||
|        `/usr/sbin/selinuxenabled`; | ||||
|        if ($? == 0) { | ||||
|          return 1; | ||||
|        } else { | ||||
|          return 0; | ||||
|        } | ||||
|     } else { | ||||
|        return 0; | ||||
|     } | ||||
| }    | ||||
|  | ||||
| #------------------------------------------ | ||||
| =head3 | ||||
|     Description: | ||||
|         Judge if firewall is opened in current operating system | ||||
|     Attribute:  list by input sequence | ||||
|          None | ||||
|     Return value: | ||||
|         1 : yes | ||||
|         0 : no | ||||
| =cut | ||||
| #------------------------------------------ | ||||
| sub isFirewallOpen{ | ||||
|     my $os =getOS(); | ||||
|     my $output; | ||||
|     my $rst=0; | ||||
|  | ||||
|     if($os =~ /redhat/){ | ||||
|         $output=`service iptables status 2>&1`; | ||||
|         $rst=1  if($output =~ /running/i); | ||||
|     }elsif($os =~ /sles/){ | ||||
|         $output=`service SuSEfirewall2_setup status`; | ||||
|         $rst=1 if($output =~ /running/i); | ||||
|     }elsif($os =~/ubuntu/){ | ||||
|         $output=`ufw status`; | ||||
|         $rst=1 if($output =~ /Status: active/i);         | ||||
|     } | ||||
|     return $rst; | ||||
| } | ||||
|  | ||||
| #------------------------------------------ | ||||
| =head3 | ||||
|     Description: | ||||
|         Judge if http service is ready to use in current operating system | ||||
|     Attribute:  list by input sequence | ||||
|         ip:  http server's ip  | ||||
|     Return value: | ||||
|         1 : yes | ||||
|         0 : no | ||||
| =cut | ||||
| #------------------------------------------ | ||||
| sub isHttpReady{ | ||||
|      my $mnip=shift; | ||||
|      $mnip=shift if(($mnip) && ($mnip =~ /ProbeUtils/)); | ||||
|        | ||||
|      my $http = "http://$mnip/install/postscripts/efibootmgr"; | ||||
|      rename("./efibootmgr", "./efibootmgr.org") if(-e "./efibootmgr"); | ||||
|  | ||||
|      my $outputtmp = `wget $http 2>&1`; | ||||
|      my $rst =$?; | ||||
|      if(($outputtmp =~ /200 OK/) && (!$rst) && (-e "./efibootmgr")){ | ||||
|          unlink("./efibootmgr"); | ||||
|          rename("./efibootmgr.org", "./efibootmgr") if(-e "./efibootmgr.org"); | ||||
|          return 1; | ||||
|      }else{ | ||||
|          rename("./efibootmgr.org", "./efibootmgr") if(-e "./efibootmgr.org"); | ||||
|          return 0; | ||||
|      }         | ||||
| } | ||||
|  | ||||
| #------------------------------------------ | ||||
| =head3 | ||||
|     Description: | ||||
|         Judge if tftp service is ready to use in current operating system | ||||
|     Attribute:  list by input sequence | ||||
|         ip:  tftp server's ip | ||||
|     Return value: | ||||
|         1 : yes | ||||
|         0 : no | ||||
| =cut | ||||
| #------------------------------------------ | ||||
| sub isTftpReady{ | ||||
|      my $mnip=shift; | ||||
|      $mnip=shift if(($mnip) && ($mnip =~ /ProbeUtils/)); | ||||
|    | ||||
|      rename("/tftpboot/tftptestt.tmp", "/tftpboot/tftptestt.tmp.old") if(-e "/tftpboot/tftptestt.tmp"); | ||||
|      rename("./tftptestt.tmp", "./tftptestt.tmp.old") if(-e "./tftptestt.tmp"); | ||||
|  | ||||
|      system("touch /tftpboot/tftptestt.tmp"); | ||||
|      my $output = `tftp -4 -v $mnip  -c get tftptestt.tmp`; | ||||
|      if((!$?) && (-e "./tftptestt.tmp")){ | ||||
|          unlink("./tftptestt.tmp"); | ||||
|          rename("./tftptestt.tmp.old", "./tftptestt.tmp") if(-e "./tftptestt.tmp.old"); | ||||
|          rename("/tftpboot/tftptestt.tmp.old","/tftpboot/tftptestt.tmp") if(-e "/tftpboot/tftptestt.tmp.old"); | ||||
|          return 1; | ||||
|      }else{ | ||||
|          rename("./tftptestt.tmp.old", "./tftptestt.tmp") if(-e "./tftptestt.tmp.old"); | ||||
|          rename("/tftpboot/tftptestt.tmp.old","/tftpboot/tftptestt.tmp") if(-e "/tftpboot/tftptestt.tmp.old"); | ||||
|          return 0; | ||||
|      } | ||||
| } | ||||
|  | ||||
|  | ||||
| #------------------------------------------ | ||||
| =head3 | ||||
|     Description: | ||||
|         Judge if DNS service is ready to use in current operating system | ||||
|     Attribute:  list by input sequence | ||||
|         ip:  DNS server's ip | ||||
|     Return value: | ||||
|         1 : yes | ||||
|         0 : no | ||||
| =cut | ||||
| #------------------------------------------ | ||||
| sub isDnsReady{ | ||||
|     my $mnip=shift; | ||||
|     $mnip=shift if(($mnip) && ($mnip =~ /ProbeUtils/)); | ||||
|     my $hostname=shift; | ||||
|     my $domain=shift; | ||||
|      | ||||
|     my $output = `nslookup $mnip $mnip 2>&1`; | ||||
|      | ||||
|     if($?){ | ||||
|         return 0; | ||||
|     }else{ | ||||
|          chomp($output); | ||||
|          my $tmp=`echo "$output" |grep "Server:[\t\s]*$mnip" >/dev/null 2>&1`; | ||||
|          print "$tmp"; | ||||
|          return 0 if($?); | ||||
|          $tmp = `echo "$output"|grep "name ="|grep "$hostname\.$domain" >/dev/null 2>&1`; | ||||
|          return 0 if($?); | ||||
|          return 1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| 1; | ||||
							
								
								
									
										475
									
								
								xCAT-probe/subcmds/xcatmn
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										475
									
								
								xCAT-probe/subcmds/xcatmn
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,475 @@ | ||||
| #! /usr/bin/perl | ||||
|  | ||||
| #use lib "/home/probe/lib/perl"; | ||||
| use lib "/opt/xcat/probe/lib/perl"; | ||||
| use ProbeUtils; | ||||
| use File::Basename; | ||||
| use Getopt::Long; | ||||
|  | ||||
| my $proname=basename("$0"); | ||||
| my $help; | ||||
| my $mnip; | ||||
| my $test; | ||||
| my $output="stdout"; | ||||
| my $verbose=0; | ||||
| my $rst=0; | ||||
|  | ||||
| $::USAGE = "Usage: | ||||
|     $proname -h | ||||
|     $proname -t | ||||
|     $proname [-m] <mnip> [-f] <outputfile> [-v] | ||||
|  | ||||
| Description: | ||||
|     After xcat installation, use this command to check if xcat has been installed correctly and is ready for use.  | ||||
|  | ||||
| Options: | ||||
|     -h : get usage information of $proname | ||||
|     -t : to verify if $proname can work, reserve option for probe framework | ||||
|     -m : specify current MN's IP address, if not specified, use master ip in site table | ||||
|     -f : specify where should $proname pass its output to. if not specified, pass output to STDOUT by default. | ||||
|     -v : output more information for debug | ||||
| "; | ||||
|  | ||||
| sub returncmdoutput{ | ||||
|     my $rst=shift; | ||||
|     chomp($rst); | ||||
|     my @lines=split("[\n\r]", $rst); | ||||
|     foreach my $line (@lines){ | ||||
|         ProbeUtils->send_msg("$output",0, "$line"); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| #------------------------------------- | ||||
| # main process | ||||
| #------------------------------------- | ||||
| if ( | ||||
|     !GetOptions("--help|h|?" => \$help, | ||||
|                 "t"=> \$test, | ||||
|                 "v"=> \$verbose, | ||||
|                 "f=s" => \$output, | ||||
|                 "m=s" => \$mnip)) | ||||
| { | ||||
|     ProbeUtils->send_msg("$output",2, "Invalid parameter for $proname"); | ||||
|     ProbeUtils->send_msg("$output",0, "$::USAGE"); | ||||
|     exit 1; | ||||
| } | ||||
|  | ||||
| if($help){  | ||||
|      if($output ne "stdout"){ | ||||
|          ProbeUtils->send_msg("$output",0, "$::USAGE"); | ||||
|      }else{ | ||||
|          print "$::USAGE"; | ||||
|      } | ||||
|      exit 0; | ||||
| } | ||||
|  | ||||
| if($test){ | ||||
|    ProbeUtils->send_msg("$output",3,"After xcat installation, use this command to check if xcat has been installed correctly and is ready for use. Before using this command        , please install tftp, nslookup and wget commands ahead. The platform supported are redhat, sles and ubuntu."); | ||||
|    exit 0; | ||||
| } | ||||
|  | ||||
| my $hostname=`hostname -s`; | ||||
| chomp($hostname); | ||||
| my $hostipaddr=`hostname -i`; | ||||
| chomp($hostipaddr); | ||||
| my $othername=`hostname -a`; | ||||
| chomp($othername); | ||||
|  | ||||
| ProbeUtils->send_msg("$output",0,"Short hostname of this server is $hostname") if($verbose); | ||||
| ProbeUtils->send_msg("$output",0,"The address of hostname $hostname is $hostipaddr")  if($verbose); | ||||
| ProbeUtils->send_msg("$output",0,"The other names of $hostname is $othername") if($verbose && ($othername ne "")); | ||||
|  | ||||
| my $msg="Sub process 'xcatd: SSL listener' is running"; | ||||
| my $xcatdproc = `ps aux|grep -v grep|grep xcatd`; | ||||
| chomp($xcatdproc); | ||||
| if($xcatdproc =~ /xcatd: SSL listener/){ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| } | ||||
|  | ||||
| $msg="Sub process 'xcatd: DB Access' is running"; | ||||
| if($xcatdproc =~ /xcatd: DB Access/){ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| } | ||||
|  | ||||
| $msg="Sub process 'xcatd: UDP listener' is running"; | ||||
| if($xcatdproc =~ /xcatd: UDP listener/){ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| } | ||||
|  | ||||
| $msg="Sub process 'xcatd: install monitor' is running"; | ||||
| if($xcatdproc =~ /xcatd: install monitor/){ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| } | ||||
|  | ||||
| $msg="Sub process 'xcatd: Discovery worker' is running"; | ||||
| if($xcatdproc =~ /xcatd: Discovery worker/){ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| } | ||||
|  | ||||
| $msg="Sub process 'xcatd: Command log writer' is running"; | ||||
| if($xcatdproc =~ /xcatd: Command log writer/){ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",1,"Sub process 'xcatd: Command log writer' isn't running"); | ||||
| } | ||||
| exit 1 if($rst); | ||||
|   | ||||
|  | ||||
| my $xcatdport=`tabdump site 2>&1 | awk -F',' '/xcatdport/ { gsub(/"/, "", \$2) ; print \$2 }'`; | ||||
| chomp($xcatdport); | ||||
| ProbeUtils->send_msg("$output",0,"The port used by the xcatd daemon for client/server communication is $xcatdport") if($verbose); | ||||
| $msg="xcatd is listening on port $xcatdport"; | ||||
| my $cmdoutput = `netstat -ant|grep LISTEN|grep $xcatdport`; | ||||
| if($?){ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1;  | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| } | ||||
|  | ||||
| my $xcatiport=`tabdump site 2>&1| awk -F',' '/xcatiport/ { gsub(/"/, "", \$2) ; print \$2 }'`; | ||||
| chomp($xcatiport); | ||||
| ProbeUtils->send_msg("$output",0,"The port used by xcatd to receive install status updates from nodes is $xcatiport") if($verbose); | ||||
| $msg="xcatd is listening on port $xcatiport"; | ||||
| $cmdoutput = `netstat -ant|grep LISTEN|grep $xcatiport`; | ||||
| if($?){ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| } | ||||
| exit 1 if($rst); | ||||
|      | ||||
| $msg ="'lsxcatd -a' works"; | ||||
| $cmdoutput=`lsxcatd -a 2>&1`; | ||||
| $rst=$?; | ||||
| returncmdoutput($cmdoutput) if($verbose); | ||||
| if($rst){ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     exit $rst; | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| } | ||||
|  | ||||
| my $masteripinsite=`tabdump site | awk -F',' '/master/ { gsub(/"/, "", \$2) ; print \$2 }'`; | ||||
| chomp($masteripinsite); | ||||
| ProbeUtils->send_msg("$output",0, "The value of 'master' in 'site' table is $masteripinsite") if($verbose); | ||||
| ProbeUtils->send_msg("$output",2, "There isn't 'master' definition in 'site' talbe") if($masteripinsite eq ""); | ||||
|  | ||||
| $msg="The value of 'master' in 'site' table is a IP address"; | ||||
| if(ProbeUtils->isIpAddr("$masteripinsite")){ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     exit 1; | ||||
| } | ||||
|  | ||||
| if($mnip){ | ||||
|     $msg="The IP passed by command line equals the value of 'master' in 'site' table"; | ||||
|     if($mnip eq $masteripinsite){ | ||||
|         ProbeUtils->send_msg("$output",3,"$msg"); | ||||
|     }else{ | ||||
|         ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|         $rst=1; | ||||
|     } | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",0,"Use the value of 'master' of 'site' table as MNIP") if($verbose);  | ||||
|     $mnip=$masteripinsite; | ||||
| } | ||||
|  | ||||
| ProbeUtils->send_msg("$output",0,"MNIP used in below checking is $mnip") if($verbose); | ||||
|  | ||||
| $msg="There is configuration in 'passwd' table for 'system' for node provision"; | ||||
| my $passwd=`tabdump passwd |awk -F',' '/system/ { gsub(/"/, "", \$2); gsub(/"/, "", \$3); print \$2,\$3 }'`; | ||||
| chomp($passwd); | ||||
| my ($username, $pw)=split(" ", $passwd); | ||||
| if($username eq "" || $pw eq ""){ | ||||
|     ProbeUtils->send_msg("$output",0,"There isn't username or password for 'system' in 'passwd' table"); | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| } | ||||
|  | ||||
| $msg="There is a network adapter on current server is configured by IP $mnip"; | ||||
| my $nic=`ip addr show |grep -B2 $mnip|grep mtu|awk '{print \$2}'|sed -e 's/:\$//'`; | ||||
| chomp($nic); | ||||
| if("$nic" eq ""){ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",0,"IP $mnip belongs to network adapter $nic") if($verbose); | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| } | ||||
|  | ||||
| $msg="IP $mnip is a static IP on current server"; | ||||
| if(ProbeUtils->isStaticIp("$mnip", "$nic")){ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",1,"IP $mnip is not a static ip on current server"); | ||||
| } | ||||
|  | ||||
| $msg="$mnip belongs to one of networks defined in 'networks' table"; | ||||
| my $networks=`tabdump networks|grep -v "^#"`; | ||||
| $networks=~s/\"//g; | ||||
| my $netcnt = `echo "$networks"|wc -l`; | ||||
| my $hit=0; | ||||
| for(my $i=1;$i<$netcnt+1;$i++){ | ||||
|     my $line=`echo "$networks" |sed -n ${i}p |awk -F"," '{print \$2,\$3,\$4}'`; | ||||
|     chomp($line); | ||||
|     if($line =~ /(.+) (.+) (.+)/){ | ||||
|          $hit=1 if(ProbeUtils->isIpBelongToNet("$1", "$2", $mnip) && ("$3" eq "$nic")); | ||||
|     } | ||||
| } | ||||
| if($hit){ | ||||
|      ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|      ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|      $rst=1; | ||||
| } | ||||
|  | ||||
| $msg="There is domain definition in 'site' table"; | ||||
| my $domain=`tabdump site | awk -F',' '/domain/ { gsub(/"/, "", \$2) ; print \$2 }'`; | ||||
| chomp($domain); | ||||
| if($domain){ | ||||
|     ProbeUtils->send_msg("$output",0,"The value of 'domain' in 'site' table is $domain") if($verbose); | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| } | ||||
|  | ||||
| $msg="There are /install and /install/postscripts directory on current server"; | ||||
| if(-e "/install/postscripts/"){ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| } | ||||
|  | ||||
| $msg="There is /tftpboot directory on current server"; | ||||
| if(-e "/tftpboot/"){ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| } | ||||
|  | ||||
| my $expected=10; | ||||
| $msg="The free space of / directory is more than $expected G"; | ||||
| my $diskspace=`df -h|awk '{print \$4,\$6}'|grep -E "/\$"`; | ||||
| if($?){ | ||||
|     ProbeUtils->send_msg("$output",0,"There isn't any filesystem mount on / directory"); | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| }else{ | ||||
|     chomp($diskspace); | ||||
|     my ($size, $dir) = split(" ", $diskspace); | ||||
|     $size=~s/G//g; | ||||
|     ProbeUtils->send_msg("$output",0,"The free space of / is $size G") if($verbose); | ||||
|     if($size<$expected){ | ||||
|         ProbeUtils->send_msg("$output",1,"The free space of / is less than $expected G"); | ||||
|     }else{ | ||||
|         ProbeUtils->send_msg("$output",3,"$msg"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| $expected=1; | ||||
| $msg="The free space of /var directory is more than $expected G"; | ||||
| $diskspace=`df -h|awk '{print \$4,\$6}'|grep -E "/var\$"`; | ||||
| if(!$?){ | ||||
|     chomp($diskspace); | ||||
|     my ($size, $dir) = split(" ", $diskspace); | ||||
|     $size=~s/G//g; | ||||
|     ProbeUtils->send_msg("$output",0,"The free space of /var is $size G") if($verbose); | ||||
|     if($size<$expected){ | ||||
|         ProbeUtils->send_msg("$output",1,"The free space of /var is less than $expected G"); | ||||
|     }else{ | ||||
|         ProbeUtils->send_msg("$output",3,"$msg"); | ||||
|     } | ||||
| }   | ||||
|  | ||||
| $expected=1; | ||||
| $msg="The free space of /tmp directory is more than $expected G"; | ||||
| $diskspace=`df -h|awk '{print \$4,\$6}'|grep -E "/tmp\$"`; | ||||
| if(!$?){ | ||||
|     chomp($diskspace); | ||||
|     my ($size, $dir) = split(" ", $diskspace); | ||||
|     $size=~s/G//g; | ||||
|     ProbeUtils->send_msg("$output",0,"The free space of /tmp is $size G") if($verbose); | ||||
|     if($size<$expected){ | ||||
|         ProbeUtils->send_msg("$output",1,"The free space of /tmp is less than $expected G"); | ||||
|     }else{ | ||||
|         ProbeUtils->send_msg("$output",3,"$msg"); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| $expected=10; | ||||
| $msg="The free space of /install directory is more than $expected G"; | ||||
| $diskspace=`df -h|awk '{print \$4,\$6}'|grep -E "/install\$"`; | ||||
| if(!$?){ | ||||
|     chomp($diskspace); | ||||
|     my ($size, $dir) = split(" ", $diskspace); | ||||
|     $size=~s/G//g; | ||||
|     ProbeUtils->send_msg("$output",0,"The free space of /install is $size G") if($verbose); | ||||
|     if($size<$expected){ | ||||
|         ProbeUtils->send_msg("$output",1,"The free space of /install is less than $expected G"); | ||||
|     }else{ | ||||
|         ProbeUtils->send_msg("$output",3,"$msg"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| $msg="SELinux is disabled on current server"; | ||||
| if(ProbeUtils->isSelinuxEnable()){ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg");  | ||||
|     $rst=1; | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| } | ||||
|  | ||||
| $msg="Firewall is closed on current server";  | ||||
| if(ProbeUtils->isFirewallOpen()){ | ||||
|     ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|     $rst=1; | ||||
| }else{ | ||||
|     ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| } | ||||
|  | ||||
| `which wget > /dev/null 2>&1`; | ||||
| if($?){ | ||||
|     ProbeUtils->send_msg("$output",1,"wget command isn't installed on current server, skip checking HTTP service"); | ||||
| }else{ | ||||
|     $msg="HTTP service is ready on $mnip"; | ||||
|     if(ProbeUtils->isHttpReady("$mnip")){ | ||||
|         ProbeUtils->send_msg("$output",3,"$msg"); | ||||
|     }else{ | ||||
|         ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|         $rst=1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| `which tftp > /dev/null 2>&1`; | ||||
| if($?){ | ||||
|     ProbeUtils->send_msg("$output",1,"tftp command isn't installed in current server, skip checking tftp service"); | ||||
| }else{ | ||||
|     $msg="TFTP service is ready on $mnip"; | ||||
|     if(ProbeUtils->isTftpReady("$mnip")){ | ||||
|         ProbeUtils->send_msg("$output",3,"$msg"); | ||||
|     }else{ | ||||
|         ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|         $rst =1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| `which nslookup > /dev/null 2>&1`; | ||||
| if($?){ | ||||
|     ProbeUtils->send_msg("$output",1,"nslookup command isn't installed in current server, skip checking DNS service"); | ||||
| }else{ | ||||
|     $msg="DNS server is ready on $mnip"; | ||||
|     ProbeUtils->send_msg("$output",0,"hostname used to check DNS is $hostname, domain used to check DNS is $domain")  if($verbose); | ||||
|     if(ProbeUtils->isDnsReady("$mnip","$hostname", "$domain")){ | ||||
|         ProbeUtils->send_msg("$output",3,"$msg"); | ||||
|     }else{ | ||||
|         ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|         $rst =1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| my $os=ProbeUtils->getOS(); | ||||
| my $leasefile=""; | ||||
| $leasefile="/var/lib/dhcpd/dhcpd.leases" if($os =~ /redhat/i); | ||||
| $leasefile="/var/lib/dhcp/db/dhcpd.leases" if($os =~ /sles/i); | ||||
| $leasefile="/var/lib/dhcp/dhcpd.leases" if($os =~ /ubuntu/i); | ||||
| $msg="The size of $leasefile is less than 100M"; | ||||
| my $filesizetmp=`du -sb $leasefile`; | ||||
| if($?){ | ||||
|      returncmdoutput($filesizetmp) if($verbose); | ||||
|      ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|      $rst=1; | ||||
| }else{ | ||||
|      chomp($filesizetmp); | ||||
|      my ($size, $file) = split(" ", $filesizetmp); | ||||
|      ProbeUtils->send_msg("$output",0,"The size of $leasefile is $size bytes") if($verbose); | ||||
|      if($size > 104857600){ | ||||
|          ProbeUtils->send_msg("$output",1,"The size of $leasefile is more than 100M"); | ||||
|      }else{ | ||||
|          ProbeUtils->send_msg("$output",3,"$msg"); | ||||
|      } | ||||
| } | ||||
|  | ||||
| my $msg="DHCP service is ready on $mnip"; | ||||
| my $rc=0;  | ||||
| {    #very important brace to create a block | ||||
|     my $tmp=`chdef xcatmntest groups=all ip=$mnip  mac=aa:aa:aa:aa:aa:aa`; | ||||
|     if($?){ | ||||
|          returncmdoutput($tmp) if($verbose); | ||||
|          ProbeUtils->send_msg("$output",0,"Simulate a node by chdef failed") if($verbose); | ||||
|          $rc=1; | ||||
|          last; | ||||
|     }else{ | ||||
|          ProbeUtils->send_msg("$output",0,"Simulate a node xcatmntest<ip=$mnip mac=aa:aa:aa:aa:aa:aa> to do dhcp test") if($verbose); | ||||
|     }  | ||||
|   | ||||
|     $tmp=`makehosts xcatmntest`; | ||||
|     if($?){ | ||||
|          returncmdoutput($tmp) if($verbose); | ||||
|          ProbeUtils->send_msg("$output",0,"makehosts xcatmntest failed") if($verbose); | ||||
|          $rc=1; | ||||
|          `rmdef xcatmntest`; | ||||
|          last; | ||||
|     } | ||||
|  | ||||
|     $tmp = `makedhcp xcatmntest 2>&1`; | ||||
|     if($?){ | ||||
|         returncmdoutput($tmp) if($verbose); | ||||
|         ProbeUtils->send_msg("$output",0,"makedhcp  xcatmntest failed") if($verbose); | ||||
|         $rc=1;  | ||||
|         `makehosts -d xcatmntest &&  rmdef xcatmntest`; | ||||
|         last; | ||||
|     }  | ||||
|  | ||||
|     $tmp = `makedhcp -q  xcatmntest`; | ||||
|     if($?){ | ||||
|         returncmdoutput($tmp) if($verbose); | ||||
|         ProbeUtils->send_msg("$output",0,"makedhcp -q xcatmntest failed") if($verbose); | ||||
|         $rc=1; | ||||
|         `makedhcp -d xcatmntest && makehosts -d xcatmntest &&  rmdef xcatmntest`; | ||||
|         last; | ||||
|     } | ||||
|     chomp($tmp); | ||||
|     if($tmp !~ /xcatmntest: ip-address = $mnip, hardware-address = aa:aa:aa:aa:aa:aa/){ | ||||
|         returncmdoutput($tmp) if($verbose); | ||||
|         ProbeUtils->send_msg("$output",0,"DHCP server's reply is wrong") if($verbose); | ||||
|         $rc=1; | ||||
|         `makedhcp -d xcatmntest && makehosts -d xcatmntest &&  rmdef xcatmntest`; | ||||
|         last; | ||||
|     }  | ||||
|      | ||||
|     ProbeUtils->send_msg("$output",0,"Start to clear simulate information for dhcp test") if($verbose); | ||||
|     $tmp=`makedhcp -d xcatmntest && makehosts -d xcatmntest &&  rmdef xcatmntest`; | ||||
|     returncmdoutput($tmp) if($verbose); | ||||
| } | ||||
| if($rc){ | ||||
|      ProbeUtils->send_msg("$output",2,"$msg"); | ||||
|      $rst=1; | ||||
| }else{ | ||||
|      ProbeUtils->send_msg("$output",3,"$msg"); | ||||
| } | ||||
| exit $rst ; | ||||
							
								
								
									
										258
									
								
								xCAT-probe/xcatprobe
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										258
									
								
								xCAT-probe/xcatprobe
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,258 @@ | ||||
| #!/usr/bin/env perl | ||||
|  | ||||
| use File::Basename; | ||||
| use Data::Dumper; | ||||
| use File::Path; | ||||
| use POSIX qw(WNOHANG setsid :errno_h); | ||||
| use Term::ANSIColor qw(:constants); | ||||
| $Term::ANSIColor::AUTORESET=1; | ||||
|  | ||||
| my $pro_name=basename($0); | ||||
| my $pro_dir=dirname($0); | ||||
| #my $plugin_dir="$pro_dir/subcmds"; | ||||
| my $plugin_dir="/opt/xcat/probe/subcmds"; | ||||
| my %cmds=(); | ||||
|  | ||||
| my $verbose=0; | ||||
| my $nocolor=0; | ||||
| my $help=0; | ||||
| my $list=0; | ||||
|  | ||||
| $::USAGE = "Usage: | ||||
| xcatprobe -h | ||||
| xcatprobe -l | ||||
| xcatprobe -v | ||||
| xcatprobe [-n] <subcommand>  <attrbute_to_subcommand> | ||||
|  | ||||
| Options: | ||||
|     -h : get usage information of $pro_name  | ||||
|     -l : list all valid sub commands | ||||
|     -v : print verbose information of $pro_name | ||||
|     -n : print output without colors  | ||||
| "; | ||||
|  | ||||
| #----------------------------------- | ||||
| =head3 | ||||
|     Description: | ||||
|     Load sub commands from ~/subcmds directory | ||||
|     Using -t option of command to judge if it is valid. | ||||
|     If command in ~/subcmds has syntax error, or doesn't follow interface specification, this command will be skipped | ||||
| =cut | ||||
| #----------------------------------- | ||||
| sub loadsubcmds{ | ||||
|     my @candidate=glob("$plugin_dir/*"); | ||||
|     my @subcmds=(); | ||||
|     my @validflag=("debug", "warning", "failed", "ok"); | ||||
|     my $output; | ||||
|    | ||||
|     print  "Starting to load sub command form ~/subcmds.............\n" if($verbose); | ||||
|  | ||||
|     foreach (@candidate) { | ||||
|         my $cmdname = basename("$_"); | ||||
|         $output = `$_ -t 2>&1`; | ||||
|         chomp($output); | ||||
|       | ||||
|         print "\n-->$_\n[OUTPUT]:\n$output\n" if($verbose); | ||||
|         if($output !~ /\[(\w+)\]\s*:\s*(.+)/){ | ||||
|             print "skip $_ for doing '$_ -t' failed, bad format\n" if($verbose); | ||||
|             next; | ||||
|         }else{ | ||||
|             my $desc =$2; | ||||
|             unless(@validflag ~~ /$1/){ | ||||
|                 print "skip $_ for doing '$_ -t' failed, invalid flag\n" if($verbose); | ||||
|                 next; | ||||
|             } | ||||
|             $cmds{$cmdname} = $desc; | ||||
|             print "load $_ \n"  if($verbose); | ||||
|         } | ||||
|     } | ||||
|     print  "\nLoad sub command.........[done]\n"  if($verbose); | ||||
| } | ||||
|  | ||||
|  | ||||
| #----------------------------------- | ||||
| =head3 | ||||
|     Description: | ||||
|     Format the output of sub command, make them colorfully. | ||||
| =cut | ||||
| #---------------------------------- | ||||
| sub format_cmd_output{ | ||||
|     my $line=shift; | ||||
|     my $nocolor=shift; | ||||
|  | ||||
|     if($line =~ /\[(\w+)\]\s*:\s*(.+)/){ | ||||
|         my $flag = $1; | ||||
|         my $msg = $2;     | ||||
|         if($flag =~ /failed/i){ | ||||
|             if($nocolor){ | ||||
|                 print "[FAIL] "; | ||||
|             }else{ | ||||
|                 print BOLD RED   "[FAIL] "; | ||||
|             } | ||||
|         }elsif($flag =~ /warning/i){ | ||||
|             if($nocolor){ | ||||
|                 print "[WARN] "; | ||||
|             }else{ | ||||
|                 print BOLD BLUE  "[WARN] "; | ||||
|             } | ||||
|         }elsif($flag =~ /ok/i){ | ||||
|             if($nocolor){ | ||||
|                 print "[ OK ] "; | ||||
|             }else{ | ||||
|                 print BOLD GREEN "[ OK ] "; | ||||
|             } | ||||
|         }elsif($flag =~ /debug/i){ | ||||
|             print "       "; | ||||
|         } | ||||
|         print "$msg\n"; | ||||
|     }else{ | ||||
|         print "$line\n"; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| #----------------------------------- | ||||
| =head3 | ||||
|     Description: | ||||
|     List all valid sub command in ~/subcmds directory | ||||
| =cut | ||||
| #---------------------------------- | ||||
| sub listvalidsubcmd{ | ||||
|     my $maxlen=0; | ||||
|     foreach my $key (keys %cmds) { | ||||
|         $maxlen=length($key) if(length($key)>$maxlen); | ||||
|     } | ||||
|     $maxlen+=4; | ||||
|     print "Supported sub commands are:\n"; | ||||
|     foreach my $key (keys %cmds){ | ||||
|         my @desc=split(" ", $cmds{$key}); | ||||
|         my $str=""; | ||||
|         my @formatdesc=(); | ||||
|         foreach my $word (@desc){ | ||||
|             $str.=$word." "; | ||||
|             if(length($str)>100){ | ||||
|                push @formatdesc, $str; | ||||
|                $str=""; | ||||
|             } | ||||
|         } | ||||
|         push @formatdesc, $str; | ||||
|         if($nocolor){ | ||||
|             print "$key"; | ||||
|         }else{ | ||||
|             print BOLD GREEN "$key"; | ||||
|         } | ||||
|         my $space=" " x ($maxlen-length($key)); | ||||
|         print "$space $formatdesc[0]\n"; | ||||
|         delete $formatdesc[0]; | ||||
|         $space=" " x $maxlen; | ||||
|         foreach my $line (@formatdesc){ | ||||
|             print "$space $line\n" if(length($line)); | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
|  | ||||
| ####################################### | ||||
| # main | ||||
| ####################################### | ||||
| my @tmpargv=@ARGV; | ||||
| my @supportopt=("-v","-h","-l","-n"); | ||||
| my $pluginname; | ||||
| my $optnum=0;  | ||||
| foreach my $attr (@tmpargv){ | ||||
|      if($attr =~ /^-/){ | ||||
|          unless(@supportopt ~~ /$attr/){ | ||||
|              print "Unsupported attribute: $attr\n"; | ||||
|              print $::USAGE; | ||||
|              exit 1; | ||||
|          } | ||||
|          $optnum++; | ||||
|          $help=1 if($attr eq "-h"); | ||||
|          $verbose=1 if($attr eq "-v"); | ||||
|          $list=1 if($attr eq "-l"); | ||||
|          $nocolor=1 if($attr eq "-n"); | ||||
|      }else{ | ||||
|          $pluginname=$attr; | ||||
|          last; | ||||
|      } | ||||
| } | ||||
|  | ||||
| &loadsubcmds; | ||||
| if(defined ($pluginname)){ | ||||
|     my $hit=0; | ||||
|     foreach my $key (keys %cmds){ | ||||
|         $hit=1 if($pluginname eq $key);  | ||||
|     } | ||||
|     unless($hit){ | ||||
|         print "Unsupported sub command: $pluginname\n"; | ||||
|         &listvalidsubcmd; | ||||
|         exit 1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| if($help){ | ||||
|     print $::USAGE; | ||||
|     exit 0;  | ||||
| } | ||||
|  | ||||
| if($ARGV[0] eq "-l"){ | ||||
|     &listvalidsubcmd; | ||||
|     exit 0; | ||||
| } | ||||
|  | ||||
| if(!defined ($pluginname)){ | ||||
|     print "There isn't sub command input from command line\n"; | ||||
|     exit 0; | ||||
| } | ||||
|  | ||||
| for(my $i =0; $i<$optnum+1; $i++){ | ||||
|     shift @tmpargv; | ||||
| } | ||||
| my $pluginattrs = join(" ", @tmpargv); | ||||
|  | ||||
| my $date = `date  +"%Y%m%d%H%M%S"`; | ||||
| chomp($date); | ||||
| my $cmmpath="/tmp/probe"; | ||||
| my $cmmfile="$cmmpath/$pluginname.$date"; | ||||
| mkpath("$cmmpath") unless(-d "$cmmpath"); | ||||
| `touch $cmmfile`; | ||||
| my $subcmd="$plugin_dir/$pluginname -f $cmmfile $pluginattrs"; | ||||
|  | ||||
| print "\n[main] subcmd = $subcmd\n"  if($verbose); | ||||
|  | ||||
| my $subproc = fork(); | ||||
| my $subrst=0; | ||||
| if(!defined($subproc)){ | ||||
|     print "Unable to fork new process to run subcommand\n"; | ||||
|     exit 1; | ||||
| }elsif($subproc==0){ | ||||
|     $SIG{INT} = sub { | ||||
|         print "Sub proc $$ recrive INT signal to exit"; | ||||
|         exit 0; | ||||
|     };  | ||||
|     print "[sub $$] run $subcmd\n----------------------\n" if($verbose); | ||||
|     `$subcmd`;  | ||||
|     exit $? ; | ||||
| } | ||||
|  | ||||
| if(!open (CMMFILE, "$cmmfile") ) { | ||||
|     print "[main] Failed to open $cmmfile\n"; | ||||
|     exit 1; | ||||
| } | ||||
| my $offset = 0; | ||||
| my $prst=0; | ||||
| if($subproc){ | ||||
|     do{ | ||||
|         seek(CMMFILE,$offset,0); | ||||
|         while(my $line = <CMMFILE>){ | ||||
|             chomp($line); | ||||
|             format_cmd_output($line, $nocolor); | ||||
|         } | ||||
|         $offset=tell; | ||||
|     }while(waitpid($subproc,  WNOHANG)==0) | ||||
| } | ||||
| close(CMMFILE); | ||||
|  | ||||
| unlink($cmmfile); | ||||
| exit 0; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user