i have a perl script which takes 'csv; file as input parameter and performs some tasks.
CSV file format :
MAGENTF,AGENTF8,mahfr001,tksfr01,. ./.profile 1>/dev/null 2>&1;ps -fe|grep 'gn1avm_agent -n AGENTF8'|grep gn1avm_agent|tr -s '[ ]' '[ ]'|cut -d ' ' -f 3|xargs kill -9,,. ./.profile 1>/dev/null 2>&1;gn1avm_runproc_Ksh -e OLC1AVMA -n AGENTF8 &,,ps -fu \$LOGNAME | grep 'gn1avm_agent -n AGENTF8$'|grep -v grep
here it takes first column as GROUP.
output :-
script.pl file.csv
it will give a list (based on first column i mentioned above as GROUP)
0) MAGENTF
1) MAGENTR
2) MCDR
but this script can select only one option and will proceed with its given action. if i select opyions 1 and then 2 , it will take all daemons mentioned under group 2 (MCDR). i want it to handle more than 1 option (handle more than 1 GROUP). so if i select 1 and 2 , it can take both group daemons and perform its action given on next page.
this perl script is making 2D array , part of code is below:-
$CHOSENAPP=();
%CHOOSEN_LOGICIAL_NAME_Hash=();
$CHOSENACTION=();
%Unique_APPS_Hash=();
%Unique_NAMES_Hash=();
#### OPEN INPUT CONFIG FILE AND READ INTO 2 DIMENSIONAL ARRAY #################
sub read_config
{
open(FILE_IN, "<$DIR/$FILE" ) || &File_Error;
$X=0; #initialize count of lines in file and array
while ( <FILE_IN> )
{
if ($_ =~ /^#/)
{ if ($REPORT>=1){print "\nIGNORED COMMENT: $_\n";} }
else
{
chomp($_); # remove xtra return character at end of line
@line=split(/,/, $_); #split line on comma
for $Y ( 0 .. $#line ) # number of items in array as split by comma
{
$ConfigFileArray[$X][$Y]=@line[$Y]; # assign item to 2D array
if ($REPORT>=1){print " :$ConfigFileArray[$X][$Y]: ";}
}
$X++; # increment count of lines
if ($REPORT>=1){print "\n";}
}
}
close(FILE_IN);
}
#### END OPEN INPUT CONFIG FILE AND READ INTO 2 DIMENSIONAL ARRAY #################
### report the contents of 2D array ConfigFileArray ###
sub report_array_contents
{
print "ARRAY CONTAINS:\n";
for $X ( 0 .. $#ConfigFileArray ) { for $Y ( 0 .. $#{$ConfigFileArray[$X]} ) { print " :$ConfigFileArray[$X][$Y]: "; } print "\n"; }
}
### END report the contents of 2D array ConfigFileArray ###
##### Make unique list of APPS and LOGICIAL NAMES, store them in HASHs ####
sub make_unique
{
for $X ( 0 .. $#ConfigFileArray)
{
$Unique_APPS_Hash{$ConfigFileArray[$X][0]}++;
$Unique_NAMES_Hash{$ConfigFileArray[$X][1]}++;if ($Unique_NAMES_Hash{$ConfigFileArray[$X][1]} > 1){print "LOGICIAL NAMES MUST BE UNIQUE< PLEASE CHECK THE CONFIG FILE! EXITING NOW\n";exit 1}
}
if ($DEBUG>=5)
{
print "APPS hash\n"; foreach $key (keys %Unique_APPS_Hash){print "$key $Unique_APPS_Hash{$key}\n";}
print "NAME hash\n"; foreach $key (keys %Unique_NAMES_Hash){print "$key $Unique_NAMES_Hash{$key}\n";}
print "\n\n";
}
}
##### END Make uniques list in HASH of APPS and LOGICIAL NAMES ####
#### Menu to Stop or Start ###
sub action_menu
{
@ACTION=('','STOP','START','CHECK');
while ( $MYACTION eq '' )
{
menu_header();
print "Screen 3 of 4\n";
print "Choose the ACTION: \n\n";
print "\tE) EXIT\n";
print "\tC) CLEAR chosen ACTION\n";
print "\tD) I'm DONE chosing, proceed to next menu\n\n";
print "\t1) STOP\n\t2) START\n\t3) CHECK\n";
sysread(STDIN,$MYACTION,2); chomp ($MYACTION);
print $clear_string;
if ($MYACTION =~ /^[eE]$/) {action_info ("EXIT");exit 1;}
elsif ($MYACTION =~ /^[1-3]$/) { action_info ($ACTION[$MYACTION]);$CHOSENACTION=$ACTION[$MYACTION];$MYACTION='';}
elsif ($MYACTION =~ '^[cC]$') { action_info ("CLEAR"); $CHOSENACTION=(); $MYACTION=''; }
elsif ($MYACTION =~ '^[dD]$') {action_info ("DONE");if (! $CHOSENACTION){print "\n\nERROR: you must choose an ACTION to proceed\n\n";$MYACTION='';}}
else {action_info ("Invalid choice");$MYACTION='';}
}
}
does it help to understand ?
i have no perl idea. let me know if smoething more is required .
while ( $MYNAME eq '' )
{
menu_header();
print "Screen 2 of 4\n";
print "Choose the LOGICIAL ENVIRONMENT to work on: \n\n";
@Unique_NAMES_Array=();
for $X ( 0 .. $#ConfigFileArray) # make array of logicial names based on APP choice
{
if ($ConfigFileArray[$X][0] eq $CHOSENAPP)
{ push (@Unique_NAMES_Array,$ConfigFileArray[$X][1]);}
}
print "\tE) EXIT\n";
print "\tA) ALL envs listed below\n";
print "\tC) CLEAR chosen envs\n";
print "\tD) I'm DONE chosing, proceed to next menu\n\n";
for $Z ( 0 .. $#Unique_NAMES_Array)
{
print "\t$Z) $Unique_NAMES_Array[$Z]\n";
}
sysread(STDIN,$MYNAME,3); chomp ($MYNAME);
print $clear_string;
if ($MYNAME =~ '^[eE]$') {action_info ("EXIT");exit 1;}
elsif (($MYNAME =~ /^[0-9]*$/) && ($MYNAME <= $#Unique_NAMES_Array)) { action_info ($Unique_NAMES_Array[$MYNAME]); $CHOOSEN_LOGICIAL_NAME_Hash{$Unique_NAMES_Array[$MYNAME]}++; $MYNAME=''; }
elsif ($MYNAME =~ '^[cC]$') { action_info ("CLEAR"); delete @CHOOSEN_LOGICIAL_NAME_Hash {keys %CHOOSEN_LOGICIAL_NAME_Hash}; $MYNAME=''; }
elsif ($MYNAME =~ '^[aA]$') { action_info ("ALL"); foreach $item(@Unique_NAMES_Array) { $CHOOSEN_LOGICIAL_NAME_Hash{$item}++; }; $MYNAME=''; }
elsif ($MYNAME =~ '^[dD]$') {action_info ("DONE");if (! %CHOOSEN_LOGICIAL_NAME_Hash){print "\n\nERROR: you must choose an ENV to proceed\n\n";$MYNAME='';}}
else {action_info ("Invalid choice");$MYNAME='';}
}
}
#### get the commands from the array ####
sub get_commands
{
# copy for each env from Config file array the commands to use for childs process into new 2 D array
foreach $env_item (keys %CHOOSEN_LOGICIAL_NAME_Hash)
{
if ($REPORT >= 1){print " $env_item\n ";}
for $X ( 0 .. $#ConfigFileArray )
{
if ( ($ConfigFileArray[$X][1] eq $env_item) && ($ConfigFileArray[$X][0] eq $CHOSENAPP) )
{
if ($CHOSENACTION eq 'STOP')
{ push (@commands_array,[$env_item,$ConfigFileArray[$X][2],$ConfigFileArray[$X][3],$ConfigFileArray[$X][4],$ConfigFileArray[$X][5]]); }
elsif ($CHOSENACTION eq 'START')
{ push (@commands_array,[$env_item,$ConfigFileArray[$X][2],$ConfigFileArray[$X][3],$ConfigFileArray[$X][6],$ConfigFileArray[$X][7]]); }
elsif ($CHOSENACTION eq 'CHECK')
{ push (@commands_array,[$env_item,$ConfigFileArray[$X][2],$ConfigFileArray[$X][3],$ConfigFileArray[$X][8],'']); }
}
}
}
if ($DEBUG >= 2){
for $X ( 0 .. $#commands_array )
{print "$commands_array[$X][0] $commands_array[$x][1] $commands_array[$X][2] $commands_array[$X][3] $commands_array[$X][4]\n";}
}
}
#### FORK the child processes and run the commands ###
sub fork_child_action
{
if ($REPORT >= 1){print "\n\nForking the commands now....\n";}
for $X ( 0 .. $#commands_array )
{
if ($cpid != 0)#this prevents endless loop
{
$cpid=fork(); # fork a new process identical to this one, and start eexcuting from here
if ($cpid < 0) # error
{
print "ERROR: Unable to Fork! exit 1\n"; exit 1;
}
elsif ($cpid > 0) # fork returns the new process id of the child, the parent knows the childs pid now
{
if ($REPORT >= 1){print " $env_item childs process id is $cpid\n"; }
#PUT my process ID into the array
$commands_array[$X][5]=$cpid;
}
elsif ($cpid == 0) # in the child process, the pid is 0, so i'm a child, continue to process
{
#GET the valuse from array
$env=$commands_array[$X][0];
$host=$commands_array[$X][1];
$wrk_account=$commands_array[$X][2];
$command1=$commands_array[$X][3];
$command2=$commands_array[$X][4];
if ($DEBUG >= 2){print "$env CHILD FORKING HERE\n"; print "FORK COMMANDS: $env $host $wrk_account $command1 $command2\n";}
open(FILEOUT, ">>".$LOG."/Emergency_".$env."_".$host."_".$wrk_account.".log") || die("Could not open log file for output");
$TIMESTAMP= getTimeStamp();
print FILEOUT "BEGIN $CHOSENACTION $TIMESTAMP $env $host $wrk_account $command1, $command2\n";
if ( $command1 )
{
if ($REPORT >= 1){print "Issuing command1 $command1 TO $env $host $wrk_account \n";}
open (STDOUT, ">>".$LOG."/Emergency_".$env."_".$host."_".$wrk_account.".stdout.log") || die("Could not open log file for output");
open (STDERR, ">>".$LOG."/Emergency_".$env."_".$host."_".$wrk_account.".stdout.log") || die("Could not open log file for output");
system ("ssh \-o \"StrictHostKeyChecking=no\" \-o 'BatchMode yes' \-q $wrk_account\@$host \"$command1\"") ;
$exit_status=$?;
close (STDOUT);
close (STDERR);