# IBM(c) 2010 EPL license http://www.eclipse.org/legal/epl-v10.html package xCAT_plugin::cloud; BEGIN { $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; } use lib "$::XCATROOT/lib/perl"; use strict; use xCAT::Table; use Getopt::Long; Getopt::Long::Configure("bundling"); Getopt::Long::Configure("pass_through"); #use xCAT::Utils; #use xCAT::TableUtils; use xCAT::Template; sub handled_commands { return {makeclouddata => "cloud",}; } ############################################################ # check_options will process the options for makeclouddata and # give a usage error for any invalid options ############################################################ sub check_options { my $req = shift; my $callback = shift; my $rc = 0; Getopt::Long::Configure("bundling"); $Getopt::Long::ignorecase = 0; Getopt::Long::Configure("no_pass_through"); # Exit if the packet has been preprocessed if ($req->{_xcatpreprocessed}->[0] == 1) { return [$req]; } # Save the arguements in ARGV for GetOptions if ($req && $req->{arg}) { @ARGV = @{$req->{arg}}; } else { @ARGV = (); } # Parse the options for makedhcp if (!GetOptions( 'h|help' => \$::opt_h, )) { # If the arguements do not pass GetOptions then issue error message and return return -1; } # display the usage if -h if ($::opt_h) { return 1; } my $cloudlist =shift( @ARGV ); if( defined($cloudlist) ) { my @clouds = split(",", $cloudlist); $req->{clouds} = \@clouds; } return 0; } sub cloudvars { my $inf = shift; my $outf = shift; my $cloud = shift; my $callback = shift; my $outh; my $inh; open($inh,"<",$inf); unless ($inh) { my $rsp; $rsp->{errorcode}->[0]=1; $rsp->{error}->[0]="Unable to open $inf, aborting\n"; $callback->($rsp); return; } my $inc; #First load input into memory.. while (<$inh>) { $inc.=$_; } close($inh); $inc =~ s/\$CLOUD/$cloud/eg; $inc =~ s/#TABLE:([^:]+):([^:]+):([^#]+)#/xCAT::Template::tabdb($1,$2,$3)/eg; open($outh,">",$outf); unless($outh) { my $rsp; $rsp->{errorcode}->[0]=1; $rsp->{error}->[0]="Unable to open $inf, aborting\n"; $callback->($rsp); return; } print $outh $inc; close($outh); return 0; } sub process_request { my $req = shift; my $callback = shift; my $rc = 0; # define usage statement my $usage="Usage: \n\tmkcloudata\n\tmakeclouddata \n\tmakeclouddata [-h|--help]"; $rc = check_options($req,$callback); if ($rc == -1) { my $rsp = {}; $rsp->{data}->[0] = $usage; xCAT::MsgUtils->message("E", $rsp, $callback, 1); return; } elsif ($rc == 1) { my $rsp = {}; $rsp->{data}->[0] = $usage; xCAT::MsgUtils->message("I", $rsp, $callback, 0); return; } my $tab = "clouds"; my $ptab = xCAT::Table->new("$tab"); unless ($ptab) { my $rsp; $rsp->{errorcode}->[0]=1; $rsp->{error}->[0]="Unable to open $tab table"; $callback->($rsp); return; } my $t = $req->{clouds}; my %h; if( defined(@$t) ) { %h = map { $_ => 1} @$t; } my @cloudentries = $ptab->getAllAttribs('name', 'template', 'repository'); foreach my $cloudentry (@cloudentries) { my $cloud = $cloudentry->{name}; if( %h ) { # if makeclouddata , and if( $h{$cloud} != 1) { next; } } my $tmplfile = $cloudentry->{template}; my $repos = $cloudentry->{repository}; unless ( -r "$tmplfile") { my $rsp; $rsp->{errorcode}->[0]=1; $rsp->{error}->[0]="The environment template for the cloud $cloud doesn't exist. Please check the clouds table"; $callback->($rsp); next; } unless ( -r "$repos") { my $rsp; $rsp->{errorcode}->[0]=1; $rsp->{error}->[0]="The repository $repos for the cloud $cloud doesn't exist. Pleae check the clouds table."; $callback->($rsp); next; } my $tmperr = cloudvars( $tmplfile, "$repos/environments/$cloud.rb", $cloud, $callback ); } return; } 1;