mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 05:12:30 +00:00 
			
		
		
		
	git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@12321 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			408 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			408 lines
		
	
	
		
			10 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,$verbose, $filelist);
 | 
						|
 | 
						|
# parse the options
 | 
						|
if (
 | 
						|
    !GetOptions(
 | 
						|
                'd|dir=s'   => \$directory,
 | 
						|
                'f|files=s' => \$filelist,
 | 
						|
                'h|help'    => \$help,
 | 
						|
                'v|version' => \$version,
 | 
						|
                'V|verbose' => \$verbose,
 | 
						|
    )
 | 
						|
  )
 | 
						|
{
 | 
						|
    &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 
 | 
						|
        if ($verbose) {
 | 
						|
           xCAT::MsgUtils->message("SE", "The runsqlcmd does not support the SQLite database.");
 | 
						|
        }
 | 
						|
        #&runsqlitecmd($file,$xcatcfg);
 | 
						|
        exit 1;
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
} else {
 | 
						|
     if ($verbose) {
 | 
						|
        xCAT::MsgUtils->message("SI", "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           <-V|--verbose>\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;
 | 
						|
    }
 | 
						|
    # set correct path to the mysql cmd
 | 
						|
    my $mysql;
 | 
						|
    if (xCAT::Utils->isAIX()) {
 | 
						|
      $mysql="/usr/local/mysql/bin/mysql";
 | 
						|
    } else {
 | 
						|
      $mysql="/usr/bin/mysql";
 | 
						|
    }
 | 
						|
    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;
 | 
						|
        # secure password
 | 
						|
        $cmd = "$mysql --user=$admin --password=xxxxxx --host=$hostname $dbname \< $file   ";
 | 
						|
        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;
 | 
						|
    }
 | 
						|
    # set correct path to the psql cmd
 | 
						|
    my $psql;
 | 
						|
    if (xCAT::Utils->isAIX()) {
 | 
						|
      $psql="/var/lib/pgsql/bin/psql";
 | 
						|
    } else {
 | 
						|
      $psql="/usr/bin/psql";
 | 
						|
    }
 | 
						|
    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;
 | 
						|
}
 |