#!/usr/bin/perl # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html BEGIN { $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr'; } use lib "$::XCATROOT/lib/perl"; use Cwd; use File::Basename; use xCAT::MsgUtils; use xCAT::Client; use Getopt::Std; my $bname = basename($0); ######################################### # Main # # xcatDBcmds # # Build hash and submit request # # Handles: mkdef, chdef, lsdef, rmdef, mknimimage, rmnimimage, # nimnodeset, mkdsklsnode, rmdsklsnode, and xcat2nim commands # # Note: The subroutines that implement these commands # are, for the most part, in: # /opt/xcat/lib/perl/xCAT_plugin/DBobjectdefs.pm # /opt/xcat/lib/perl/xCAT_plugin/xcat2nim.pm # /opt/xcat/lib/perl/xCAT_plugin/aixinstall.pm # /opt/xcat/lib/perl/xCAT/DBobjUtils.pm # ######################################### my $cmdref; # set the command name to pass to the plugin if ($bname =~ /xcatDBcmds/) { $cmdref->{command}->[0] = shift @ARGV; } elsif ($bname =~ /^(.*$)/) { $cmdref->{command}->[0] = $1; } else { printf("Bad usage\n"); exit 1; } $cmdref->{cwd}->[0] = cwd(); # get info from files piped in as stdin my $data; if (($^O =~ /^linux/i) && ($ENV{'SHELL'} =~ /\/ksh$/)) { my $rin=""; vec($rin,fileno(STDIN),1)=1; my $nfound=select($rout=$rin,"","",1); if ($nfound) { while ( ) { $data.=$_; } $cmdref->{stdin}->[0]=$data; } } else { if (-p STDIN) { while ( ) { $data.=$_; } $cmdref->{stdin}->[0]=$data; } } # The noderange can be specified through a noderange file # the noderange file can be a relative path, # convert the relative path to a full path. my @tmpargv = (); my @tmpv = @ARGV; foreach my $a (@tmpv) { if (!($a =~ /=/) && !($a =~ /^-/)) { my @tempnr = (); foreach my $nr (split(/,/, $a)) { if ($nr =~ /^\^(.*)$/) { my $nrf = $1; if ($nrf !~ /^\//) { #relative path $nrf = Cwd::abs_path($nrf); } $nrf = "\^" . $nrf; push @tempnr, $nrf; } else { push @tempnr, $nr; } } $a = join(',',@tempnr); } push @tmpargv, $a; } @ARGV = @tmpargv; # add all the cmd line args to the hash - to pass to the plugin subroutine foreach my $a (@ARGV) { push(@{$cmdref->{arg}}, $a); } # For some commands we need to set the noderange value # - don't want to depend on the order of args so need to pick # the operand that doesn't have an "=" sign ( ie. attr=val format) my @checkcmds = ("nimnodeset", "mkdsklsnode", "rmdsklsnode", "xcat2nim", "nimnodecust"); if (grep(/^$bname$/, @checkcmds) ) { # strip off all options # use getopt instead of getopts to let long options pass through getopt('bdismotp'); # check the operands for a noderange while (my $a = shift(@ARGV)) { if (!($a =~ /=/) && !($a =~ /^-/)) { $cmdref->{noderange}->[0]=$a; last; } } } xCAT::Client::submit_request($cmdref,\&xCAT::Client::handle_response); exit $xCAT::Client::EXITCODE;