c02c6bceea
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@8042 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
388 lines
9.4 KiB
Perl
Executable File
388 lines
9.4 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
|
#
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
=head1 runsqlcmd
|
|
|
|
|
|
|
|
This script is called to run the sql statements found in the files
|
|
in either the default /opt/xcat/lib/perl/xCAT_schema or the
|
|
directory input with the -d flag.
|
|
For more information see man runsqlcmd and the
|
|
developers guide:
|
|
http://xcat.svn.sourceforge.net/viewvc/xcat/xcat-core/trunk/xCAT-client/share/doc/xCAT2DevGuide.pdf
|
|
|
|
=cut
|
|
|
|
BEGIN
|
|
{
|
|
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
|
|
$::XCATDIR = $ENV{'XCATDIR'} ? $ENV{'XCATDIR'} : '/etc/xcat';
|
|
}
|
|
|
|
use lib "$::XCATROOT/lib/perl";
|
|
use xCAT::Utils;
|
|
use Getopt::Long;
|
|
use xCAT::MsgUtils;
|
|
use xCAT::Table;
|
|
use File::Path;
|
|
use strict;
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# Main
|
|
|
|
$::progname = "runsqlcmd";
|
|
Getopt::Long::Configure("bundling");
|
|
$Getopt::Long::ignorecase = 0;
|
|
my ($directory, $help, $version, $filelist);
|
|
|
|
# parse the options
|
|
if (
|
|
!GetOptions(
|
|
'd|dir=s' => \$directory,
|
|
'f|files=s' => \$filelist,
|
|
'h|help' => \$help,
|
|
'v|version' => \$version,
|
|
)
|
|
)
|
|
{
|
|
&usage;
|
|
exit(1);
|
|
}
|
|
# see if they entered a command
|
|
my $args = join ' ', @ARGV;
|
|
my $command = $args;
|
|
|
|
# display the usage if -h or --help is specified
|
|
if ($help)
|
|
{
|
|
&usage;
|
|
exit(0);
|
|
}
|
|
# display the version statement if -v or --version is specified
|
|
if ($version)
|
|
{
|
|
my $version = xCAT::Utils->Version();
|
|
xCAT::MsgUtils->message("I", $version);
|
|
exit 0;
|
|
}
|
|
if (($filelist) && ($directory))
|
|
{
|
|
xCAT::MsgUtils->message("E","Cannot enter both the -f and -d flags.");
|
|
exit 1;
|
|
}
|
|
if (($command) && (($directory) || ($filelist)))
|
|
{
|
|
xCAT::MsgUtils->message("E","Cannot enter both a command and the -d or -f flag.");
|
|
exit 1;
|
|
}
|
|
my $tempfile;
|
|
if ($command) { # command on command line
|
|
$tempfile="/tmp/runcmdfile.$$";
|
|
my $cmd = "echo \"$command\" > $tempfile";
|
|
xCAT::Utils->runcmd($cmd,0);
|
|
if ($::RUNCMD_RC != 0)
|
|
{ # error
|
|
xCAT::MsgUtils->message("E", "$cmd failed");
|
|
exit 1;
|
|
|
|
}
|
|
# put on filelist
|
|
$filelist=$tempfile;
|
|
} else { # commands in a file
|
|
|
|
if (!($filelist)) { # if no file list and no directory set default
|
|
if (!($directory)) {
|
|
$directory = "$::XCATROOT/lib/perl/xCAT_schema";
|
|
}
|
|
}
|
|
}
|
|
|
|
my @filearray;
|
|
if ($filelist)
|
|
{ # use filelist
|
|
$directory = ""; #Get rid of the default
|
|
@filearray = &process_file_list($filelist);
|
|
}
|
|
else
|
|
{
|
|
|
|
if (!(-e $directory))
|
|
{
|
|
xCAT::MsgUtils->message("E",
|
|
"The $directory directory does not exist.");
|
|
exit 1;
|
|
}
|
|
}
|
|
my @sqlfilelist = xCAT::Table->get_filelist($directory, \@filearray, "sql");
|
|
|
|
if (@sqlfilelist) { # if anything to do
|
|
#determine database
|
|
my $xcatcfg = xCAT::Table->get_xcatcfg();
|
|
foreach my $file (@sqlfilelist)
|
|
{
|
|
if ($xcatcfg =~ /^DB2:/)
|
|
{
|
|
&rundb2cmd($file);
|
|
}
|
|
if ($xcatcfg =~ /^mysql:/)
|
|
{
|
|
&runmysqlcmd($file, $xcatcfg);
|
|
}
|
|
if ($xcatcfg =~ /^Pg:/)
|
|
{
|
|
&runpgsqlcmd($file, $xcatcfg);
|
|
}
|
|
if ($xcatcfg =~ /^SQLite:/)
|
|
{
|
|
# not supported but will leave routine in case we change our mind
|
|
xCAT::MsgUtils->message("SE", "The runsqlcmd does not support the SQLite database.");
|
|
#&runsqlitecmd($file,$xcatcfg);
|
|
exit 1;
|
|
}
|
|
|
|
}
|
|
} else {
|
|
xCAT::MsgUtils->message("SE", "The runsqlcmd has no files to process in $directory .");
|
|
}
|
|
if ($tempfile) {
|
|
my $cmd = "rm $tempfile";
|
|
xCAT::Utils->runcmd($cmd,0);
|
|
if ($::RUNCMD_RC != 0)
|
|
{ # error
|
|
xCAT::MsgUtils->message("E", "$cmd failed");
|
|
exit 1;
|
|
|
|
}
|
|
}
|
|
exit 0;
|
|
|
|
#####################################
|
|
# subroutines
|
|
#####################################
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
=head3 usage
|
|
|
|
Displays message for -h option
|
|
|
|
=cut
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
sub usage
|
|
{
|
|
xCAT::MsgUtils->message(
|
|
'I',
|
|
"Usage:\nRuns the sql commands in files located in /opt/xcat/lib/perl/xCAT_schema by default, or the directory input with -d, or the list of files input with the -f flag, or the command input on the command line. Supports DB2,PostgreSQL,MySQL."
|
|
);
|
|
my $msg =
|
|
"runsqlcmd <-h|--help>\n <-v|--version>\n <-d|--dir>\n <-f|--files> \n <sql command>";
|
|
|
|
xCAT::MsgUtils->message('I', "$msg");
|
|
}
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
=head3 rundb2cmd
|
|
|
|
|
|
Run a commmand as the xcatdb instance id
|
|
Input: command
|
|
|
|
=cut
|
|
|
|
#-----------------------------------------------------------------------------
|
|
sub rundb2cmd
|
|
{
|
|
use File::Basename;
|
|
my $file = shift;
|
|
my $rc = 0;
|
|
if (!(-e $file)) { # file does not exist
|
|
xCAT::MsgUtils->message("SE",
|
|
"The file:$file does not exist. ");
|
|
return;
|
|
}
|
|
my $filename = basename($file); # strip filename
|
|
my $tmpfile = "/tmp/" . $filename . ".tmp";
|
|
|
|
# must add connect to database to file
|
|
my $cmd = "echo \"connect to xcatdb;\" > $tmpfile";
|
|
my @output = xCAT::Utils->runcmd($cmd, 0);
|
|
if ($::RUNCMD_RC != 0)
|
|
{
|
|
xCAT::MsgUtils->message("SE", "$cmd failed");
|
|
return;
|
|
}
|
|
|
|
# now add contents of sql file.
|
|
$cmd = "cat $file >> $tmpfile";
|
|
@output = xCAT::Utils->runcmd($cmd, 0);
|
|
if ($::RUNCMD_RC != 0)
|
|
{
|
|
xCAT::MsgUtils->message("SE", "$cmd failed");
|
|
return;
|
|
}
|
|
|
|
$cmd = "\'";
|
|
$cmd .= " db2 -tvf ";
|
|
$cmd .= "$tmpfile";
|
|
$cmd .= ' 2>&1';
|
|
$cmd .= "\'";
|
|
xCAT::MsgUtils->message("SI", "Running su - xcatdb -c $cmd ");
|
|
system("su - xcatdb -c $cmd");
|
|
|
|
if ($? > 0) # error
|
|
{
|
|
$rc = $? >> 8;
|
|
xCAT::MsgUtils->message("SE",
|
|
"The command $cmd had errors. Return=$rc");
|
|
}
|
|
$cmd = "rm $tmpfile";
|
|
@output = xCAT::Utils->runcmd($cmd, 0);
|
|
if ($::RUNCMD_RC != 0)
|
|
{
|
|
xCAT::MsgUtils->message("SE", "$cmd failed");
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
=head3 runmysqlcmd
|
|
|
|
|
|
Run a sql commmand
|
|
Input: command
|
|
|
|
=cut
|
|
|
|
#-----------------------------------------------------------------------------
|
|
sub runmysqlcmd
|
|
{
|
|
my $file = shift;
|
|
my $xcatcfg = shift;
|
|
my ($front, $back) = split('\;', $xcatcfg);
|
|
my ($prefix, $dbname) = split('=', $front);
|
|
my ($host, $admin, $passwd) = split('\|', $back);
|
|
my ($hostind, $hostname) = split('=', $host);
|
|
|
|
my $rc = 0;
|
|
if (!(-e $file)) { # file does not exist
|
|
xCAT::MsgUtils->message("SE",
|
|
"The file:$file does not exist. ");
|
|
return;
|
|
}
|
|
|
|
my $cmd =
|
|
"mysql --user=$admin --password=$passwd --host=$hostname $dbname \< $file ";
|
|
#xCAT::MsgUtils->message("SI", "Running mysql --user=$admin --host=$hostname $dbname $file ");
|
|
system("$cmd");
|
|
|
|
if ($? > 0) # error
|
|
{
|
|
$rc = $? >> 8;
|
|
xCAT::MsgUtils->message("SE",
|
|
"The command $cmd had errors. Return=$rc");
|
|
}
|
|
return;
|
|
}
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
=head3 runpgsqlcmd
|
|
|
|
|
|
Run a sql commmand
|
|
Input: command
|
|
|
|
=cut
|
|
|
|
#-----------------------------------------------------------------------------
|
|
sub runpgsqlcmd
|
|
{
|
|
my $file = shift;
|
|
my $xcatcfg = shift;
|
|
my ($front, $back) = split('\;', $xcatcfg);
|
|
my ($prefix, $dbname) = split('=', $front);
|
|
my ($host, $admin, $passwd) = split('\|', $back);
|
|
my ($hostind, $hostname) = split('=', $host);
|
|
|
|
my $rc = 0;
|
|
if (!(-e $file)) { # file does not exist
|
|
xCAT::MsgUtils->message("SE",
|
|
"The file:$file does not exist. ");
|
|
return;
|
|
}
|
|
my $cmd =
|
|
"PGPASSWORD=$passwd psql -d $dbname -h $hostname -U $admin -f $file ";
|
|
#xCAT::MsgUtils->message("SI", "Running psql -d $dbname -h $hostname -U $admin -f $file ");
|
|
system("$cmd");
|
|
|
|
if ($? > 0) # error
|
|
{
|
|
$rc = $? >> 8;
|
|
xCAT::MsgUtils->message("SE",
|
|
"The command $cmd had errors. Return=$rc");
|
|
}
|
|
return;
|
|
}
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
=head3 runsqlitecmd
|
|
|
|
|
|
Run a sql commmand
|
|
Input: command
|
|
|
|
=cut
|
|
|
|
#-----------------------------------------------------------------------------
|
|
sub runsqlitecmd
|
|
{
|
|
my $file = shift;
|
|
my $xcatcfg = shift;
|
|
|
|
return;
|
|
}
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
=head3 process_file_list
|
|
|
|
|
|
Expands all wildcards in file list and builds an array
|
|
Input: filelist
|
|
|
|
=cut
|
|
|
|
#-----------------------------------------------------------------------------
|
|
sub process_file_list
|
|
{
|
|
|
|
my $filelist = shift;
|
|
my @filearray;
|
|
push my @tmparray, split /,/, $filelist;
|
|
|
|
# need to expand wildcards
|
|
foreach my $file (@tmparray)
|
|
{
|
|
if ($file =~ tr/*/*/)
|
|
{ # if wildcard add all the file
|
|
my @files = glob("$file.sql");
|
|
push(@filearray, @files);
|
|
}
|
|
else
|
|
{ # else just the file
|
|
push(@filearray, $file);
|
|
}
|
|
}
|
|
return @filearray;
|
|
}
|