jvilla1983
Programmer
Hi,
Here's what I'm trying to do..
I have a script which I have set up to first check all Perl scripts in a folder, then a main script runs each script in that directory one at a time. When each subscript runs, it returns all gathered data back to the main script. From here, the data goes into an array and then is formatted and is either piped to a file or sent via smtp to a specified user.
The problem I'm having is getting the output back from each of the executed scripts. I'm trying something like..
my $testArray = `/usr/bin/perl $CurrentScript`;
Where $CurrentScript is the path and name to the file I want to execute. The name is peiced together with another portion of the main script and contains the name-XXX where XXX is the subscript number being run.
What am I doing wrong on this? Is there a better way that I should be doing this? I would like this to be modular in that if I put another file in the subscript directory it's seen and run if it's in the proper format.
Thanks!
-Security_Script.pl- *My Main Script*
#!/usr/bin/perl -w
my $HomeDIR = "/home/user/Scripts/";
my @OutputArray = ();
#First, compile the list of modules in the ~/modules file. This determines the size of the array that we are working with
#for the flags. Flags are tripped one way or another. Each module file sends back either a 0 or 1. The 0 meaning pass, 1 #means fail.
#Get Month/Day/Time place into variables..
my ($sec,$min,$hour,$mday,$mon,$year,$wday
,$yday,$isdst) = localtime time;
#offset year to be the current year
$year = $year + 1900;
$mon = $mon + 1;
if ($mon < 10) {
$mon = "0".$mon;
}
if ($mday < 10) {
$mday = "0". $mday;
}
#Create a file delimited by date LSS_DAY.MONTH.YEAR-hour.minute (Hours and minutes are 24 hour)
#This file will be used for all STIG testing output.. It's meant to be opened and closed in every module.
$fname = "LSS_".$mday.$mon.$year."-".$hour.$min.$sec;
open(FH,'>'.$fname) or die "Can't create " . $fname ." output because of error";
close(FH);
#lets user know of recorded output.. But, this can be overridden by adding an automated option if this script was to be
#automated.. (NOTE ADD ARGUMENT FOR THIS)
print ("\n\nOutput of this script will be recorded in ".$fname);
local($|) = (1);
print("\n\nPress <Enter> or <Return> to continue");
my $resp = <STDIN>;
#get the number of modules in a directory.. This determines the number of modules that are to be run during the
#script's duration. It's designed so that anyone can create a module and not need to hard code it in anywhere else
#AS LONG AS it's added into the module's directory and follows the script rules I've set forth. Please follow them...
#This will need to be changed to the /etc/SECScript/Modules/* Directory..
@files = <$HomeDIR . /Modules/*>;
$numfiles=0;
$progress=0;
foreach $files (@files){
$numfiles++;
}
print $numfiles;
foreach $files (@files) {
my @testArray = ();
print("\n\n"."Script number ".$progress);
my $CurrentScript = &FileName;
print $CurrentScript;
my $testArray = `/usr/bin/perl $CurrentScript|`;
print $testArray;
print("\n\n"."Module".$progress." completed..");
$progress = $progress + 1;
}
#This portion defines the subroutines used in this..
sub FileName{
my $CScript = "";
$CScript = $HomeDIR."Modules/Module-";
if($progress < 10){
$CScript = $CScript."00".$progress;
}
elsif(($progress < 100) && ($progress >= 10)){
$CScript = $CScript."0".$Progress;
}
$CScript = $CScript.".pl";
return $CScript;
}
*Example Module Script*..
#!/usr/bin/perl
#This script is the initialization script.. This basically tells the script
#what it's dealing with (Information gathering, etc). Inside here, start times for the script
#are documented, Kernel Version, RHEL Version and whatever I or anyone else can think up..
sub SystemDiags{
my $KernelVersion;
my $RHELSystemVersion;
my $DateTimeCheck;
my $SystemArch;
open(DATETIME, "date|");
$DateTimeCheck = <DATETIME>;
close(DATETIME);
open(RHELVER, "cat /etc/redhat-release|");
$RHELSystemVersion = <RHELVER>;
close(RHELVER);
open(KERNEL, "uname -r|");
$KernelVersion = <KERNEL>;
close(KERNEL);
open(SYSARCH, "uname -i|");
$SystemArch = <SYSARCH>;
close(SYSARCH);
#This was originally passing back an array, I thought I might have better
#luck using a delimiter and then parse the data for it afterwards.. It
#really didn't work.
return($KernelVersion."|".$RHELSystemVersion."|".$DateTimeCheck."|".$SystemArch."|"."/0");
}
Here's what I'm trying to do..
I have a script which I have set up to first check all Perl scripts in a folder, then a main script runs each script in that directory one at a time. When each subscript runs, it returns all gathered data back to the main script. From here, the data goes into an array and then is formatted and is either piped to a file or sent via smtp to a specified user.
The problem I'm having is getting the output back from each of the executed scripts. I'm trying something like..
my $testArray = `/usr/bin/perl $CurrentScript`;
Where $CurrentScript is the path and name to the file I want to execute. The name is peiced together with another portion of the main script and contains the name-XXX where XXX is the subscript number being run.
What am I doing wrong on this? Is there a better way that I should be doing this? I would like this to be modular in that if I put another file in the subscript directory it's seen and run if it's in the proper format.
Thanks!
-Security_Script.pl- *My Main Script*
#!/usr/bin/perl -w
my $HomeDIR = "/home/user/Scripts/";
my @OutputArray = ();
#First, compile the list of modules in the ~/modules file. This determines the size of the array that we are working with
#for the flags. Flags are tripped one way or another. Each module file sends back either a 0 or 1. The 0 meaning pass, 1 #means fail.
#Get Month/Day/Time place into variables..
my ($sec,$min,$hour,$mday,$mon,$year,$wday
,$yday,$isdst) = localtime time;
#offset year to be the current year
$year = $year + 1900;
$mon = $mon + 1;
if ($mon < 10) {
$mon = "0".$mon;
}
if ($mday < 10) {
$mday = "0". $mday;
}
#Create a file delimited by date LSS_DAY.MONTH.YEAR-hour.minute (Hours and minutes are 24 hour)
#This file will be used for all STIG testing output.. It's meant to be opened and closed in every module.
$fname = "LSS_".$mday.$mon.$year."-".$hour.$min.$sec;
open(FH,'>'.$fname) or die "Can't create " . $fname ." output because of error";
close(FH);
#lets user know of recorded output.. But, this can be overridden by adding an automated option if this script was to be
#automated.. (NOTE ADD ARGUMENT FOR THIS)
print ("\n\nOutput of this script will be recorded in ".$fname);
local($|) = (1);
print("\n\nPress <Enter> or <Return> to continue");
my $resp = <STDIN>;
#get the number of modules in a directory.. This determines the number of modules that are to be run during the
#script's duration. It's designed so that anyone can create a module and not need to hard code it in anywhere else
#AS LONG AS it's added into the module's directory and follows the script rules I've set forth. Please follow them...
#This will need to be changed to the /etc/SECScript/Modules/* Directory..
@files = <$HomeDIR . /Modules/*>;
$numfiles=0;
$progress=0;
foreach $files (@files){
$numfiles++;
}
print $numfiles;
foreach $files (@files) {
my @testArray = ();
print("\n\n"."Script number ".$progress);
my $CurrentScript = &FileName;
print $CurrentScript;
my $testArray = `/usr/bin/perl $CurrentScript|`;
print $testArray;
print("\n\n"."Module".$progress." completed..");
$progress = $progress + 1;
}
#This portion defines the subroutines used in this..
sub FileName{
my $CScript = "";
$CScript = $HomeDIR."Modules/Module-";
if($progress < 10){
$CScript = $CScript."00".$progress;
}
elsif(($progress < 100) && ($progress >= 10)){
$CScript = $CScript."0".$Progress;
}
$CScript = $CScript.".pl";
return $CScript;
}
*Example Module Script*..
#!/usr/bin/perl
#This script is the initialization script.. This basically tells the script
#what it's dealing with (Information gathering, etc). Inside here, start times for the script
#are documented, Kernel Version, RHEL Version and whatever I or anyone else can think up..
sub SystemDiags{
my $KernelVersion;
my $RHELSystemVersion;
my $DateTimeCheck;
my $SystemArch;
open(DATETIME, "date|");
$DateTimeCheck = <DATETIME>;
close(DATETIME);
open(RHELVER, "cat /etc/redhat-release|");
$RHELSystemVersion = <RHELVER>;
close(RHELVER);
open(KERNEL, "uname -r|");
$KernelVersion = <KERNEL>;
close(KERNEL);
open(SYSARCH, "uname -i|");
$SystemArch = <SYSARCH>;
close(SYSARCH);
#This was originally passing back an array, I thought I might have better
#luck using a delimiter and then parse the data for it afterwards.. It
#really didn't work.
return($KernelVersion."|".$RHELSystemVersion."|".$DateTimeCheck."|".$SystemArch."|"."/0");
}