#!/usr/bin/perl -w
#
#    findProc  finds one or more specified processes in the procmgt 
#              database.
#

#---------------------------------------  Parse the command line arguments
$listDir    = "$ENV{HOME}";
$listDir    = "$ENV{DMTPROCDIR}" if (defined($ENV{DMTPROCDIR}));
$nodeSelect = ".*";
$procSelect = ".*";
$exeSelect  = ".*";
$pidSelect  = ".*";
$mode       = "table";
$syntax = 0;
for (my $inx=0; $inx < @ARGV; $inx++) {
    my $Argi = $ARGV[$inx];
    if ($Argi eq "--all") {
	$procSelect = ".*";
    } elsif ($Argi eq "--exe") {
	$inx++;
	$exeSelect = $ARGV[$inx];
    } elsif ($Argi eq "--help") {
	$syntax = 1;
	last;
    } elsif ($Argi eq "--idle") {
	$pidSelect = "NA";
    } elsif ($Argi eq "--node") {
	if ($inx+1 == @ARGV || $ARGV[$inx+1] =~ "^--" ) {
	    $nodeSelect = `uname -n`;
	    chomp $nodeSelect;
	} else {
	    $inx++;
	    $nodeSelect = $ARGV[$inx];
	}
    } elsif ($Argi eq "--procdir") {
	$inx++;
	$listDir = $ARGV[$inx];
    } elsif ($inx == @ARGV - 1) {
	$procSelect = $Argi;
	$mode = "list";
    } else {
	print ("Unidentified argument: $Argi \n");
	$syntax = 1;
	last;
    }
}

#---------------------------------------  Bail out if --help or syntax error
if ($syntax) {
    print("findProc locates a process from the procmgt tables\n");
    print("The command syntax is: \n");
    print("findProc [--help] [--procdir <process-table-dir>] [--idle] \\ \n");
    print("         [--exe <exec-name>] [--node <node-name>] [--all] \\ \n");
    print("         [<process>] \n");
    print(" --help    Print this message\n");
    print(" --procdir Process table directory\n");
    print(" --idle    Select processes not currently running\n");
    print(" --exe     Select processes by executable name\n");
    print(" --all     List all processes running under procmgt\n");
    print(" --node    Select processes by node name\n");
    print(" <process> List specified process\n");
    exit 1;
}

#---------------------------------------  Parse the command line arguments
if ($mode eq "table") {
    printf "%-16s %-10s %5s %-12s %7s %s\n", "Process", "Node", "PID", 
	   "  Start   ", "Retries", "Executable";
#    print("--------------------------------------------------------------\n");
}
$listDir = "$listDir/" if ($listDir ne "" && ! ($listDir =~ '.*/$') );
@NodeList=split("\n", `ls -d1 ${listDir}Process_List_*`);
for (my $inx=0 ; $inx < @NodeList ; $inx++) {
    my $nodeDir = $NodeList[$inx];
    my $node    = $nodeDir;
    $node =~ s/^.*Process_List_//;
    next if (! ($node =~ "$nodeSelect") );
    my @procList=split("\n", `ls -d1 $nodeDir/*`);
    for (my $jnx=0 ; $jnx < @procList ; $jnx++) {
        my $procName = $procList[$jnx];
        $procName =~ s|^.*/||;
        next if (! ($procName =~ "$procSelect"));
        my $exeName = readlink("$nodeDir/$procName/exe");
        my $exeFile = $exeName;
        $exeFile   =~ s|^.*/||;
        next if (!($exeName =~ "$exeSelect") && !($exeFile =~ "$exeSelect"));
        my $pid = readlink("$nodeDir/$procName/pid");
        next if (!($pid =~ "$pidSelect"));
	my @pStat=lstat("$nodeDir/$procName/pid");
	my $pDate=localtime($pStat[10]);
	my $stDate = substr($pDate,4,12);
	my $retries = readlink("$nodeDir/$procName/restarts");
	if ($mode eq "table") {
	    printf "%-16s %-10s %5s %-12s %7s %s\n", $procName, $node, $pid, 
		    $stDate, $retries, $exeName;
	} else {
	    print ("Process:      $procName\n");
	    print ("Node:         $node\n");
	    print ("PID:          $pid\n");
	    print ("Start Time:   $stDate\n");
	    print ("Retries left: $retries\n");
	    print ("Executable:   $exeName\n");
	    print ("\n");
	}
    }
}
exit 0;
