2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-22 03:32:04 +00:00

Merge our code with global xCAT team except for xcatws.cgi

Change-Id: I945c430685fa2febd914be09f6a6f976783abeec
This commit is contained in:
Chuck Brazie 2017-02-02 14:31:27 -05:00
parent 651cdaaaa1
commit 5a83bf5e63
37 changed files with 18240 additions and 2540 deletions

View File

@ -31,7 +31,7 @@ This program module file, is a set of utilities used by xCAT daemon.
Here is where we check if $peername is allowed to do $request in policy tbl.
$peername, if set signifies client has a cert that the xCAT CA accepted.
Logs to syslog and auditlog table all user commands, see site.auditskipcmds
attribute and auditnosyslog attribute.
attribute and auditnosyslog attribute.
Arguments:
@ -94,7 +94,7 @@ sub validate {
$req_noderange_info{leftnodes} = \@tmpn;
}
}
RULE: foreach $rule (@sortedpolicies) {
if ($rule->{name} and $rule->{name} ne '*') {
@ -163,7 +163,7 @@ sub validate {
push @non_hit_nodes, $_;
}
}
if($hitnum == 0){
next RULE;
}elsif($hitnum && $hitnum != $req_noderange_info{leftnodenum}){
@ -227,7 +227,32 @@ sub validate {
$arglist .= " " . $argument;
}
if ($arglist) { $logst .= $arglist; }
my $saveArglist = $arglist;
# If this is mkvm check for --password or -w
if ($request->{command}->[0] eq "mkvm") {
my $first;
my $restcommand;
my $passw = index ($saveArglist, '--password');
if ($passw > -1) {
$passw = $passw + 11;
my $first = substr($saveArglist,0,$passw). "******** ";
my $restcommand = substr($saveArglist,$passw);
$restcommand =~ s/^\S+\s*//;
$saveArglist = "$first$restcommand";
}
# now check for -w with password
$passw = index ($saveArglist, '-w');
if ($passw > -1) {
$passw = $passw + 3;
$first = substr($saveArglist,0,$passw). "******** ";
$restcommand = substr($saveArglist,$passw);
$restcommand =~ s/^\S+\s*//;
$saveArglist = "$first$restcommand";
}
}
if ($arglist) { $logst .= $saveArglist; }
if ($peername) { $logst .= " for " . $request->{username}->[0] }
if ($peerhost) { $logst .= " from " . $peerhost }
@ -319,7 +344,7 @@ sub validate {
if($req_noderange_info{leftnodenum}){
my $leftnodes = join(",", @{$req_noderange_info{leftnodes}});
xCAT::MsgUtils->message("S", "Request matched no policy rule: peername=$peername, peerhost=$peerhost $request->{command}->[0] to $leftnodes");
xCAT::MsgUtils->message("S", "Request matched no policy rule: peername=$peername, peerhost=$peerhost $request->{command}->[0] to $leftnodes");
}else{
xCAT::MsgUtils->message("S", "Request matched no policy rule: peername=$peername, peerhost=$peerhost " . $request->{command}->[0]);
}

View File

@ -46,10 +46,16 @@ sub process_request {
@ARGV = @{ $request->{arg} } if (defined $request->{arg});
my $argc = scalar @ARGV;
my $usage = "Usage:\n imgcapture <node> -t|--type {diskless|sysclone} -o|--osimage <osimage> [-V | --verbose] \n imgcapture [-h|--help] \n imgcapture [-v|--version]";
my $usage = "Usage: imgcapture <node> -t|--type diskless [-p | --profile <profile>] " .
"[-o|--osimage <osimage>] [-i <nodebootif>] [-n <nodenetdrivers>] " .
"[-d | --device <devicesToCapture>] [-c | --compress <compressionLevel>] [-V | --verbose] \n\n" .
"imgcapture <node> -t|--type sysclone -o|--osimage <osimage> [-V | --verbose] \n" .
"imgcapture [-h|--help] \n" .
"imgcapture [-v|--version]";
my $os;
my $arch;
my $compression; # Supported by the s390x architecture
my $device;
my $profile;
my $bootif;
@ -65,6 +71,7 @@ sub process_request {
'n=s' => \$netdriver,
'osimage|o=s' => \$osimg,
"device|d=s" => \$device,
"compress|c=s" => \$compression,
"help|h" => \$help,
"version|v" => \$version,
"verbose|V" => \$verbose,
@ -123,7 +130,7 @@ sub process_request {
# Handle image capture separately for s390x
if ($arch eq 's390x') {
eval { require xCAT_plugin::zvm; }; # Load z/VM plugin dynamically
xCAT_plugin::zvm->imageCapture($callback, $node, $os, $arch, $profile, $osimg, $device);
xCAT_plugin::zvm->imageCapture($callback, $node, $os, $arch, $type, $profile, $osimg, $device, $compression);
return;
}

View File

@ -99,13 +99,14 @@ sub ximport {
my $nodes;
my $new_profile;
my $remoteHost;
my $nozip = 0;
my $xusage = sub {
my $ec = shift;
push @{ $rsp{data} }, "imgimport: Takes in an xCAT image bundle and defines it to xCAT so you can use it";
push @{ $rsp{data} }, "Usage: ";
push @{ $rsp{data} }, "\timgimport [-h|--help]";
push @{ $rsp{data} }, "\timgimport <bundle_file_name> [-p|--postscripts <nodelist>] [-f|--profile <new_profile>] [-R|--remotehost <userid\@host>] [-v]";
push@{ $rsp{data} }, "\timgimport <bundle_file_name> [-p|--postscripts <nodelist>] [-f|--profile <new_profile>] [-R|--remotehost <userid\@host>] [-n|--nozip] [-v]";
if ($ec) { $rsp{errorcode} = $ec; }
$callback->(\%rsp);
};
@ -122,6 +123,7 @@ sub ximport {
'R|remotehost=s' => \$remoteHost,
'p|postscripts=s' => \$nodes,
'f|profile=s' => \$new_profile,
'n|nozip' => \$nozip
);
if ($help) {
@ -130,7 +132,7 @@ sub ximport {
}
# first extract the bundle
extract_bundle($request, $callback, $nodes, $new_profile, $remoteHost);
extract_bundle($request, $callback, $nodes, $new_profile, $remoteHost, $nozip );
}
@ -608,7 +610,7 @@ sub get_files {
if (-f "$rootimgdir/kernel") {
$kernel = "$rootimgdir/kernel";
}
my $compressedrootimg=xCAT::SvrUtils->searchcompressedrootimg("$rootimgdir");
$rootimg = "$rootimgdir/$compressedrootimg";
@ -1115,6 +1117,7 @@ sub extract_bundle {
my $nodes = shift;
my $new_profile = shift;
my $remoteHost = shift;
my $nozip = shift;
@ARGV = @{ $request->{arg} };
my $xml;
@ -1188,12 +1191,21 @@ sub extract_bundle {
$callback->({ data => ["Unbundling image..."] });
my $rc;
if ($nozip) {
if ($::VERBOSE) {
$callback->({data=>["tar xvf $bundle -C $tpath"]});
$rc = system("tar xvf $bundle -C $tpath");
} else {
$rc = system("tar xf $bundle -C $tpath");
}
} else {
if ($::VERBOSE) {
$callback->({ data => ["tar zxvf $bundle -C $tpath"] });
$rc = system("tar zxvf $bundle -C $tpath");
} else {
$rc = system("tar zxf $bundle -C $tpath");
}
}
if ($rc) {
$callback->({ error => ["Failed to extract bundle $bundle"], errorcode => [1] });

View File

@ -55,6 +55,7 @@ sub findme {
my @SEQdiscover = xCAT::TableUtils->get_site_attribute("__SEQDiscover");
my @PCMdiscover = xCAT::TableUtils->get_site_attribute("__PCMDiscover");
my @ZVMDiscover = xCAT::TableUtils->get_site_attribute("__ZVMDiscover");
if (defined($request->{discoverymethod}) and defined($request->{discoverymethod}->[0]) and ($request->{discoverymethod}->[0] ne 'undef')) {
@ -62,6 +63,14 @@ sub findme {
return;
}
unless ($SEQdiscover[0]) {
if ( $PCMdiscover[0] or $ZVMDiscover[0] ) {
# profile or z/VM discovery is running, then just return to make the other discovery handle it
return;
}
# update the discoverydata table to have an undefined node
$request->{discoverymethod}->[0] = 'undef';
xCAT::DiscoveryUtils->update_discovery_data($request);
return;
}
@ -436,7 +445,7 @@ sub nodediscoverstart {
xCAT::MsgUtils->message("E", $rsp, $cb, 1);
}
my $usageinfo = "nodediscoverstart: Start a discovery process: Sequential or Profile.
my $usageinfo = "nodediscoverstart: Start a discovery process: Sequential, Profile or z/VM.
Usage:
Common:
nodediscoverstart [-h|--help|-v|--version|-V|--verbose]
@ -444,12 +453,16 @@ Usage:
nodediscoverstart noderange=<noderange> [hostiprange=<hostiprange>] [bmciprange=<bmciprange>] [groups=<groups>] [rack=<rack>] [chassis=<chassis>] [height=<height>] [unit=<unit>] [osimage=<osimagename>] [-n|--dns] [-s|--skipbmcsetup] [-V|--verbose]
Profile Discovery:
nodediscoverstart networkprofile=<networkprofile> imageprofile=<imageprofile> hostnameformat=<hostnameformat> [hardwareprofile=<hardwareprofile>] [groups=<groups>] [rack=<rack>] [chassis=<chassis>] [height=<height>] [unit=<unit>] [rank=rank-num]";
z/VM Discovery:
nodediscoverstart zvmhost=<noderange> [defineto=both] [groups=<groups>] [ipfilter=<filter>] [openstackoperands=<operands>] [useridfilter=<filter>]
nodediscoverstart zvmhost=<noderange> defineto=xcatonly [groups=<groups>] [ipfilter=<filter>] [nodenameformat=<nodenameformat>] [useridfilter=<filter>]
nodediscoverstart zvmhost=<noderange> defineto=openstackonly [openstackoperands=<operands>]";
$rsp = ();
push @{ $rsp->{data} }, $usageinfo;
xCAT::MsgUtils->message("I", $rsp, $cb);
};
# valid attributes for deqdiscovery
# valid attributes for seqdiscovery
my %validargs = (
'noderange' => 1,
'hostiprange' => 1,
@ -492,7 +505,13 @@ Usage:
$orgargs{$name} = $value;
}
# Check the noderage=has been specified which is the flag that this is for sequential discovery
# Check the zvmhost= has been specified which is the flag that this is for z/VM discovery.
# Otherwise, fall thru to handle either sequential or profile discovery.
if ( defined( $orgargs{zvmhost} ) ) {
return;
}
# Check the noderange= has been specified which is the flag that this is for sequential discovery
# Otherwise try to check the whether the networkprofile || hardwareprofile || imageprofile
# has been passed, if yes, return to profile discovery
unless (defined($orgargs{noderange})) {
@ -502,6 +521,7 @@ Usage:
return;
} else {
$usage->($callback, "For sequential discovery, the \'noderange\' option must be specified.");
$usage->($callback, "For z/VM discovery, the \'zvmhost\' option must be specified.");
return;
}
}
@ -567,7 +587,7 @@ Usage:
$sitetab->setAttribs({ "key" => "__SEQDiscover" }, { "value" => "$textparam" });
$sitetab->close();
# Clean the entries which discovery method is 'sequential' from the discoverdata table
# Clean the entries which discovery method is 'sequential' from the discoverydata table
my $distab = xCAT::Table->new("discoverydata");
$distab->delEntries({ method => 'sequential' });
$distab->commit();
@ -689,9 +709,12 @@ sub nodediscoverstop {
xCAT::MsgUtils->message("E", $rsp, $cb, 1);
}
my $usageinfo = "nodediscoverstop: Stop the running discovery: Sequential and Profile.
my $usageinfo = "nodediscoverstop: Stop the running discovery: Profile, Sequential and z/VM.
Usage:
nodediscoverstop [-h|--help|-v|--version] ";
Common:
nodediscoverstop [-h|--help|-v|--version]
z/VM discovery:
nodediscoverstop [-z|--zvmhost <noderange>]";
$rsp = ();
push @{ $rsp->{data} }, $usageinfo;
xCAT::MsgUtils->message("I", $rsp, $cb);
@ -721,9 +744,10 @@ Usage:
# Check the running of sequential discovery
my @SEQDiscover = xCAT::TableUtils->get_site_attribute("__SEQDiscover");
my @PCMDiscover = xCAT::TableUtils->get_site_attribute("__PCMDiscover");
if ($PCMDiscover[0]) {
my @ZVMDiscover = xCAT::TableUtils->get_site_attribute("__ZVMDiscover");
if ($PCMDiscover[0] or $ZVMDiscover[0]) {
# return directly that profile discover will cover it
# return directly that the other discovery will handle the stop function.
return;
} elsif (!$SEQDiscover[0]) {
@ -731,12 +755,13 @@ Usage:
my $rsp;
push @{ $rsp->{data} }, "Sequential Discovery is stopped.";
push @{ $rsp->{data} }, "Profile Discovery is stopped.";
push @{$rsp->{data}}, "z/VM Discovery is stopped.";
xCAT::MsgUtils->message("E", $rsp, $callback, 1);
return;
}
my $DBname = xCAT::Utils->get_DBName; # support for DB2
# Go thought discoverydata table and display the sequential disocvery entries
# Go through discoverydata table and display the sequential discovery entries
my $distab = xCAT::Table->new('discoverydata');
unless ($distab) {
my $rsp;
@ -779,7 +804,7 @@ Usage:
}
=head3 nodediscoverls
Display the discovered nodes
Display the discovered nodes. This supports sequential and z/VM and partially Profile discovery.
=cut
sub nodediscoverls {
@ -797,12 +822,14 @@ sub nodediscoverls {
}
my $usageinfo = "nodediscoverls: list the discovered nodes.
Usage:
Usage:
Common:
nodediscoverls
nodediscoverls [-h|--help|-v|--version]
nodediscoverls [-t seq|profile|switch|blade|manual|undef|all] [-l]
nodediscoverls [-t seq|profile|switch|blade|manual|undef|zvm|all] [-l]
nodediscoverls [-u uuid] [-l]
";
z/VM:
nodediscoverls [-t zvm][-z|--zvmhost <noderange>] [-l]";
$rsp = ();
push @{ $rsp->{data} }, $usageinfo;
xCAT::MsgUtils->message("I", $rsp, $cb);
@ -811,14 +838,15 @@ Usage:
if ($args) {
@ARGV = @$args;
}
my ($type, $uuid, $long, $help, $ver);
my ($type, $uuid, $long, $help, $ver, $zvmHost );
if (!GetOptions(
't=s' => \$type,
'u=s' => \$uuid,
'l' => \$long,
'h|help' => \$help,
'V|verbose' => \$::VERBOSE,
'v|version' => \$ver)) {
'v|version' => \$ver,
'z|zvmhost=s' => \$zvmHost )) {
$usage->($callback);
return;
}
@ -833,9 +861,9 @@ Usage:
}
# If the type is specified, display the corresponding type of nodes
my @SEQDiscover;
my ( @SEQDiscover, @ZVMDiscover );
if ($type) {
if ($type !~ /^(seq|profile|switch|blade|manual|undef|all)$/) {
if ($type !~ /^(seq|profile|switch|blade|manual|undef|zvm|all)$/) {
$usage->($callback, "The discovery type \'$type\' is not supported.");
return;
}
@ -844,24 +872,31 @@ Usage:
# Check the running of sequential discovery
@SEQDiscover = xCAT::TableUtils->get_site_attribute("__SEQDiscover");
@ZVMDiscover = xCAT::TableUtils->get_site_attribute("__ZVMDiscover");
if ($SEQDiscover[0]) {
$type = "seq";
} else {
my @PCMDiscover = xCAT::TableUtils->get_site_attribute("__PCMDiscover");
if ($PCMDiscover[0]) {
} elsif ($PCMDiscover[0]) {
#return directly if my type of discover is not running.
#return directly if profile discovery is running.
return;
} elsif ( $ZVMDiscover[0] ) {
# zvmdiscovery handles requests for a running z/VM discovery.
return;
} else {
# no type, no seq and no profile, then just diaplay all
# no type, no seq and no profile, then just display all
$type = "all";
}
}
}
my $DBname = xCAT::Utils->get_DBName; # support for DB2
# Go thought discoverydata table and display the disocvery entries
# If a zvmHost was specified then let zvmdiscovery handle it.
# Specifying '-u' will keep processing within seqdiscovery.
if ( !$uuid && ( $zvmHost || ( $type && $type eq 'zvm' )) ) {
# zvmdiscovery handles request specific to z/VM.
return;
}
# Go through discoverydata table and display the discovery entries
my $distab = xCAT::Table->new('discoverydata');
unless ($distab) {
my $rsp;
@ -914,7 +949,8 @@ Usage:
}
my $rsp;
if ($SEQDiscover[0] && $type eq "sequential") {
if (($SEQDiscover[0] && $type eq "sequential" ) or
( $type && $type eq "all" )) {
push @{ $rsp->{data} }, "Discovered $discoverednum node.";
}
if (@discoverednodes) {
@ -949,8 +985,11 @@ sub nodediscoverstatus {
}
my $usageinfo = "nodediscoverstatus: Display the discovery process status.
Usage:
nodediscoverstatus [-h|--help|-v|--version] ";
Usage:
Common:
nodediscoverstatus [-h|--help|-v|--version]
z/VM
nodediscoverstatus [-z|--zvmhost <noderange>]";
$rsp = ();
push @{ $rsp->{data} }, $usageinfo;
xCAT::MsgUtils->message("I", $rsp, $cb);
@ -980,6 +1019,7 @@ Usage:
# Check the running of sequential discovery
my @SEQDiscover = xCAT::TableUtils->get_site_attribute("__SEQDiscover");
my @PCMDiscover = xCAT::TableUtils->get_site_attribute("__PCMDiscover");
my @ZVMDiscover = xCAT::TableUtils->get_site_attribute("__ZVMDiscover");
if ($SEQDiscover[0]) {
my $rsp;
push @{ $rsp->{data} }, "Sequential discovery is running.";
@ -989,10 +1029,13 @@ Usage:
my $rsp;
push @{ $rsp->{data} }, "Node discovery for all nodes using profiles is running";
xCAT::MsgUtils->message("I", $rsp, $callback);
} elsif ( $ZVMDiscover[0] ) {
# z/VM discovery is a more complex response so we let its handler return the response.
} else {
my $rsp;
push @{ $rsp->{data} }, "Sequential Discovery is stopped.";
push @{ $rsp->{data} }, "Profile Discovery is stopped.";
push @{$rsp->{data}}, "z/VM Discovery is stopped.";
xCAT::MsgUtils->message("I", $rsp, $callback);
}
@ -1008,6 +1051,9 @@ sub nodediscoverdef {
my $subreq = shift;
my $args = shift;
my @inputZvmHosts; # Input list of z/VM host nodes to stop
my $zvmHost; # Small scope variable to temporarily hold a z/VM host node value
# The subroutine used to display the usage message
my $usage = sub {
my $cb = shift;
@ -1021,10 +1067,13 @@ sub nodediscoverdef {
my $usageinfo = "nodediscoverdef: Define the undefined discovery request, or clean the discovery entries in the discoverydata table (Which can be displayed by nodediscoverls command).
Usage:
Common:
nodediscoverdef -u uuid -n node
nodediscoverdef -r -u uuid
nodediscoverdef -r -t {seq|profile|switch|blade|manual|undef|all}
nodediscoverdef [-h|--help|-v|--version]";
nodediscoverdef -r -t {seq|profile|switch|blade|manual|undef|zvm|all}
nodediscoverdef [-h|--help|-v|--version]
z/VM:
nodediscoverdef -r -t zvm [-z|--zvmhost noderange]";
$rsp = ();
push @{ $rsp->{data} }, $usageinfo;
xCAT::MsgUtils->message("I", $rsp, $cb);
@ -1042,7 +1091,8 @@ Usage:
'r' => \$remove,
'h|help' => \$help,
'V|verbose' => \$::VERBOSE,
'v|version' => \$ver)) {
'v|version' => \$ver,
'z|zvmhost=s' => \$zvmHost )) {
$usage->($callback);
return;
}
@ -1057,6 +1107,29 @@ Usage:
}
my $DBname = xCAT::Utils->get_DBName; # support for DB2
# Put any specified zvmhosts into an array for later use.
if ( $zvmHost ) {
$type = 'zvm' if ( !$type );
if ( $type ne 'zvm' ) {
xCAT::MsgUtils->message("E", {data=>["Discovery Error: Type must be 'zvm' when '-z' or '--zvmhost' is specified."]}, $callback);
return;
}
if ( index( $zvmHost, ',' ) != -1 ) {
# Must have specified multiple host node names
my @hosts = split( /,/, $zvmHost );
foreach $zvmHost ( @hosts ) {
if ( !$zvmHost ) {
# Tolerate zvmhost value beginning with a comma.
# It is wrong but not worth an error message.
next;
}
push( @inputZvmHosts, $zvmHost );
}
} else {
push( @inputZvmHosts, $zvmHost );
}
}
# open the discoverydata table for the subsequent using
my $distab = xCAT::Table->new("discoverydata");
unless ($distab) {
@ -1095,7 +1168,7 @@ Usage:
} elsif ($type) {
# handle the -r -t <...>
if ($type !~ /^(seq|profile|switch|blade|manual|undef|all)$/) {
if ($type !~ /^(seq|profile|switch|blade|manual|undef|zvm|all)$/) {
$usage->($callback, "The discovery type \'$type\' is not supported.");
return;
}
@ -1131,9 +1204,24 @@ Usage:
if ($type =~ /^seq/) {
$type = "sequential";
}
# If a noderange of z/VM hosts was specified then delete
# all z/VM discovered systems for those hosts. 'zvm' type
# must be used when z/VM hosts are specified.
if ( @inputZvmHosts ) {
my %keyhash;
$keyhash{'method'} = 'zvm';
foreach $zvmHost ( @inputZvmHosts ) {
$keyhash{'otherdata'} = "zvmhost." . $zvmHost;
$distab->delEntries( \%keyhash );
}
$distab->commit();
} else {
# Otherwise, Delete all systems discovered using the specified method.
$distab->delEntries({ method => $type });
$distab->commit();
}
}
}
xCAT::MsgUtils->message("I", { data => ["Removing discovery entries finished."] }, $callback);
} elsif ($uuid) {

View File

@ -303,6 +303,8 @@ sub parse_xdcp_cmd
'F|File=s' => \$options{'File'},
'h|help' => \$options{'help'},
'i|rootimg=s' => \$options{'rootimg'},
'ip=s' => \$options{'ip'},
'show=s' => \$options{'show'},
'l|user=s' => \$options{'user'},
'n|nodes=s' => \$options{'nodes'},
'o|node-options=s' => \$options{'node-options'},
@ -459,6 +461,8 @@ sub parse_xdsh_cmd
'q|show-config' => \$options{'show-config'},
'r|node-rsh=s' => \$options{'node-rsh'},
'i|rootimg=s' => \$options{'rootimg'},
'ip=s' => \$options{'ip'},
'show=s' => \$options{'show'},
's|stream' => \$options{'streaming'},
't|timeout=i' => \$options{'timeout'},
'v|verify' => \$options{'verify'},
@ -1070,11 +1074,11 @@ sub process_nodes
#-------------------------------------------------------
=head3 syncSNZoneKeys
Build the xdcp command to send the zone keys to the service nodes
Return an array of servicenodes that do not have errors
Build the xdcp command to send the zone keys to the service nodes
Return an array of servicenodes that do not have errors
Returns error code:
if = 0, good return continue to process the
nodes.
nodes.
if = 1, global error need to quit
=cut

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,306 @@
# IBM(c) 2016 EPL license http://www.eclipse.org/legal/epl-v10.html
#-------------------------------------------------------
=head1
xCAT plugin to support z/VM (s390x) diagnostics command
=cut
#-------------------------------------------------------
package xCAT_plugin::zvmdiagnostics;
#use xCAT::Client;
use xCAT::zvmUtils;
#use xCAT::zvmCPUtils;
#use xCAT::MsgUtils;
use Sys::Hostname;
#use xCAT::Table;
#use xCAT::Utils;
#use xCAT::TableUtils;
#use xCAT::ServiceNodeUtils;
#use xCAT::NetworkUtils;
#use XML::Simple;
#use File::Basename;
#use File::Copy;
#use File::Path;
#use File::Temp;
use Time::HiRes;
use POSIX;
use Getopt::Long;
use strict;
use warnings;
#use Cwd;
# Set $DEBUGGING = 1 to get extra message logging
my $DEBUGGING = 0;
# Common prefix for log messages
my $ROUTINE = "zvmdiagnostics";
my $COMMAND = "diagnostics";
my $NOTIFY_FILENAME = "/var/lib/sspmod/appliance_system_role";
my $NOTIFY_KEYWORD = "notify";
my $NOTIFY_KEYWORD_DELIMITER = "=";
# If the following line ("1;") is not included, you get:
# /opt/xcat/lib/perl/xCAT_plugin/... did not return a true value
# where ... is the name of this file
1;
#-------------------------------------------------------
=head3 handled_commands
Return list of commands handled by this plugin
=cut
#-------------------------------------------------------
sub handled_commands {
return { $COMMAND => $ROUTINE, };
}
#-------------------------------------------------------
=head3 preprocess_request
Check and setup for hierarchy
=cut
#-------------------------------------------------------
sub preprocess_request {
my $req = shift;
my $callback = shift;
my $SUBROUTINE = "preprocess_request";
# Hash array
my %sn;
# Scalar variable
my $sn;
# Array
my @requests;
if ( $DEBUGGING == 1 ) {
xCAT::zvmUtils->printSyslog("$ROUTINE $SUBROUTINE entry");
}
# If already preprocessed, go straight to request
if ( $req->{_xcatpreprocessed}->[0] == 1 ) {
return [$req];
}
my $nodes = $req->{node};
my $service = "xcat";
# Find service nodes for requested nodes
# Build an individual request for each service node
if ($nodes) {
$sn = xCAT::ServiceNodeUtils->get_ServiceNode( $nodes, $service, "MN" );
# Build each request for each service node
foreach my $snkey ( keys %$sn ) {
my $n = $sn->{$snkey};
print "snkey=$snkey, nodes=@$n\n";
my $reqcopy = {%$req};
$reqcopy->{node} = $sn->{$snkey};
$reqcopy->{'_xcatdest'} = $snkey;
$reqcopy->{_xcatpreprocessed}->[0] = 1;
push @requests, $reqcopy;
}
return \@requests;
}
else {
# Input error
my %rsp;
my $rsp;
$rsp->{data}->[0] =
"Input noderange missing. Usage: $ROUTINE <noderange> \n";
xCAT::MsgUtils->message( "I", $rsp, $callback, 0 );
return 1;
}
}
#-------------------------------------------------------
=head3 process_request
Process the command. This is the main call.
=cut
#-------------------------------------------------------
sub process_request {
my $SUBROUTINE = "process_request";
my $request = shift;
my $callback = shift;
my $nodes = $request->{node};
my $command = $request->{command}->[0];
my $args = $request->{arg};
my $envs = $request->{env};
$::STDIN = $request->{stdin}->[0];
my %rsp;
my $rsp;
my @nodes = @$nodes;
my $host = hostname();
if ( $DEBUGGING == 1 ) {
xCAT::zvmUtils->printSyslog("$ROUTINE $SUBROUTINE entry");
}
# Process ID for xfork()
my $pid;
# Child process IDs
my @children = ();
#*** Collect or manage diagnostics***
if ( $command eq $COMMAND ) {
foreach (@nodes) {
$pid = xCAT::Utils->xfork();
# Parent process
if ($pid) {
push( @children, $pid );
}
# Child process
elsif ( $pid == 0 ) {
if ( xCAT::zvmUtils->isHypervisor($_) ) {
#TODO should this be handled inside the subroutine, ala rmvm?
if ( $DEBUGGING == 1 ) {
xCAT::zvmUtils->printSyslog("$ROUTINE for hypervisor - semantically coherent?");
}
}
else {
collectDiags( $callback, $_, $args );
}
# Exit process
exit(0);
}
else {
# Ran out of resources
die "Error: Could not fork\n";
}
} # End of foreach
} # End of case
# Wait for all processes to end
foreach (@children) {
waitpid( $_, 0 );
}
return;
}
#-------------------------------------------------------
=head3 collectDiags
Description : Collect diagnostics
Arguments : Node to collect diagnostics about
Returns : Nothing
Example : collectDiags($callback, $node);
=cut
#-------------------------------------------------------
sub collectDiags {
my $SUBROUTINE = "collectDiags";
# Get inputs
my ( $callback, $node, $args ) = @_;
my $rc;
if ( $DEBUGGING == 1 ) {
xCAT::zvmUtils->printSyslog("$ROUTINE $SUBROUTINE entry");
}
# Get node properties from 'zvm' table
my @propNames = ( 'hcp', 'userid', 'discovered' );
my $propVals = xCAT::zvmUtils->getNodeProps( 'zvm', $node, @propNames );
# Get zHCP
my $hcp = $propVals->{'hcp'};
if ( !$hcp ) {
xCAT::zvmUtils->printLn( $callback, "$node: (Error) Missing node HCP" );
return;
}
# Get node user ID
my $userId = $propVals->{'userid'};
if ( !$userId ) {
xCAT::zvmUtils->printLn( $callback, "$node: (Error) Missing user ID" );
return;
}
# Capitalize user ID
$userId =~ tr/a-z/A-Z/;
if ( $DEBUGGING == 1 ) {
xCAT::zvmUtils->printSyslog("$ROUTINE $SUBROUTINE sudoer:$::SUDOER zHCP:$hcp sudo:$::SUDO userid:$::userId");
}
my $out;
my $requestId = "NoUpstreamRequestID";
my $objectId = "NoUpstreamObjectID";
my $projectName = "NoUpstreamProjectName";
my $userUuid = "NoUpstreamUserUuid";
if ($args) {
@ARGV = @$args;
xCAT::zvmUtils->printSyslog(
"$ROUTINE $SUBROUTINE for node:$node on zhcp:$hcp args @$args");
# Parse options
GetOptions(
'requestid=s' => \$requestId # Optional
, 'objectid=s' => \$objectId # Optional
);
}
my $xcatnotify = "OPERATOR"; # Default value
my $xcatnotify_found = 0; # Not found yet
my (@array, $varname);
open( FILE, "<$NOTIFY_FILENAME" );
#TODO If file not found ("should never happen"), log error but continue
while (<FILE>) {
# Find record in file with NOTIFY=something on it, optionally delimited with whitespace
next unless ( /^[\s]*$NOTIFY_KEYWORD[\s]*$NOTIFY_KEYWORD_DELIMITER[\s]*(\S+)[\s]*$/iaa );
$xcatnotify_found = 1;
$xcatnotify = $1; # First parenthesized expression in regex above, that is: \S+
if ( $DEBUGGING == 1 ) {
xCAT::zvmUtils->printSyslog("$ROUTINE $SUBROUTINE xCAT will notify $xcatnotify.");
}
last; # Ignore anything past the first matching record. Absent a bug elsewhere, there is only one value to find.
}
close(FILE);
if (not $xcatnotify_found) {
xCAT::zvmUtils->printSyslog(
"$ROUTINE $SUBROUTINE error: failed to parse $NOTIFY_KEYWORD$NOTIFY_KEYWORD_DELIMITER " .
"from $NOTIFY_FILENAME, defaulting to notify $xcatnotify");
}
#TODO add COZ... message ID
my $msg = "vmcp MSG $xcatnotify deployment failed: node $node userid $userId on zHCP $hcp";
xCAT::zvmUtils->printSyslog("$ROUTINE $SUBROUTINE $msg");
system($msg);
#TODO check system()'s rc
#TODO Capture diagnostic files
xCAT::zvmUtils->printSyslog("$ROUTINE $SUBROUTINE ... rest of implementation stubbed out ");
if ( $DEBUGGING == 1 ) {
xCAT::zvmUtils->printSyslog("$ROUTINE $SUBROUTINE exit");
}
return;
}

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@ install
url --url replace_url
key --skip
lang en_US.UTF-8
network --bootproto dhcp
network --bootproto=static --ip=replace_ip --netmask=replace_netmask --gateway=replace_gateway --nameserver=replace_nameserver --hostname=replace_hostname
rootpw replace_rootpw
firewall --disabled
authconfig --enableshadow --enablemd5
@ -18,7 +18,7 @@ key --skip
# here so unless you clear all partitions first, this is
# not guaranteed to work
zerombr yes
clearpart --initlabel --drives=dasda
clearpart --all --initlabel --drives=dasda
part / --fstype ext3 --size=100 --grow --ondisk=dasda
part swap --size=512 --ondisk=dasda

View File

@ -4,7 +4,7 @@ install
url --url replace_url
key --skip
lang en_US.UTF-8
network --bootproto dhcp
network --bootproto=static --ip=replace_ip --netmask=replace_netmask --gateway=replace_gateway --nameserver=replace_nameserver --hostname=replace_hostname
rootpw replace_rootpw
firewall --disabled
authconfig --enableshadow --enablemd5
@ -18,7 +18,7 @@ key --skip
# here so unless you clear all partitions first, this is
# not guaranteed to work
zerombr
clearpart --initlabel --drives=dasda
clearpart --all --initlabel --drives=dasda
part / --fstype ext3 --size=100 --grow --ondisk=dasda
part swap --size=512 --ondisk=dasda

View File

@ -4,7 +4,7 @@ install
url --url replace_url
key --skip
lang en_US.UTF-8
network --bootproto dhcp
network --bootproto=static --ip=replace_ip --netmask=replace_netmask --gateway=replace_gateway --nameserver=replace_nameserver --hostname=replace_hostname
rootpw replace_rootpw
firewall --disabled
authconfig --enableshadow --enablemd5

View File

@ -4,7 +4,7 @@ install
url --url replace_url
key --skip
lang en_US.UTF-8
network --bootproto dhcp
network --bootproto=static --ip=replace_ip --netmask=replace_netmask --gateway=replace_gateway --nameserver=replace_nameserver --hostname=replace_hostname
rootpw replace_rootpw
firewall --disabled
authconfig --enableshadow --enablemd5

View File

@ -1,4 +1,3 @@
echo ARP=no >> /etc/sysconfig/network-scripts/ifcfg-eth0
# Get hostname
export HOSTNAME=$(host $IP 2>/dev/null | awk '{print $5}' | awk -F. '{print $1}')
@ -93,34 +92,26 @@ cd /xcatpost
export PATH=$PATH:/xcatpost
# Use the run_ps subroutine to run the postscripts
TMP=`sed "/postscripts-start-here/,/postscripts-end-here/ s/\(.*\)/run_ps postscript \1/;s/run_ps postscript\s*#/#/;s/run_ps postscript\s*$//" /xcatpost/mypostscript`
TMP=`sed "/postscripts-start-here/,/postscripts-end-here/ s/\(.*\)/run_ps \1/;s/run_ps\s*#/#/;s/run_ps\s*$//" /xcatpost/mypostscript`
echo "
# Subroutine used to run postscripts
# \$1 argument is the script type
# rest argument is the script name and arguments
run_ps () {
logdir=\"/var/log/xcat\"
mkdir -p \$logdir
logfile=\"/var/log/xcat/xcat.log\"
scriptype=\$1
shift;
if [ -z \"\$scriptype\" ]; then
scriptype=\"postscript\"
fi
if [ -f \$1 ]; then
echo \"Running \$scriptype: \$1\" | tee -a \$logfile
./\$@ 2>&1 | tee -a \$logfile
echo \"Running postscript: \$@\" | tee -a \$logfile
./\$@ 2>&1 | tee -a $logfile
else
echo \"\$scriptype \$1 does NOT exist.\" | tee -a \$logfile
echo \"Postscript \$1 does NOT exist.\" | tee -a \$logfile
fi
}
# Subroutine end
" > /xcatpost/mypostscript
echo "$TMP" >> /xcatpost/mypostscript
TMP=`sed "/postbootscripts-start-here/,/postbootscripts-end-here/ s/\(.*\)/run_ps postbootscript \1/;s/run_ps postbootscript\s*#/#/;s/run_ps postbootscript\s*$//" /xcatpost/mypostscript`
TMP=`sed "/postbootscripts-start-here/,/postbootscripts-end-here/ s/\(.*\)/run_ps \1/;s/run_ps\s*#/#/;s/run_ps\s*$//" /xcatpost/mypostscript`
echo "$TMP" > /xcatpost/mypostscript

View File

@ -1,4 +1,3 @@
echo ARP=no >> /etc/sysconfig/network-scripts/ifcfg-eth0
# Get hostname
export HOSTNAME=$(host $IP 2>/dev/null | awk '{print $5}' | awk -F. '{print $1}')
@ -92,34 +91,26 @@ cd /xcatpost
export PATH=$PATH:/xcatpost
# Use the run_ps subroutine to run the postscripts
TMP=`sed "/postscripts-start-here/,/postscripts-end-here/ s/\(.*\)/run_ps postscript \1/;s/run_ps postscript\s*#/#/;s/run_ps postscript\s*$//" /xcatpost/mypostscript`
TMP=`sed "/postscripts-start-here/,/postscripts-end-here/ s/\(.*\)/run_ps \1/;s/run_ps\s*#/#/;s/run_ps\s*$//" /xcatpost/mypostscript`
echo "
# Subroutine used to run postscripts
# \$1 argument is the script type
# rest argument is the script name and arguments
run_ps () {
logdir=\"/var/log/xcat\"
mkdir -p \$logdir
logfile=\"/var/log/xcat/xcat.log\"
scriptype=\$1
shift;
if [ -z \"\$scriptype\" ]; then
scriptype=\"postscript\"
fi
if [ -f \$1 ]; then
echo \"Running \$scriptype: \$1\" | tee -a \$logfile
./\$@ 2>&1 | tee -a \$logfile
echo \"Running postscript: \$@\" | tee -a \$logfile
./\$@ 2>&1 | tee -a $logfile
else
echo \"\$scriptype \$1 does NOT exist.\" | tee -a \$logfile
echo \"Postscript \$1 does NOT exist.\" | tee -a \$logfile
fi
}
# Subroutine end
" > /xcatpost/mypostscript
echo "$TMP" >> /xcatpost/mypostscript
TMP=`sed "/postbootscripts-start-here/,/postbootscripts-end-here/ s/\(.*\)/run_ps postbootscript \1/;s/run_ps postbootscript\s*#/#/;s/run_ps postbootscript\s*$//" /xcatpost/mypostscript`
TMP=`sed "/postbootscripts-start-here/,/postbootscripts-end-here/ s/\(.*\)/run_ps \1/;s/run_ps\s*#/#/;s/run_ps\s*$//" /xcatpost/mypostscript`
echo "$TMP" > /xcatpost/mypostscript

View File

@ -100,28 +100,20 @@ PATH=$PATH:/xcatpost
export PATH
# use the run_ps subroutine to run the postscripts
TMP=`sed "/postscripts-start-here/,/postscripts-end-here/ s/\(.*\)/run_ps postscript \1/;s/run_ps postscript\s*#/#/;s/run_ps postscript\s*$//" /tmp/mypostscript`
TMP=`sed "/postscripts-start-here/,/postscripts-end-here/ s/\(.*\)/run_ps \1/;s/run_ps\s*#/#/;s/run_ps\s*$//" /tmp/mypostscript`
echo "
# subroutine used to run postscripts
# \$1 argument is the script type
# rest argument is the script name and arguments
run_ps () {
logdir=\"/var/log/xcat\"
mkdir -p \$logdir
logfile=\"/var/log/xcat/xcat.log\"
scriptype=\$1
shift;
if [ -z \"\$scriptype\" ]; then
scriptype=\"postscript\"
fi
if [ -f \$1 ]; then
echo \"Running \$scriptype: \$1\" | tee -a \$logfile
echo \"Running postscript: \$@\" | tee -a \$logfile
./\$@ 2>&1 1> /tmp/tmp4xcatlog
cat /tmp/tmp4xcatlog | tee -a \$logfile
else
echo \"\$scriptype \$1 does NOT exist.\" | tee -a \$logfile
echo \"Postscript \$1 does NOT exist.\" | tee -a \$logfile
fi
}
# subroutine end
@ -129,7 +121,7 @@ run_ps () {
" > /tmp/mypostscript
echo "cd /xcatpost" >> /tmp/mypostscript
echo "$TMP" >> /tmp/mypostscript
TMP=`sed "/postbootscripts-start-here/,/postbootscripts-end-here/ s/\(.*\)/run_ps postbootscript \1/;s/run_ps postbootscript\s*#/#/;s/run_ps postbootscript\s*$//" /tmp/mypostscript`
TMP=`sed "/postbootscripts-start-here/,/postbootscripts-end-here/ s/\(.*\)/run_ps \1/;s/run_ps\s*#/#/;s/run_ps\s*$//" /tmp/mypostscript`
echo "$TMP" > /tmp/mypostscript

View File

@ -101,28 +101,20 @@ PATH=$PATH:/xcatpost
export PATH
# use the run_ps subroutine to run the postscripts
TMP=`sed "/postscripts-start-here/,/postscripts-end-here/ s/\(.*\)/run_ps postscript \1/;s/run_ps postscript\s*#/#/;s/run_ps postscript\s*$//" /tmp/mypostscript`
TMP=`sed "/postscripts-start-here/,/postscripts-end-here/ s/\(.*\)/run_ps \1/;s/run_ps\s*#/#/;s/run_ps\s*$//" /tmp/mypostscript`
echo "
# subroutine used to run postscripts
# \$1 argument is the script type
# rest argument is the script name and arguments
run_ps () {
logdir=\"/var/log/xcat\"
mkdir -p \$logdir
logfile=\"/var/log/xcat/xcat.log\"
scriptype=\$1
shift;
if [ -z \"\$scriptype\" ]; then
scriptype=\"postscript\"
fi
if [ -f \$1 ]; then
echo \"Running \$scriptype: \$1\" | tee -a \$logfile
echo \"Running postscript: \$@\" | tee -a \$logfile
./\$@ 2>&1 1> /tmp/tmp4xcatlog
cat /tmp/tmp4xcatlog | tee -a \$logfile
else
echo \"\$scriptype \$1 does NOT exist.\" | tee -a \$logfile
echo \"Postscript \$1 does NOT exist.\" | tee -a \$logfile
fi
}
# subroutine end
@ -130,7 +122,7 @@ run_ps () {
" > /tmp/mypostscript
echo "cd /xcatpost" >> /tmp/mypostscript
echo "$TMP" >> /tmp/mypostscript
TMP=`sed "/postbootscripts-start-here/,/postbootscripts-end-here/ s/\(.*\)/run_ps postbootscript \1/;s/run_ps postbootscript\s*#/#/;s/run_ps postbootscript\s*$//" /tmp/mypostscript`
TMP=`sed "/postbootscripts-start-here/,/postbootscripts-end-here/ s/\(.*\)/run_ps \1/;s/run_ps\s*#/#/;s/run_ps\s*$//" /tmp/mypostscript`
echo "$TMP" > /tmp/mypostscript

View File

@ -284,8 +284,7 @@
<dhclient_hostname_option>AUTO</dhclient_hostname_option>
</dhcp_options>
<dns>
<dhcp_hostname config:type="boolean">true</dhcp_hostname>
<dhcp_resolv config:type="boolean">true</dhcp_resolv>
<dhcp_hostname config:type="boolean">false</dhcp_hostname>
<domain>replace_domain</domain>
<hostname>replace_hostname</hostname>
<nameservers config:type="list">
@ -294,11 +293,14 @@
</dns>
<interfaces config:type="list">
<interface>
<bootproto>dhcp</bootproto>
<bootproto>static</bootproto>
<broadcast>replace_broadcast</broadcast>
<device>replace_device</device>
<ipaddr>replace_ipaddr</ipaddr>
<lladdr>replace_lladdr</lladdr>
<netmask>replace_netmask</netmask>
<network>replace_network</network>
<startmode>auto</startmode>
<usercontrol>no</usercontrol>
</interface>
</interfaces>
<managed config:type="boolean">false</managed>

View File

@ -284,8 +284,7 @@
<dhclient_hostname_option>AUTO</dhclient_hostname_option>
</dhcp_options>
<dns>
<dhcp_hostname config:type="boolean">true</dhcp_hostname>
<dhcp_resolv config:type="boolean">true</dhcp_resolv>
<dhcp_hostname config:type="boolean">false</dhcp_hostname>
<domain>replace_domain</domain>
<hostname>replace_hostname</hostname>
<nameservers config:type="list">
@ -294,11 +293,14 @@
</dns>
<interfaces config:type="list">
<interface>
<bootproto>dhcp</bootproto>
<bootproto>static</bootproto>
<broadcast>replace_broadcast</broadcast>
<device>replace_device</device>
<ipaddr>replace_ipaddr</ipaddr>
<lladdr>replace_lladdr</lladdr>
<netmask>replace_netmask</netmask>
<network>replace_network</network>
<startmode>auto</startmode>
<usercontrol>no</usercontrol>
</interface>
</interfaces>
<managed config:type="boolean">false</managed>

View File

@ -238,7 +238,7 @@
<dhclient_hostname_option>AUTO</dhclient_hostname_option>
</dhcp_options>
<dns>
<dhcp_hostname config:type="boolean">true</dhcp_hostname>
<dhcp_hostname config:type="boolean">false</dhcp_hostname>
<dhcp_resolv config:type="boolean">true</dhcp_resolv>
<domain>replace_domain</domain>
<hostname>replace_hostname</hostname>
@ -248,11 +248,14 @@
</dns>
<interfaces config:type="list">
<interface>
<bootproto>dhcp</bootproto>
<bootproto>static</bootproto>
<broadcast>replace_broadcast</broadcast>
<device>replace_device</device>
<ipaddr>replace_ipaddr</ipaddr>
<lladdr>replace_lladdr</lladdr>
<netmask>replace_netmask</netmask>
<network>replace_network</network>
<startmode>auto</startmode>
<usercontrol>no</usercontrol>
</interface>
</interfaces>
<managed config:type="boolean">false</managed>

View File

@ -238,7 +238,7 @@
<dhclient_hostname_option>AUTO</dhclient_hostname_option>
</dhcp_options>
<dns>
<dhcp_hostname config:type="boolean">true</dhcp_hostname>
<dhcp_hostname config:type="boolean">false</dhcp_hostname>
<dhcp_resolv config:type="boolean">true</dhcp_resolv>
<domain>replace_domain</domain>
<hostname>replace_hostname</hostname>
@ -248,11 +248,14 @@
</dns>
<interfaces config:type="list">
<interface>
<bootproto>dhcp</bootproto>
<bootproto>static</bootproto>
<broadcast>replace_broadcast</broadcast>
<device>replace_device</device>
<ipaddr>replace_ipaddr</ipaddr>
<lladdr>replace_lladdr</lladdr>
<netmask>replace_netmask</netmask>
<network>replace_network</network>
<startmode>auto</startmode>
<usercontrol>no</usercontrol>
</interface>
</interfaces>
<managed config:type="boolean">false</managed>

View File

@ -15,6 +15,3 @@ rpm
rsync
udev
s390utils
tar
gzip
xz

View File

@ -14,6 +14,3 @@ rsync
rsyslog
udev
s390utils
tar
gzip
xz

View File

@ -0,0 +1,579 @@
#!/bin/bash
# IBM(c) 2013, 2015 EPL license http://www.eclipse.org/legal/epl-v10.html
###############################################################################
# This script is used to handle xCAT disk initialization and configuration(eg.
# attach/detach a SCSI volume, add an additional ephemeral disk when vm is in
# inactive status). It will be invoked and executed when vm start up.
###############################################################################
version=3.0
function getOsVersion {
# @Description:
# Returns the Linux distro version in an easy to parse format.
# @Input:
# None
# @Output:
# os - Variable set with OS and version information. For example:
# "rhel62" or "sles11sp2"
# @Code:
if [[ -e "/etc/os-release" ]]; then
os=`cat /etc/os-release | grep "^ID=" | sed \
-e 's/ID=//' \
-e 's/"//g'`
version=`cat /etc/os-release | grep "^VERSION_ID=" | sed \
-e 's/VERSION_ID=//' \
-e 's/"//g' \
-e 's/\.//'`
os=$os$version
#The /etc/SuSE-release file will be deprecated in sles11.4 and later release
elif [[ -e "/etc/SuSE-release" ]]; then
os='sles'
version=`cat /etc/SuSE-release | grep "VERSION =" | sed \
-e 's/^.*VERSION =//' \
-e 's/\s*$//' \
-e 's/.//' \
-e 's/[^0-9]*([0-9]+).*/$1/'`
os=$os$version
# Append service level
level=`echo "/etc/SuSE-release" | grep "LEVEL =" | sed \
-e 's/^.*LEVEL =//' \
-e 's/\s*$//' \
-e 's/.//' \
-e 's/[^0-9]*([0-9]+).*/$1/'`
os=$os'sp'$level
#The /etc/redhat-release file will be deprecated in rhel7 and later release
elif [[ -e "/etc/redhat-release" ]]; then
os='rhel'
version=`cat /etc/redhat-release | grep -i "Red Hat Enterprise Linux Server" | sed \
-e 's/[A-Za-z\/\.\(\)]//g' \
-e 's/^ *//g' \
-e 's/ *$//g' \
-e 's/\s.*$//'`
os=$os$version
fi
return
}
function onlineDevice {
# @Description:
# Brings a Linux device online.
# @Input:
# Device number, e.g. "0.0.000c"
# @Output:
# Return code indicates success or failure
# @Code:
device=$1
local funcName="onlineDevice"
rc=$(/sbin/chccwdev -e $device > /dev/null; echo $?)
if (( rc != 0 )); then
if [[ -e /sbin/cio_ignore ]]; then
rc=$(/sbin/cio_ignore -r 0.0.$device > /dev/null; echo $?)
which udevadm &> /dev/null && udevadm settle || udevsettle
fi
rc=$(/sbin/chccwdev -e $device > /dev/null; echo $?)
if (( rc != 0 )); then
echo "$funcName (Error) Could not activate the virtual device $device"
return 1
fi
fi
which udevadm &> /dev/null && udevadm settle || udevsettle
return 0
}
function setupDisk {
# @Description:
# Processes a disk file for the following functions:
# Create a file system node
# Remove a file system node
# Setup a SCSI volume
# Removes a SCSI volume
# Add a mdisk based ephemeral disk
# @Input:
# Disk handling parameters
# @Output:
# None
# @Code:
local funcName="setupDisk"
# Parse the parameter from parameter list
for parameter in $@; do
keyName=${parameter%\=*}
value=${parameter#*\=}
value=$(echo ${value} | sed -e 's/^ *//g')
newKey='xcat_'$keyName
eval $newKey=$value
done
# Remove the invokeScript.sh file after we have read it
rm -f invokeScript.sh
##########################################################################
# Handle creating a file system node
# Disk handler input parameters:
# action - "createfilesysnode"
# srcFile - location/name of the source file for the mknod command
# xcat_tgtFile - location/name of the target file for the mknod command
##########################################################################
if [[ $xcat_action == "createfilesysnode" ]]; then
echo "Creating a file system node, source: $xcat_srcFile, target: $xcat_tgtFile"
if [[ ! -n $xcat_srcFile ]]; then
echo "$funcName (Error) Source file for creating a file system node was not specified"
return
fi
if [[ ! -n $xcat_tgtFile ]]; then
echo "$funcName (Error) Target file for creating a file system node was not specified"
return
fi
if [[ -e $xcat_tgtFile ]]; then
echo "$funcName (Error) Target file for creating a file system node already exists"
return
fi
configFile='/etc/udev/rules.d/56-zfcp.rules'
# Create udev config file if not exist
if [[ ! -e $configFile ]]; then
touch $configFile
if [[ $os == rhel* ]]; then
echo "KERNEL==\"zfcp\", RUN+=\"/sbin/zfcpconf.sh\"" >> ${configFile}
echo "KERNEL==\"zfcp\", RUN+=\"/sbin/multipath -r\"" >> ${configFile}
fi
fi
tgtNode=$(echo ${xcat_tgtFile} | sed -e 's/^\/dev\///')
if [[ $os == sles* || $os == rhel* ]]; then
wwpn_lun=$(echo ${xcat_srcFile} | sed -e 's/^\/dev.*-zfcp-//')
wwpn=$(echo ${wwpn_lun} | sed -e 's/:0x.*//')
lun=$(echo ${wwpn_lun} | sed -e 's/^0x.*://')
else
wwpn_lun=$(echo ${xcat_srcFile} | sed -e 's/^\/dev.*-fc-//')
wwpn=$(echo ${wwpn_lun} | sed -e 's/-lun-.*//')
lun=$(echo ${wwpn_lun} | sed -e 's/^0x.*-lun-//')
fi
multipath=0
out=`echo $wwpn | grep ","`
if [[ -n "$out" ]]; then
multipath=1
fi
if [[ $os == sles* || $os == rhel* ]]; then
fcp=$(echo ${xcat_srcFile} | sed -e 's/^\/dev.*ccw-0.0.//' | sed -e 's/-zfcp-.*$//')
else
fcp=$(echo ${xcat_srcFile} | sed -e 's/^\/dev.*ccw-0.0.//' | sed -e 's/-fc-.*$//')
fi
oldIFS=$IFS
IFS=","
fcpList=($fcp)
for fcp in ${fcpList[@]}
do
if [[ $multipath == 1 ]]; then
# Find the name of the multipath device by arbitrary one path in the set
wwpnList=($wwpn)
for wwpn in ${wwpnList[@]}
do
if [[ ${wwpn:0:2} -ne "0x" ]]; then
wwpn="0x$wwpn"
fi
if [[ $os == sles* || $os == rhel* ]]; then
cur_wwpn_lun=${wwpn}:${lun}
srcFile=$(echo ${xcat_srcFile} | sed -e 's/-zfcp-.*//')"-zfcp-"$cur_wwpn_lun
srcFile=$(echo ${srcFile} | sed -e 's/ccw-.*-zfcp/ccw-0.0.'$fcp'-zfcp/')
else
cur_wwpn_lun=${wwpn}-lun-${lun}
srcFile=$(echo ${xcat_srcFile} | sed -e 's/-fc-.*//')"-fc-"$cur_wwpn_lun
srcFile=$(echo ${srcFile} | sed -e 's/ccw-.*-fc/ccw-0.0.'$fcp'-fc/')
fi
out=`/usr/bin/stat --printf=%n ${srcFile}`
if (( $? != 0 )); then
echo "$funcName (Error) Unable to stat the source file: $srcFile"
continue
fi
out=`/sbin/udevadm info --query=all --name=$srcFile | grep ID_SERIAL=`
devName=$(echo ${out} | sed -e 's/^E:\s//')
multipathUuid=$(echo $devName | sed -e 's/ID_SERIAL=//')
if [[ -n "$multipathUuid" ]]; then
break
fi
done
if [[ -z "$multipathUuid" ]]; then
echo "$funcName (Error) Building up multipath failed!"
return
fi
else
if [[ $os == sles* || $os == rhel* ]]; then
srcFile=$(echo ${xcat_srcFile} | sed -e 's/ccw-.*-zfcp/ccw-0.0.'$fcp'-zfcp/')
else
srcFile=$(echo ${xcat_srcFile} | sed -e 's/ccw-.*-zfcp/ccw-0.0.'$fcp'-fc/')
fi
out=`/usr/bin/stat --printf=%n ${srcFile}`
if (( $? != 0 )); then
echo "$funcName (Error) Unable to stat the source file: $xcat_srcFile"
return
fi
fi
done
IFS=$oldIFS
# Add the entry into udev config file
if [[ $multipath == 1 ]]; then
echo "KERNEL==\"dm*\", ENV{DM_UUID}==\"mpath-${multipathUuid}\", SYMLINK+=\"${tgtNode}\"" >> ${configFile}
udevadm control --reload
udevadm trigger --sysname-match=dm-*
else
echo "KERNEL==\"sd*\", ATTRS{wwpn}==\"${wwpn}\", ATTRS{fcp_lun}==\"${lun}\", SYMLINK+=\"${tgtNode}%n\"" >> ${configFile}
udevadm control --reload
udevadm trigger --sysname-match=sd*
fi
echo "$funcName successfully create the file system node ${xcat_tgtFile}"
##########################################################################
# Handle removing a file system node
# Disk file input parameters:
# action - "removefilesysnode"
# tgtFile - location/name of the target file for the mknod command
##########################################################################
elif [[ $xcat_action == "removefilesysnode" ]]; then
echo "Removing a file system node, target: $xcat_tgtFile"
if [[ ! -n $xcat_tgtFile ]]; then
echo "$funcName (Error) Target file for creating a file system node was not specified"
return
fi
configFile='/etc/udev/rules.d/56-zfcp.rules'
tgtNode=$(echo ${xcat_tgtFile} | sed -e 's/^\/dev\///')
sed -i -e /SYMLINK+=\"${tgtNode}%n\"/d ${configFile}
sed -i -e /SYMLINK+=\"${tgtNode}\"/d ${configFile}
udevadm control --reload
udevadm trigger --sysname-match=sd*
udevadm trigger --sysname-match=dm-*
echo "$funcName successfully remove the file system node ${xcat_tgtFile}"
##########################################################################
# Handle adding a SCSI volume
# Disk file input parameters:
# action - "addScsiVolume"
# fcpAddr - FCP device address
# wwpn - WWPN number
# lun - LUN number
##########################################################################
elif [[ $xcat_action == "addScsiVolume" ]]; then
echo "Adding a SCSI Volume, FCP addr: $xcat_fcpAddr, WWPN: $xcat_wwpn, LUN: $xcat_lun"
# Validate the input
if [[ ! -n $xcat_fcpAddr ]]; then
echo "$funcName (Error) FCP address was not specified"
return
fi
xcat_fcpAddr=`echo $xcat_fcpAddr | tr '[A-Z]' '[a-z]'`
if [[ ! -n $xcat_wwpn ]]; then
echo "$funcName (Error) WWPN was not specified"
return
fi
xcat_wwpn=`echo $xcat_wwpn | tr '[A-Z]' '[a-z]'`
if [[ ! -n $xcat_lun ]]; then
echo "$funcName (Error) LUN was not specified"
return
fi
xcat_lun=`echo $xcat_lun | tr '[A-Z]' '[a-z]'`
decimal_lun=$((16#${xcat_lun:0:4}))
# Online the device
oldIFS=$IFS
IFS=","
fcp_list=($xcat_fcpAddr)
for fcp in ${fcp_list[@]}
do
rc= onlineDevice $fcp
if (( rc != 0 )); then
return
fi
if [[ $os == sles12* ]]; then
out=`cat /boot/zipl/active_devices.txt | grep -i "0.0.$fcp"`
if [[ -z $out ]]; then
/sbin/zfcp_host_configure 0.0.$fcp 1
fi
elif [[ $os == sles11* ]]; then
/sbin/zfcp_host_configure 0.0.$fcp 1
elif [[ $os == ubuntu* ]]; then
/sbin/chzdev zfcp-host $fcp -e
fi
done
multipath=0
out=`echo $xcat_wwpn | grep ","`
if [[ -n "$out" ]]; then
multipath=1
fi
# Start multipathd service
if [[ $multipath == 1 ]]; then
if [[ $os == sles* ]]; then
insserv multipathd
elif [[ $os == rhel6* ]]; then
chkconfig multipathd on
else
systemctl enable multipathd
fi
modprobe dm-multipath
fi
for fcp in ${fcp_list[@]}
do
wwpn_list=($xcat_wwpn)
for wwpn in ${wwpn_list[@]}
do
# Set WWPN and LUN in sysfs
echo 0x$xcat_lun > /sys/bus/ccw/drivers/zfcp/0.0.$fcp/0x$wwpn/unit_add
# Set WWPN and LUN in configuration files
if [[ $os == sles* ]]; then
# SLES: /etc/udev/rules.d/51-zfcp*
/sbin/zfcp_disk_configure 0.0.$fcp $wwpn $xcat_lun 1
# Configure zFCP device to be persistent
touch /etc/udev/rules.d/51-zfcp-0.0.$fcp.rules
# Check if the file already contains the zFCP channel
out=`cat "/etc/udev/rules.d/51-zfcp-0.0.$fcp.rules" | egrep -i "ccw/0.0.$fcp]online"`
if [[ ! $out ]]; then
echo "ACTION==\"add\", SUBSYSTEM==\"ccw\", KERNEL==\"0.0.$fcp\", IMPORT{program}=\"collect 0.0.$fcp %k 0.0.$fcp zfcp\"" \
| tee -a /etc/udev/rules.d/51-zfcp-0.0.$fcp.rules
echo "ACTION==\"add\", SUBSYSTEM==\"drivers\", KERNEL==\"zfcp\", IMPORT{program}=\"collect 0.0.$fcp %k 0.0.$fcp zfcp\"" \
| tee -a /etc/udev/rules.d/51-zfcp-0.0.$fcp.rules
echo "ACTION==\"add\", ENV{COLLECT_0.0.$fcp}==\"0\", ATTR{[ccw/0.0.$fcp]online}=\"1\"" \
| tee -a /etc/udev/rules.d/51-zfcp-0.0.$fcp.rules
fi
echo "ACTION==\"add\", KERNEL==\"rport-*\", ATTR{port_name}==\"0x$wwpn\", SUBSYSTEMS==\"ccw\", KERNELS==\"0.0.$fcp\", ATTR{[ccw/0.0.$fcp]0x$wwpn/unit_add}=\"0x$xcat_lun\"" \
| tee -a /etc/udev/rules.d/51-zfcp-0.0.$fcp.rules
elif [[ $os == rhel* ]]; then
# RHEL: /etc/zfcp.conf
echo "0.0.$fcp 0x$wwpn 0x$xcat_lun" >> /etc/zfcp.conf
echo "add" > /sys/bus/ccw/devices/0.0.$fcp/uevent
elif [[ $os == ubuntu* ]]; then
# Ubuntu: chzdev zfcp-lun 0.0.$device:0x$wwpn:0x$lun -e
/sbin/chzdev zfcp-lun 0.0.$fcp:0x$wwpn:0x$xcat_lun -e
fi
# Settle the file system so when we are done the device is fully available
if [[ $(which udevadm 2> /dev/null) != '' ]]; then
udevadm settle
else
udevsettle
fi
if [[ $os == rhel* || $os == sles* ]]; then
if [[ ! -e "/dev/disk/by-path/ccw-0.0.${fcp}-zfcp-0x${wwpn}:0x${xcat_lun}" ]]; then
# Sometimes the file takes longer to appear. We will wait up to 3 minutes.
maxTime=0
for time in 1 2 2 5 10 10 30 60 60
do
if [[ -e "/dev/disk/by-path/ccw-0.0.${fcp}-zfcp-0x${wwpn}:0x${xcat_lun}" ]]; then
# Leave the loop now that the file exists
break
fi
maxTime=$maxTime+$time
echo "Sleeping for $time seconds to allow /dev/disk/by-path/ccw-0.0.${fcp}-zfcp-0x${wwpn}:0x${xcat_lun} to be created"
sleep $time
done
fi
if [[ ! -e "/dev/disk/by-path/ccw-0.0.${fcp}-zfcp-0x${wwpn}:0x${xcat_lun}" ]]; then
echo "/dev/disk/by-path/ccw-0.0.${fcp}-zfcp-0x${wwpn}:0x${xcat_lun} did not appear in $maxTime seconds, continuing."
fi
elif [[ $os == ubuntu* ]]; then
if [[ ! -e "/dev/disk/by-path/ccw-0.0.${fcp}-fc-0x${wwpn}-lun-${decimal_lun}" ]]; then
# Sometimes the file takes longer to appear. We will wait up to 3 minutes.
maxTime=0
for time in 1 2 2 5 10 10 30 60 60
do
if [[ -e "/dev/disk/by-path/ccw-0.0.${fcp}-fc-0x${wwpn}-lun-${decimal_lun}" ]]; then
# Leave the loop now that the file exists
break
fi
maxTime=$maxTime+$time
echo "Sleeping for $time seconds to allow /dev/disk/by-path/ccw-0.0.${fcp}-fc-0x${wwpn}-lun-${decimal_lun} to be created"
sleep $time
done
fi
if [[ ! -e "/dev/disk/by-path/ccw-0.0.${fcp}-fc-0x${wwpn}-lun-${decimal_lun}" ]]; then
echo "/dev/disk/by-path/ccw-0.0.${fcp}-fc-0x${wwpn}-lun-${decimal_lun} did not appear in $maxTime seconds, continuing."
fi
fi
done
done
IFS=$oldIFS
/sbin/multipath -r
echo "$funcName successfully create the SCSI volume"
##########################################################################
# Handle removing a SCSI volume
# Disk file input parameters:
# action - "removeScsiVolume"
# fcpAddr - FCP device address
# wwpn - WWPN number
# lun - LUN number
##########################################################################
elif [[ $xcat_action == "removeScsiVolume" ]]; then
echo "Removing a SCSI Volume, FCP addr: $xcat_fcpAddr, WWPN: $xcat_wwpn, LUN: $xcat_lun"
# Validate the input
if [[ ! -n $xcat_fcpAddr ]]; then
echo "$funcName (Error) FCP address was not specified"
return
fi
xcat_fcpAddr=`echo $xcat_fcpAddr | tr '[A-Z]' '[a-z]'`
if [[ ! -n $xcat_wwpn ]]; then
echo "$funcName (Error) WWPN was not specified"
return
fi
xcat_wwpn=`echo $xcat_wwpn | tr '[A-Z]' '[a-z]'`
if [[ ! -n $xcat_lun ]]; then
echo "$funcName (Error) LUN was not specified"
return
fi
xcat_lun=`echo $xcat_lun | tr '[A-Z]' '[a-z]'`
oldIFS=$IFS
IFS=","
fcp_list=($xcat_fcpAddr)
for fcp in ${fcp_list[@]}
do
wwpn_list=($xcat_wwpn)
for wwpn in ${wwpn_list[@]}
do
# Delete the SCSI device
scsiDevice=`lszfcp -l 0x$xcat_lun | grep 0x$wwpn | cut -d " " -f2`
if [[ -n $scsiDevice ]]; then
echo 1 > "/sys/bus/scsi/devices/$scsiDevice/delete"
fi
# Delete WWPN and LUN from sysfs
if [[ -e /sys/bus/ccw/drivers/zfcp/0.0.$fcp/0x$wwpn/unit_remove ]]; then
if [[ $(which udevadm 2> /dev/null) != '' ]]; then
udevadm settle
else
udevsettle
fi
echo 0x$xcat_lun > /sys/bus/ccw/drivers/zfcp/0.0.$fcp/0x$wwpn/unit_remove
fi
# Delete WWPN and LUN from configuration files
if [[ $os == sles11* || $os == sles12* ]]; then
# SLES: /etc/udev/rules.d/51-zfcp*
expression="/$xcat_lun/d"
sed --in-place -e $expression /etc/udev/rules.d/51-zfcp-0.0.$fcp.rules
elif [[ $os == rhel* ]]; then
# RHEL: /etc/zfcp.conf
expression="/$xcat_lun/d"
sed --in-place -e $expression /etc/zfcp.conf
elif [[ $os == ubuntu* ]]; then
# Ubuntu: chzdev zfcp-lun 0.0.$device:0x$wwpn:0x$lun -d
/sbin/chzdev zfcp-lun 0.0.$fcp:0x$wwpn:0x$xcat_lun -d
fi
done
done
IFS=$oldIFS
/sbin/multipath -W
/sbin/multipath -r
echo "$funcName successfully remove the SCSI volume"
###########################################################################
# Handle adding a mdisk based ephemeral disk.
# Disk file input parameters:
# action - "addMdisk"
# vaddr - virtual address of the minidisk
# filesys - Filesystem type
# mntdir - The directory that mount the mdisk to
##########################################################################
elif [[ $xcat_action == "addMdisk" ]]; then
echo "Adding a minidisk based ephemeral disk, Vaddr: $xcat_vaddr, Filesystem: $xcat_filesys mountpoint:$xcat_mntdir"
# Validate the input
if [[ ! -n $xcat_vaddr ]]; then
echo "$funcName (Error) Virtual address was not specified"
return
fi
xcat_vaddr=`echo $xcat_vaddr | tr '[A-Z]' '[a-z]'`
# Online the device
rc= onlineDevice $xcat_vaddr
if (( rc != 0 )); then
echo "$funcName (Error) fail to online the disk $xcat_vaddr"
return
fi
# Configure the added dasd to be persistent
echo "Permanently online the ephemeral disk"
if [[ $os == rhel* ]]; then
out=`cat "/etc/dasd.conf" | egrep -i $xcat_vaddr`
if [[ ! $out ]]; then
echo "0.0.$xcat_vaddr" >> /etc/dasd.conf
fi
elif [[ $os == sles* ]]; then
/sbin/dasd_configure 0.0.$xcat_vaddr 1
elif [[ $os == ubuntu16* ]]; then
touch /etc/sysconfig/hardware/config-ccw-0.0.$xcat_vaddr
else
echo "$funcName (Error) failed to permanently online the disk:$xcat_vaddr on os: $os, please check if $os is in the supported distribution list"
return
fi
# Mount the mdisk to the specified mount point
echo "Mounting the ephemeral disk $xcat_vaddr to directory $xcat_mntdir"
if [[ -d $xcat_mntdir ]]; then
rm -rf $xcat_mntdir
fi
mkdir -p $xcat_mntdir
cp /etc/fstab /etc/fstab.bak
out=`cat "/etc/fstab" | egrep -i "ccw-0.0.$xcat_vaddr"`
if [[ $out ]]; then
sed -i '/ccw-0.0.'"$xcat_vaddr"'/d' /etc/fstab
fi
if [[ $os == sles12* ]]; then
echo "/dev/disk/by-path/ccw-0.0.${xcat_vaddr}-part1 $xcat_mntdir $xcat_filesys defaults,nofail 0 0" >> /etc/fstab
else
echo "/dev/disk/by-path/ccw-0.0.${xcat_vaddr}-part1 $xcat_mntdir $xcat_filesys defaults 0 0" >> /etc/fstab
fi
out=`mount -a 2>&1`
if [[ "$out" ]]; then
echo "Fail to mount the disk $xcat_vaddr with reason $out"
mv /etc/fstab.bak /etc/fstab
mount -a
else
echo "The disk $xcat_vaddr has been mounted to $xcat_mntdir in format $xcat_filesys successfully"
fi
fi
return
}
############################################################################
# Main Code Section
############################################################################
# Get Linux version
getOsVersion
setupDisk $@
rm -f setupDisk

View File

@ -1,4 +1,5 @@
#!/bin/sh
#!/bin/bash
# IBM(c) 2013, 2015 EPL license http://www.eclipse.org/legal/epl-v10.html
### BEGIN INIT INFO
# Provides: xcatconf4z
@ -7,10 +8,11 @@
# Required-Start: $syslog
# Should-Start:
# Required-Stop:
# Short-Description: xCAT disk initialization and configuration
# Short-Description: A basic active engine used to initialize and configure vm.
# Description: Reads class x files from the reader and acts based on the type of file.
# Files of filetype "disk" cause SCSI disks be configured.
# Other files are used to generate an ISO9660 disk for transporting xCAT configurations.
# Generate an ISO9660 disk for cloud-init to handle openstack configurations.
# Files of filetype "disk" cause disks be configured. (deprecated)
# Other files are used to configure vm when it start up.
### END INIT INFO
###############################################################################
@ -20,6 +22,7 @@
# If nothing is specified then this function will not process any
# configuration files in the reader.
###############################################################################
version=3.0
authorizedSenders=''
function getOsVersion {
@ -80,7 +83,7 @@ function onlineDevice {
fi
rc=$(/sbin/chccwdev -e $device > /dev/null; echo $?)
if (( rc != 0 )); then
echo "xcatconf4z $funcName (Error) Could not activate the virtual reader"
echo "xcatconf4z $funcName (Error) Could not activate the virtual device $device"
return 1
fi
fi
@ -94,7 +97,8 @@ function pullReader {
# Drives special processing functions for files of a specific type.
# Files with a filetype of:
# tgz are unpacked into the transport directory
# disk files are read and cause the setupDisk function to be driven
# disk files are read and cause the setupDisk function to be driven (deprecated)
# doscript that contains a invokeScript.sh which will call the other script in it to do the speicial work
# all other files are unpacked into the transport directory
# @Input:
# None
@ -145,14 +149,26 @@ function pullReader {
# Receive the spool file
echo "Downloading record $spoolid: $file"
if [[ $type == "txt" ]] || [[ $type == "sh" ]]; then
if [[ $type == "txt" ]]; then
# Receiving text
rc=$(/usr/sbin/vmur re -t $spoolid $file)
rc=$(/usr/sbin/vmur re -f $spoolid $file)
elif [[ $type == "sh" ]]; then
# Receiving shell
rc=$(/usr/sbin/vmur re -f $spoolid $file)
/bin/bash $file
rm $file
elif [[ $type == "tgz" ]]; then
rc=$(/usr/sbin/vmur re $spoolid $file)
/bin/tar xzf $file -C $transportdir
rm $file
injectFiles
elif [[ $type == "doscript" ]]; then
rc=$(/usr/sbin/vmur re $spoolid $file)
/bin/tar xf $file -C $transportdir
rm $file
/bin/bash invokeScript.sh
elif [[ $type == "disk" ]]; then
echo 'disk file encountered and will be handled by the deprecated setupDisk function'
rc=$(/usr/sbin/vmur re $spoolid $file)
if (( rc == 0 )); then
setupDisk $transportdir'/'$file
@ -180,11 +196,15 @@ function setupIso {
# @Output:
# None
# @Code:
local funcName="setupIso"
iso="/var/opt/xcat/transport.iso"
# If there are files in the transport directory then create an ISO system.
if [ "$(ls -A .)" ]; then
/usr/bin/mkisofs -l -o $iso $transportdir
/usr/bin/mkisofs -l -V 'config-2' -o $iso $transportdir
if [ -e /tmp/znetconfig.sh ]; then
/bin/bash /tmp/znetconfig.sh
fi
fi
# If the ISO filesystem exists then create loop back device pointing
@ -350,7 +370,7 @@ function setupDisk {
/sbin/zfcp_host_configure 0.0.$xcat_fcpAddr 1
/sbin/zfcp_disk_configure 0.0.$xcat_fcpAddr $xcat_wwpn $xcat_lun 1
echo "0x$xcat_wwpn:0x$xcat_lun" >> /etc/sysconfig/hardware/hwcfg-zfcp-bus-ccw-0.0.$xcat_fcpAddr
elif [[ $os == sles* ]]; then
elif [[ $os == sles11* ]]; then
/sbin/zfcp_host_configure 0.0.$xcat_fcpAddr 1
/sbin/zfcp_disk_configure 0.0.$xcat_fcpAddr $xcat_wwpn $xcat_lun 1
@ -455,18 +475,115 @@ function setupDisk {
if [[ $os == sles10* ]]; then
expression="/$xcat_lun/d"
sed --in-place -e $expression /etc/sysconfig/hardware/hwcfg-zfcp-bus-ccw-0.0.$xcat_fcpAddr
elif [[ $os == sles* ]]; then
elif [[ $os == sles11* ]]; then
expression="/$xcat_lun/d"
sed --in-place -e $expression /etc/udev/rules.d/51-zfcp-0.0.$xcat_fcpAddr.rules
elif [[ $os == rhel* ]]; then
expression="/$xcat_lun/d"
sed --in-place -e $expression /etc/zfcp.conf
fi
fi
###########################################################################
# Handle adding a mdisk based ephemeral disk.
# Disk file input parameters:
# action - "addMdisk"
# vaddr - virtual address of the minidisk
# filesys - Filesystem type
# mntdir - The directory that mount the mdisk to
##########################################################################
elif [[ $xcat_action == "addMdisk" ]]; then
echo "Adding a minidisk based ephemeral disk, Vaddr: $xcat_vaddr, Filesystem: $xcat_filesys mountpoint:$xcat_mntdir"
# Validate the input
if [[ ! -n $xcat_vaddr ]]; then
echo "xcatconf4z $funcName (Error) Virtual address was not specified"
return
fi
xcat_vaddr=`echo $xcat_vaddr | tr '[A-Z]' '[a-z]'`
# Online the device
rc= onlineDevice $xcat_vaddr
if (( rc != 0 )); then
echo "xcatconf4z $funcName (Error) fail to online the disk $xcat_vaddr"
return
fi
# Configure the added dasd to be persistent
echo "Permenently online the ephemeral disk"
if [[ $os == rhel* ]]; then
out=`cat "/etc/dasd.conf" | egrep -i $xcat_vaddr`
if [[ ! $out ]]; then
echo "0.0.$xcat_vaddr" >> /etc/dasd.conf
fi
else
/sbin/dasd_configure 0.0.$xcat_vaddr 1
fi
# Mount the mdisk to the specified mount point
echo "Mounting the ephemeral disk $xcat_vaddr to directory $xcat_mntdir"
if [[ -d $xcat_mntdir ]]; then
rm -rf $xcat_mntdir
fi
mkdir -p $xcat_mntdir
cp /etc/fstab /etc/fstab.bak
out=`cat "/etc/fstab" | egrep -i "ccw-0.0.$xcat_vaddr"`
if [[ $out ]]; then
sed -i '/ccw-0.0.'"$xcat_vaddr"'/d' /etc/fstab
fi
echo "/dev/disk/by-path/ccw-0.0.${xcat_vaddr}-part1 $xcat_mntdir $xcat_filesys defaults 0 0" >> /etc/fstab
out=`mount -a 2>&1`
if [[ "$out" ]]; then
echo "Fail to mount the disk $xcat_vaddr with reason $out"
mv /etc/fstab.bak /etc/fstab
mount -a
else
echo "The disk $xcat_vaddr has been mounted to $xcat_mntdir in format $xcat_filesys successfully"
fi
fi
return
}
function injectFiles {
# @Description:
# Inject network files and scripts
# @Input:
# None
# @Output:
# None
# @Code:
local funcName="injectFiles"
if [[ ! -e $transportdir/openstack/latest/meta_data.json ]]; then
echo "Can not inject files, because no meta_data.json"
return
fi
echo "File injecting ...."
awk '{
#get inject files info
split($0 ,res1,/"files": \[/)
split(res1[2], res2, /\]/)
n=split(res2[1], res, /}, /)
for(m=1;m<=n;m++)
{
split(res[m], temp1, /{"path": "/)
k=split(temp1[2], temp2, /", "content_path": "/)
sub(/"}*$/, "", temp2[2])
#print temp2[1] " : " temp2[2]
des = dir "/openstack" temp2[2]
cmd = "cp " des " " temp2[1]
#print cmd
system(cmd)
}
}' dir=$transportdir <$transportdir/openstack/latest/meta_data.json
return
}
############################################################################
# Main Code Section
############################################################################
@ -483,13 +600,27 @@ case "$1" in
if [[ -n "$authorizedSenders" ]]; then
pullReader
echo "xcatconf4z has successfully processed the reader files."
else
echo "xcatconf4z is disabled from accepting configuration reader files."
fi
setupIso
;;
stop|status|restart|reload|force-reload)
;;
status)
if [[ -n "$authorizedSenders" ]]; then
echo "xcatconf4z is enabled to accept configuration reader files from: $authorizedSenders"
else
echo "xcatconf4z is disabled from accepting configuration reader files."
fi
;;
version)
echo "xcatconf4z version:" $version
;;
stop|restart|reload|force-reload)
# Do nothing
;;
esac

View File

@ -0,0 +1,14 @@
[Unit]
Description=Activation engine for configuring vm when it start up
Wants=local-fs.target NetworkManager.service
After=local-fs.target
Before=NetworkManager.service cloud-init-local.service
[Service]
Type=oneshot
ExecStart=/usr/bin/xcatconf4z start
StandardOutput=journal+console
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,13 @@
z/VM Toolkit
The list of resources related:
Files:
prep_zxcatIVP_*.pl
The prep_zxcatIVP_*.pl files are provided for each supported OpenStack release
that interacts with xCAT. These scripts end contain the name of the OpenStack
release that they support. The scripts scan the OpenStack configuration files
and produce a driver script which is used to validate the installation of the
OpenStack code with xCAT. For more information on the scripts, invoke the
help function for the individual script (operand --help).

View File

@ -0,0 +1,938 @@
#!/usr/bin/perl
###############################################################################
# (c) Copyright International Business Machines Corporation 2014.
# All Rights Reserved.
###############################################################################
# COMPONENT: prep_zxcatIVP_HAVANA.pl
#
# This is a preparation script for Installation Verification Program for xCAT
# on z/VM. It prepares the driver script by gathering information from
# OpenStack configuration files on the compute node.
###############################################################################
use strict;
#use warnings;
use Getopt::Long;
use Sys::Hostname;
use Socket;
my %cinderConf;
my %novaConf;
my %neutronConf;
my %ovsNeutronPluginIni;
my %neutronZvmPluginIni;
my $version = "1.1";
my $supportString = "Supports code based on the OpenStack Havana release.";
my $driver; # Name of driver file to be created less the ".pl"
my $driverLocation = "/opt/xcat/bin/"; # Location of the IVP program in xCAT MN.
my $driverPrefix = "zxcatIVPDriver_"; # Prefix used in naming the driver program.
my $displayHelp = 0; # Display help information.
my $ivp = "zxcatIVP.pl"; # z/VM xCAT IVP script name
my $obfuscatePw; # Obfuscate the PW in the driver file that is built
my $scan; # Type of scan to be performed
my $verbose; # Verbose flag - 0: quiet, 1: verbose
my $versionOpt = 0; # Shov version information.
my $localIpAddress; # Local IP address of system where we are prepping
# set the usage message
my $usage_string = "Usage:\n
$0\n
or\n
$0 -s serviceToScan -d driverProgramName\n
or\n
$0 --scan serviceToScan -driver driverProgramName\n
-s | --scan Services to scan ('all', 'nova' or 'neutron').\n
-d | --driver Name of driver program to construct.\n
--help Display help information.\n
-v Display script version information.\n
-V Display the verbose message\n";
#-------------------------------------------------------
=head3 buildDriverProgram
Description : Build or update the driver program with the
data obtained by the scans.
Arguments : None
Returns : 0 - No error
non-zero - Error detected.
Example : $rc = buildDriverProgram();
=cut
#-------------------------------------------------------
sub buildDriverProgram{
my $rc;
my @driverText;
if ( $verbose ) {
print "Building the IVP driver program.\n";
}
# Erase any existing driver program.
if ( -e $driver and ! -z $driver ) {
# Make certain the file is one of our driver files.
my $found = `grep 'Function: z/VM xCAT IVP driver program' $driver`;
if ( ! $found ) {
print "$driver is not a z/VM xCAT IVP driver program\n";
print "File will not be changed.\n";
return 251;
} else {
# Rename the existing driver file.
print "Existing driver file is being saved as $driver.old\n";
rename $driver,"$driver.old";
}
}
# Open the driver program for output.
$rc = open( my $fileHandle, '>', $driver ) or die;
if ( $rc != 1 ) {
print "Unable to open $driver for output: $!\n";
return ( 200 + $rc );
}
# Construct the file in an array.
push( @driverText, "#!/bin/bash" );
push( @driverText, "# IBM(c) 2014 EPL license http://www.eclipse.org/legal/epl-v10.html" );
push( @driverText, "" );
push( @driverText, "# Function: z/VM xCAT IVP driver program" );
push( @driverText, "# Built by $0 version $version." );
push( @driverText, "# $supportString" );
push( @driverText, "" );
push( @driverText, "############## Start of Nova Config Properties" );
if ( exists $novaConf{'DEFAULT'}{'my_ip'} ) {
push( @driverText, "" );
push( @driverText, "# IP address or hostname of the compute node that is accessing this xCAT MN." );
push( @driverText, "# From \'my_ip\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_cNAddress=\"$novaConf{'DEFAULT'}{'my_ip'}\"" );
} else {
push( @driverText, "" );
push( @driverText, "# IP address or hostname of the compute node that is accessing this xCAT MN." );
push( @driverText, "# From the local IP address of this system." );
push( @driverText, "export zxcatIVP_cNAddress=\"$localIpAddress\"" );
}
if ( exists $novaConf{'DEFAULT'}{'zvm_user_profile'} ) {
push( @driverText, "" );
push( @driverText, "# Default profile used in creation of server instances." );
push( @driverText, "# From \'zvm_user_profile\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_defaultUserProfile=\"$novaConf{'DEFAULT'}{'zvm_user_profile'}\"" );
}
if ( exists $novaConf{'DEFAULT'}{'zvm_diskpool'} ) {
push( @driverText, "" );
push( @driverText, "# Array of disk pools that are expected to exist." );
push( @driverText, "# From \'zvm_diskpool\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_diskpools=\"$novaConf{'DEFAULT'}{'zvm_diskpool'}\"" );
}
if ( exists $novaConf{'DEFAULT'}{'zvm_fcp_list'} ) {
push( @driverText, "" );
push( @driverText, "# The list of FCPs used by instances." );
push( @driverText, "# From \'zvm_fcp_list\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_instFCPList=\"$novaConf{'DEFAULT'}{'zvm_fcp_list'}\"" );
}
if ( exists $novaConf{'DEFAULT'}{'zvm_host'} ) {
push( @driverText, "" );
push( @driverText, "# Node of host being managed. If blank, IVP will search for the host node." );
push( @driverText, "# From \'zvm_host\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_hostNode=\"$novaConf{'DEFAULT'}{'zvm_host'}\"" );
}
if ( exists $novaConf{'DEFAULT'}{'zvm_xcat_master'} ) {
push( @driverText, "" );
push( @driverText, "# Node name for xCAT MN (optional)." );
push( @driverText, "# From \'zvm_xcat_master\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_mnNode=\"$novaConf{'DEFAULT'}{'zvm_xcat_master'}\"" );
}
if ( exists $novaConf{'DEFAULT'}{'zvm_xcat_password'} ) {
push( @driverText, "" );
if ( $obfuscatePw ) {
# Obfuscate the password so that it is not easily read.
# Currently not used due to GUI restrictions that modify the obfuscated password.
push( @driverText, "# User password defined to communicate with xCAT MN. Note: Password is hidden." );
push( @driverText, "export zxcatIVP_pw_obfuscated=1" );
push( @driverText, "# From \'zvm_xcat_password\' in /etc/nova/nova.conf." );
my @chars = split( //, $novaConf{'DEFAULT'}{'zvm_xcat_password'} );
my @newChars;
foreach my $char ( @chars ) {
$char = ~$char;
push( @newChars, $char );
}
my $hiddenPw = join( "", @newChars );
push( @driverText, "export zxcatIVP_xcatUserPw=\"$hiddenPw\"" );
} else {
push( @driverText, "# User password defined to communicate with xCAT MN." );
push( @driverText, "# From \'zvm_xcat_password\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_xcatUserPw=\"$novaConf{'DEFAULT'}{'zvm_xcat_password'}\"" );
}
}
if ( exists $novaConf{'DEFAULT'}{'zvm_xcat_server'} ) {
push( @driverText, "" );
push( @driverText, "# Expected IP address of the xcat MN" );
push( @driverText, "# From \'zvm_xcat_server\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_xcatMNIp=\"$novaConf{'DEFAULT'}{'zvm_xcat_server'}\"" );
}
if ( exists $novaConf{'DEFAULT'}{'zvm_xcat_username'} ) {
push( @driverText, "" );
push( @driverText, "# User defined to communicate with xCAT MN" );
push( @driverText, "# From \'zvm_xcat_username\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_xcatUser=\"$novaConf{'DEFAULT'}{'zvm_xcat_username'}\"" );
}
if ( exists $novaConf{'DEFAULT'}{'zvm_zhcp_fcp_list'} ) {
push( @driverText, "" );
push( @driverText, "# The list of FCPs used by zHCP." );
push( @driverText, "# From \'zvm_zhcp_fcp_list\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_zhcpFCPList=\"$novaConf{'DEFAULT'}{'zvm_zhcp_fcp_list'}\"" );
}
push( @driverText, "" );
push( @driverText, "# Expected space available in the xCAT MN image repository" );
push( @driverText, "# From \'xcat_free_space_threshold\' in /etc/nova/nova.conf." );
push( @driverText, "export zxcatIVP_expectedReposSpace=\"$novaConf{'DEFAULT'}{'xcat_free_space_threshold'}G\"" );
push( @driverText, "" );
push( @driverText, "############## End of Nova Config Properties" );
push( @driverText, "" );
push( @driverText, "############## Start of Neutron Config Properties" );
if ( exists $neutronConf{'DEFAULT'}{'base_mac'} ) {
my $prefix = $neutronConf{'DEFAULT'}{'base_mac'};
$prefix =~ tr/://d;
$prefix = substr( $prefix, 0, 6 );
push( @driverText, "" );
push( @driverText, "# User prefix for MAC Addresses of Linux level 2 interfaces" );
push( @driverText, "# From \'base_mac\' in /etc/neutron/neutron.conf." );
push( @driverText, "export zxcatIVP_macPrefix=\"$prefix\"" );
}
if ( exists $neutronZvmPluginIni{'agent'}{'xcat_mgt_ip'} ) {
push( @driverText, "" );
push( @driverText, "# xCat MN's address on the xCAT management network" );
push( @driverText, "# From \'xcat_mgt_ip\' in /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini." );
push( @driverText, "export zxcatIVP_xcatMgtIp=\"$neutronZvmPluginIni{'agent'}{'xcat_mgt_ip'}\"" );
}
if ( exists $neutronZvmPluginIni{'agent'}{'xcat_mgt_mask'} ) {
push( @driverText, "" );
push( @driverText, "# xCat management interface netmask" );
push( @driverText, "# From \'xcat_mgt_mask\' in /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini." );
push( @driverText, "export zxcatIVP_mgtNetmask=\"$neutronZvmPluginIni{'agent'}{'xcat_mgt_mask'}\"" );
}
if ( exists $ovsNeutronPluginIni{'ovs'}{'network_vlan_ranges'} ) {
push( @driverText, "" );
push( @driverText, "# Array of networks and possible VLAN ranges" );
push( @driverText, "# From \'network_vlan_ranges\' in /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini." );
push( @driverText, "export zxcatIVP_networks=\"$ovsNeutronPluginIni{'ovs'}{'network_vlan_ranges'}\"" );
}
if ( exists $neutronZvmPluginIni{'agent'}{'xcat_zhcp_nodename'} ) {
push( @driverText, "" );
push( @driverText, "# Node name for xCAT zHCP server" );
push( @driverText, "# From \'xcat_zhcp_nodename\' in /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini." );
push( @driverText, "export zxcatIVP_zhcpNode=\"$neutronZvmPluginIni{'agent'}{'xcat_zhcp_nodename'}\"" );
}
# Create the zxcatIVP_vswitchOSAs variable for any networks specified with an rdev list.
my $vswitchOSAs = '';
foreach my $section (sort keys %neutronZvmPluginIni) {
next if ( $section eq 'agent');
foreach my $property ( keys %{ $neutronZvmPluginIni{$section} } ) {
next if ( $property ne "rdev_list" );
my $list = $neutronZvmPluginIni{$section}{$property};
$list =~ s/^\s+|\s+$//g; # trim blanks from both ends of the list
next if ( $list eq '' );
$list =~ s/\s+/\,/g; # insert comma between words
$vswitchOSAs = "$section $list $vswitchOSAs";
}
}
if ( defined $vswitchOSAs ) {
push( @driverText, "" );
push( @driverText, "# Vswitches and their related OSAs" );
push( @driverText, "# From \'rdev_list\' in vswitch sections of /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini." );
push( @driverText, "export zxcatIVP_vswitchOSAs=\"$vswitchOSAs\"" );
}
push( @driverText, "" );
push( @driverText, "############## End of Neutron Config Properties" );
push( @driverText, "" );
push( @driverText, "# Name of user under which nova runs, default is nova." );
push( @driverText, "# If you system is different then change this property." );
push( @driverText, "export zxcatIVP_expUser=\"nova\"" );
push( @driverText, "" );
push( @driverText, "# Controls whether Warnings/Errors detected by the IVP are" );
push( @driverText, "# logged in the xCAT MN syslog, 0: do not log, 1: log to syslog." );
push( @driverText, "export zxcatIVP_syslogErrors=1" );
push( @driverText, "" );
push( @driverText, "perl $driverLocation$ivp" );
# Write the array to the driver file.
foreach (@driverText) {
#print "$_\n";
print $fileHandle "$_\n"; # Print each entry in our array to the file
}
close $fileHandle;
print "$driver was built.\n";
}
#-------------------------------------------------------
=head3 hashFile
Description : Read a file with equal signs designating
key value pairs and create a hash from it.
Arguments : File to read
Reference to hash that should be constructed.
Returns : 0 - No error
non-zero - Error detected.
Example : $rc = hashFile( $file, \%novaConf, 1 );
=cut
#-------------------------------------------------------
sub hashFile{
my ( $file, $hash, $required ) = @_;
my $section = "null";
my $caseInsensitive = 1; # assume section/properties are case insensitive
my @parts;
if ( !-e $file ) {
if ( $required ) {
print "Warning: $file does not exist.\n";
} else {
print "Info: $file does not exist.\n";
}
return 601;
}
if ( $file =~ /.conf$/ ) {
# File is case sensitive, translate sections and property names to uppercase.
$caseInsensitive = 0;
}
# Read the configuration file and construct the hash of values.
my $out = `egrep -v '(^#|^\\s*\\t*#)' $file`;
my @lines = split( "\n", $out );
foreach my $line ( @lines ) {
if ( $line =~ /^\[/ ) {
# Section header line
$line =~ s/^\s+|\s+$//g; # trim blanks from both ends of the line
$line =~ s/^\[+|\]+$//g; # trim [] from ends of the line
if ( $caseInsensitive ) {
$section = lc( $line );
} else {
$section = $line;
}
} else {
# Property line
@parts = split( "=", $line );
next if ( ! exists $parts[0] );
$parts[0] =~ s/^\s+|\s+$//g; # trim both ends of the string
next if ( length( $parts[0] ) == 0 );
if ( $caseInsensitive ) {
$parts[0] = lc( $parts[0] );
}
if ( exists $parts[1] ) {
chomp( $parts[1] );
$parts[1] =~ s/^\s+|\s+$//g; # trim both ends of the string
} else {
$parts[1] = '';
}
$$hash{$section}{$parts[0]} = $parts[1];
#print "$section $parts[0]" . ": " . $parts[1]. "\n";
#print $parts[0] . ": " . $$hash{$section}{$parts[0]}. "\n";
}
}
return 0;
}
#-------------------------------------------------------
=head3 scanCinder
Description : Scan the cinder configuration files.
Arguments : None
Returns : 0 - No error
non-zero - Error detected.
Example : $rc = scanCinder();
=cut
#-------------------------------------------------------
sub scanCinder{
my $rc;
if ( $verbose ) {
print "Scanning the Cinder configuration files.\n";
}
# Read the configuration file and construct the hash of values.
my $file = '/etc/cinder/cinder.conf';
$rc = hashFile( $file, \%cinderConf, 0 );
return $rc;
}
#-------------------------------------------------------
=head3 scanNeutron
Description : Scan the neutron configuration files.
Arguments : None
Returns : 0 - No error
non-zero - Error detected.
Example : $rc = scanNeutron();
=cut
#-------------------------------------------------------
sub scanNeutron{
my $rc;
if ( $verbose ) {
print "Scanning the Neutron configuration files.\n";
}
# Read the configuration file and construct the hash of values.
my $file = '/etc/neutron/neutron.conf';
$rc = hashFile( $file, \%neutronConf, 1 );
# Read the configuration file and construct the hash of values.
$file = '/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini';
$rc = hashFile( $file, \%ovsNeutronPluginIni, 1 );
# Read the configuration file and construct the hash of values.
$file = '/etc/neutron/plugins/zvm/neutron_zvm_plugin.ini';
$rc = hashFile( $file, \%neutronZvmPluginIni, 1 );
return $rc;
}
#-------------------------------------------------------
=head3 scanNova
Description : Scan the Nova configuration files.
Arguments : None.
Returns : 0 - No error
non-zero - Error detected.
Example : $rc = scanNova();
=cut
#-------------------------------------------------------
sub scanNova{
my $rc;
if ( $verbose ) {
print "Scanning the Nova configuration files.\n";
}
# Verify the /etc/nova/nova.conf exists.
my $file = '/etc/nova/nova.conf';
$rc = hashFile( $file, \%novaConf, 1 );
return $rc;
}
#-------------------------------------------------------
=head3 showHelp
Description : Show the help inforamtion.
Arguments : None.
Returns : None.
Example : showHelp();
=cut
#-------------------------------------------------------
sub showHelp{
print "$0 prepares and builds a z/VM xCAT IVP driver program
using the information from the configuration files in the
compute node. The default name of the driver program is
'$driverPrefix' following by the IP address of the
system where the driver is being prepared and ending with
'.sh'.
$supportString
The following files are scanned for input:
/etc/cinder/cinder.conf
/etc/nova/nova.conf
/etc/neutron/neutron.conf
/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
/etc/neutron/plugins/zvm/neutron_zvm_plugin.ini
The constructed driver program can then be uploaded to
the xCAT MN and used to validate the configuration between
the compute node and xCAT.\n\n";
print $usage_string;
return;
}
#-------------------------------------------------------
=head3 validateConfigs
Description : Compare and validate the configuration
values obtained by the scans.
Arguments : None.
Returns : 0 - No error
non-zero - Error detected.
Example : $rc = validateConfigs();
=cut
#-------------------------------------------------------
sub validateConfigs{
my $rc = 0;
my $option;
if ( $verbose ) {
print "Performing a local validation of the configuration files.\n";
}
#*******************************************************
# Verify required configuration options were specified.
#*******************************************************
if ( keys %cinderConf ) {
my @requiredCinderOpts = ();
foreach $option ( @requiredCinderOpts ) {
if ( !exists $cinderConf{'DEFAULT'}{$option} ) {
#print "option:$option.\nvalue:$cinderConf{$option}\n";
print "Warning: \'$option\' is missing from section \'DEFAULT\'\n" .
" in /etc/cinder/cinder.conf.\n";
}
}
}
my @requiredNovaOpts = (
"compute_driver",
"config_drive_format",
"force_config_drive",
"host",
'instance_name_template',
'zvm_diskpool',
'zvm_host',
'zvm_user_profile',
'zvm_xcat_master',
'zvm_xcat_server',
'zvm_xcat_username',
'zvm_xcat_password',
);
foreach $option ( @requiredNovaOpts ) {
if ( !exists $novaConf{'DEFAULT'}{$option} ) {
#print "option:$option.\nvalue:$novaConf{$option}\n";
print "Warning: \'$option\' is missing from section \'DEFAULT\'\n" .
" in /etc/nova/nova.conf.\n";
}
}
my @requiredNeutronConfOpts = (
'base_mac',
'core_plugin',
);
foreach $option ( @requiredNeutronConfOpts ) {
if ( !exists $neutronConf{'DEFAULT'}{$option} ) {
print "Warning: \'$option\' is missing from section \'DEFAULT\'\n" .
" in /etc/neutron/neutron.conf.\n";
}
}
my @requiredOvsNeutronPluginIniOpts = (
'network_vlan_ranges',
'tenant_network_type',
);
foreach $option ( @requiredOvsNeutronPluginIniOpts ) {
if ( !exists $ovsNeutronPluginIni{'ovs'}{$option} ) {
print "Warning: \'$option\' is missing from section \'ovs\'\n" .
" in /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini.\n";
}
}
my @requiredNeutronZvmPluginIniOpts = (
"zvm_xcat_server",
);
foreach $option ( @requiredNeutronZvmPluginIniOpts ) {
if ( !exists $neutronZvmPluginIni{'agent'}{$option} ) {
print "Warning: \'$option\' is missing from section \'agent\'\n" .
" in /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini.\n";
}
}
#******************************************
# Verify optional operands were specified.
#******************************************
if ( keys %cinderConf ) {
if ( !exists $cinderConf{'DEFAULT'}{'san_ip'} and
!exists $cinderConf{'DEFAULT'}{'san_private_key'} and
!exists $cinderConf{'DEFAULT'}{'storwize_svc_connection_protocol'} and
!exists $cinderConf{'DEFAULT'}{'storwize_svc_volpool_name'} and
!exists $cinderConf{'DEFAULT'}{'storwize_svc_vol_iogrp'} and
!exists $cinderConf{'DEFAULT'}{'volume_driver'} ) {
print "Info: z/VM specific Cinder keys are not defined in section \'DEFAULT\'\n" .
" in /etc/cinder/cinder.conf. Cinder support for creation of persistent\n" .
" disks for z/VM is not enabled. Further testing of these options will\n" .
" not occur in this script.\n"
} else {
my %optionalCinderConfOpts = (
"san_ip" => "This property is necessary when using persistent disks obtained\n" .
" from the Cinder service.",
"san_private_key" => "This property is necessary when using persistent disks obtained\n" .
" from the Cinder service.",
"storwize_svc_connection_protocol" => "This property is necessary when using persistent disks obtained\n" .
" from the Cinder service.",
"storwize_svc_volpool_name" => "This property is necessary when using persistent disks obtained\n" .
" from the Cinder service.",
'storwize_svc_vol_iogrp' => "This property is necessary when using persistent disks obtained\n" .
" from the Cinder service.",
'volume_driver' => "This property is necessary when using persistent disks obtained\n" .
" from the Cinder service.",
);
my %defaultCinderConfOpts = ();
foreach my $key ( keys %optionalCinderConfOpts ) {
if ( !exists $cinderConf{'DEFAULT'}{$key} ) {
print "Info: \'$key\' is missing from section \'DEFAULT\'\n" .
" in /etc/cinder/cinder.conf.\n";
if ( $optionalCinderConfOpts{$key} ne '' ) {
print " " . $optionalCinderConfOpts{$key} . "\n";
}
if ( exists $defaultCinderConfOpts{$key} ) {
$cinderConf{'DEFAULT'}{$key} = $defaultCinderConfOpts{$key};
}
}
}
}
}
my %optionalNovaConfOpts = (
"image_cache_manager_interval" => "Default of 2400 (seconds) will be used.",
"ram_allocation_ratio" => "",
"rpc_response_timeout" => "zVM Live migration may timeout with the default " .
"value (60 seconds).\n The recommended value for z/VM is 180 to allow " .
"zVM live migration\n to succeed.",
"xcat_free_space_threshold" => "Default of 50 (G) will be used.",
"xcat_image_clean_period" => "Default of 30 (days) will be used.",
"zvm_config_drive_inject_password" => "This value will default to 'FALSE'.",
'zvm_diskpool_type' => "This value will default to \'ECKD\'.",
"zvm_fcp_list" => "Persistent disks cannot be attached to server instances.",
"zvm_zhcp_fcp_list" => "",
"zvm_image_tmp_path" => "Defaults to '/var/lib/nova/images'.",
"zvm_reachable_timeout" => "Default of 300 (seconds) will be used.",
"zvm_scsi_pool" => "Default of \'xcatzfcp\' will be used.",
"zvm_vmrelocate_force" => "",
"zvm_xcat_connection_timeout" => "Default of 3600 seconds will be used.",
);
my %defaultNovaConfOpts = (
"xcat_free_space_threshold" => 50,
"xcat_image_clean_period" => 30,
'zvm_diskpool_type' => 'ECKD',
"zvm_scsi_pool" => "xcatzfcp",
);
foreach my $key ( keys %optionalNovaConfOpts ) {
if ( !exists $novaConf{'DEFAULT'}{$key} ) {
print "Info: \'$key\' is missing from section \'DEFAULT\'\n" .
" in /etc/nova/nova.conf.\n";
if ( $optionalNovaConfOpts{$key} ne '' ) {
print " " . $optionalNovaConfOpts{$key} . "\n";
}
if ( exists $defaultNovaConfOpts{$key} ) {
$novaConf{'DEFAULT'}{$key} = $defaultNovaConfOpts{$key};
}
}
}
my %optionalNeutronConfOpts = ();
my %defaultNeutronConfOpts = ();
foreach my $key ( keys %optionalNeutronConfOpts ) {
if ( !exists $neutronConf{'DEFAULT'}{$key} ) {
print "Info: \'$key\' is missing from section \'DEFAULT\'\n" .
" in /etc/neutron/neutron.conf.\n";
if ( $optionalNeutronConfOpts{$key} ne '' ) {
print " " . $optionalNeutronConfOpts{$key} . "\n";
}
if ( exists $defaultNeutronConfOpts{$key} ) {
$neutronConf{'DEFAULT'}{$key} = $defaultNeutronConfOpts{$key};
}
}
}
my %optionalOvsNeutronPluginIniOpts = ();
my %defaultOvsNeutronPluginIniOpts = ();
foreach my $key ( keys %optionalOvsNeutronPluginIniOpts ) {
if ( !exists $ovsNeutronPluginIni{'agent'}{$key} ) {
print "Info: \'$key\' is missing from section \'agent\'\n" .
" in /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini.\n";
if ( $optionalOvsNeutronPluginIniOpts{$key} ne '' ) {
print " " . $optionalOvsNeutronPluginIniOpts{$key} . "\n";
}
if ( exists $defaultOvsNeutronPluginIniOpts{'agent'}{$key} ) {
$ovsNeutronPluginIni{'agent'}{$key} = $defaultOvsNeutronPluginIniOpts{$key};
}
}
}
my %optionalNeutronZvmPluginIniOpts = (
"xcat_mgt_ip" => "This property is necessary when deploying virtual server " .
"instances that\n do NOT have public IP addresses.",
"xcat_mgt_mask" => "This property is necessary when deploying virtual server " .
"instances that\n do NOT have public IP addresses.",
"polling_interval" => "A default value of \'2\' will be used.",
"xcat_zhcp_nodename" => "A default value of \'zhcp\' will be used.",
"zvm_xcat_password" => "A default value of \'admin\' is used.",
"zvm_xcat_timeout" => "A default value of 300 seconds is used.",
"zvm_xcat_username" => "A default value of \'admin\' is used.",
);
my %defaultNeutronZvmPluginIniOpts = (
"polling_interval" => 2,
"xcat_zhcp_nodename" => "zhcp",
"zvm_xcat_password" => "admin",
"zvm_xcat_timeout" => 300,
"zvm_xcat_username" => "admin",
);
foreach my $key ( keys %optionalNeutronZvmPluginIniOpts ) {
if ( !exists $neutronZvmPluginIni{'agent'}{$key} ) {
print "Info: \'$key\' is missing from section \'agent\'\n" .
" in /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini.\n";
if ( $optionalNeutronZvmPluginIniOpts{$key} ne '' ) {
print " " . $optionalNeutronZvmPluginIniOpts{$key} . "\n";
}
if ( exists $defaultNeutronZvmPluginIniOpts{'agent'}{$key} ) {
$neutronZvmPluginIni{'agent'}{$key} = $defaultNeutronZvmPluginIniOpts{$key};
}
}
}
# Verify xCAT users are the same.
if ( !exists $novaConf{'DEFAULT'}{'zvm_xcat_username'} ) {
print "Info: Bypassing validation of 'zvm_xcat_username'.\n" .
" It is not specified in /etc/nova/nova.conf.\n";
} elsif ( !exists $neutronZvmPluginIni{'agent'}{'zvm_xcat_username'} ) {
print "Info: Bypassing validation of 'zvm_xcat_username'.\n" .
" It is not specified in /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini.\n";
} else {
if ( $novaConf{'DEFAULT'}{'zvm_xcat_username'} ne $neutronZvmPluginIni{'agent'}{'zvm_xcat_username'} ) {
print "Warning: xCAT user names mismatch; review 'zvm_xcat_username':\n" .
" \'$novaConf{'DEFAULT'}{'zvm_xcat_username'}\' in /etc/nova/nova.conf.\n" .
" \'$neutronZvmPluginIni{'agent'}{'zvm_xcat_username'}\' in\n" .
" /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini.\n";
}
}
# Verify xCAT user passwords are the same.
if ( !exists $novaConf{'DEFAULT'}{'zvm_xcat_password'} ) {
print "Info: Bypassing validation of 'zvm_xcat_password'.\n" .
" It is not specified in /etc/nova/nova.conf.\n";
} elsif ( !exists $neutronZvmPluginIni{'agent'}{'zvm_xcat_password'} ) {
print "Info: Bypassing validation of 'zvm_xcat_password'. It is not specified\n" .
" in /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini.\n";
} else {
if ( $novaConf{'DEFAULT'}{'zvm_xcat_password'} ne $neutronZvmPluginIni{'agent'}{'zvm_xcat_password'} ) {
print "Warning: xCAT user passwords are not the same:\n" .
" Please review 'zvm_xcat_password' in /etc/nova/nova.conf and\n" .
" /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini.\n";
}
}
# Verify the xcat server IP addresses are the same.
if ( !exists $novaConf{'DEFAULT'}{'zvm_xcat_server'} ) {
print "Info: Bypassing validation of 'zvm_xcat_server'.\n" .
" It is not specified in /etc/nova/nova.conf.\n";
} elsif ( !exists $neutronZvmPluginIni{'agent'}{'zvm_xcat_server'} ) {
print "Info: Bypassing validation of 'zvm_xcat_server'.\n" .
" It is not specified in /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini.\n";
} else {
if ( $novaConf{'DEFAULT'}{'zvm_xcat_server'} ne $neutronZvmPluginIni{'agent'}{'zvm_xcat_server'} ) {
print "Warning: xCAT server addresses mismatch; review 'zvm_xcat_server':\n" .
" \'$novaConf{'DEFAULT'}{'zvm_xcat_server'}\' in /etc/nova/nova.conf.\n" .
" \'$neutronZvmPluginIni{'agent'}{'zvm_xcat_server'}\' in /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini.\n";
}
}
# Verify the instance name template is valid
if ( exists $novaConf{'DEFAULT'}{'instance_name_template'} ) {
# Use sprintf which is close enough to the python % support for formatting to construct a sample.
my $base_name = sprintf( $novaConf{'DEFAULT'}{'instance_name_template'}, 1 );
if ( length( $base_name ) > 8 ) {
print "Warning: In /etc/nova/nova.conf, section \`DEFAULT\`, instance_name_template would\n" .
" construct a value greater than 8 in length: \'$novaConf{'DEFAULT'}{'instance_name_template'}\'.\n";
}
if ( $novaConf{'DEFAULT'}{'instance_name_template'} =~ /(^RSZ)/ or $novaConf{'DEFAULT'}{'instance_name_template'} =~ /(^rsz)/ ) {
print "Warning: In /etc/nova/nova.conf, instance_name_template begins\n" .
" with 'RSZ' or 'rsz': \'$novaConf{'DEFAULT'}{'instance_name_template'}\'\n";
}
}
# Verify the compute_driver is for z/VM
if ( exists $novaConf{'DEFAULT'}{'compute_driver'} ) {
if ( $novaConf{'DEFAULT'}{'compute_driver'} ne "nova.virt.zvm.ZVMDriver" and
$novaConf{'DEFAULT'}{'compute_driver'} ne "zvm.ZVMDriver") {
print "Warning: In /etc/nova/nova.conf, compute_driver does not contain the\n" .
" expected value of \'zvm.ZVMDriver\' and instead contains:\n" .
" \'$novaConf{'DEFAULT'}{'compute_driver'}\'\n";
}
}
# Check whether the rpc timeout is too small for z/VM
if ( exists $novaConf{'DEFAULT'}{'rpc_response_timeout'} ) {
if ( $novaConf{'DEFAULT'}{'rpc_response_timeout'} < 180 ) {
print "Warning: In /etc/nova/nova.conf, section \'DEFAULT\', rpc_response_timeout\n" .
" specifies a value, \'$novaConf{'DEFAULT'}{'rpc_response_timeout'}\', which is " .
"less than the recommended value\n of \'180\'.\n";
}
}
# Verify all SCSI disk operands are specified, if one exists.
if ( exists $novaConf{'DEFAULT'}{'zvm_fcp_list'} or exists $novaConf{'DEFAULT'}{'zvm_zhcp_fcp_list'} ) {
if ( !exists $novaConf{'DEFAULT'}{'zvm_fcp_list'} ) {
print "Warning: In /etc/nova/nova.conf, \'zvm_fcp_list\' does not exist but\n" .
" but other SCSI disk related operands exist. Both should be \'\n" .
" specified: \'zvm_fcp_list\' and \'zvm_zhcp_fcp_list\'\n";
}
if ( !exists $novaConf{'DEFAULT'}{'zvm_zhcp_fcp_list'} ) {
print "Warning: In /etc/nova/nova.conf, \'zvm_zhcp_fcp_list\' does not exist but\n" .
" but other SCSI disk related operands exist. Both should be \'\n" .
" specified: \'zvm_fcp_list\' and \'zvm_zhcp_fcp_list\'\n";
}
}
# Verify any rdev_list in Neutron z/VM Plugin ini file contains a single value and/or not a comma
foreach my $section (sort keys %neutronZvmPluginIni) {
next if ( $section eq 'agent');
foreach my $property ( keys %{ $neutronZvmPluginIni{$section} } ) {
next if ( $property ne "rdev_list" );
my $list = $neutronZvmPluginIni{$section}{$property};
$list =~ s/^\s+|\s+$//g; # trim blanks from both ends of the list
if ( $list eq '' ) {
print "Warning: In /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini, section \'$section\',\n" .
" \'rdev_list\' is specified but has no value.\n";
} else {
my @vals = split ( /\s/, $list );
if ( $#vals > 0 ) {
# $#vals is array size - 1.
print "Warning: In /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini, section \'$section\',\n" .
" \'rdev_list\' contains too many values.\n";
}
foreach my $op ( @vals ) {
if ( $op =~ m/[^0-9a-fA-F]+/ ) {
print "Warning: In /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini, section \'$section\',\n" .
" \'rdev_list\' contains non-hexadecimal characters: \'$op\'.\n";
} elsif ( length($op) > 4 ) {
print "Warning: In /etc/neutron/plugins/zvm/neutron_zvm_plugin.ini, section \'$section\',\n" .
" \'rdev_list\' contains a value that is not 1-4 characters in\n" .
" length: \'$op\'.\n";
}
}
}
}
}
# Check whether the storwize_svc_connection_protocol is not 'FC' for z/VM
if ( exists $cinderConf{'DEFAULT'}{'storwize_svc_connection_protocol'} ) {
if ( $cinderConf{'DEFAULT'}{'storwize_svc_connection_protocol'} ne 'FC' ) {
print "Warning: In /etc/cinder/cinder.conf, section \'DEFAULT\',\n" .
" storwize_svc_connection_protocol specifies a value, " .
"\'$cinderConf{'DEFAULT'}{'storwize_svc_connection_protocol'}\',\n" .
" which is not the required value of \'FC\'.\n";
}
}
# Check whether the storwize_svc_connection_protocol is not 'FC' for z/VM
if ( exists $cinderConf{'DEFAULT'}{'volume_driver'} ) {
if ( $cinderConf{'DEFAULT'}{'volume_driver'} ne 'cinder.volume.drivers.zvm.storwize_svc.StorwizeSVCZVMDriver' ) {
print "Warning: In /etc/cinder/cinder.conf, section \'DEFAULT\', volume_driver specifies\n" .
" a value, \'$cinderConf{'DEFAULT'}{'volume_driver'}\',\n which is " .
"not the required value of\n \'cinder.volume.drivers.zvm.storwize_svc.StorwizeSVCZVMDriver\'.\n";
}
}
return;
}
#*****************************************************************************
# Main routine
#*****************************************************************************
my $rc = 0;
my $clearPwOpt;
my $obfuscateOpt;
# Parse the arguments
$Getopt::Long::ignorecase = 0;
Getopt::Long::Configure( "bundling" );
if (!GetOptions( 's|scan=s' => \$scan,
'd|driver=s' => \$driver,
'h|help' => \$displayHelp,
#'c' => \$clearPwOpt,
#'o' => \$obfuscateOpt,
'v' => \$versionOpt,
'V' => \$verbose )) {
print $usage_string;
goto FINISH;
}
if ( $versionOpt ) {
print "Version: $version\n";
print "$supportString\n";
}
if ( $displayHelp ) {
showHelp();
}
if ( $displayHelp or $versionOpt ) {
goto FINISH;
}
$localIpAddress = inet_ntoa((gethostbyname(hostname))[4]);
if ( defined( $scan ) ) {
if ( $verbose ) {
print "Operand --scan: $scan\n";
}
if ( 'all nova neutron' !~ $scan ) {
print "--scan operand($scan) is not all, nova or neutron\n";
$rc = 400;
goto FINISH;
}
} else {
$scan = 'all';
}
if ( defined( $driver ) ) {
if ( $verbose ) {
print "Operand --driver: $driver\n";
}
$driver = "$driver.sh";
} else {
$driver = "$driverPrefix$localIpAddress.sh";
}
if ( $scan =~ 'all' or $scan =~ 'nova' ) {
!( $rc = scanNova() ) or goto FINISH;
}
if ( $scan =~ 'all' or $scan =~ 'cinder' ) {
scanCinder();
}
if ( $scan =~ 'all' or $scan =~ 'neutron' ) {
!( $rc = scanNeutron() ) or goto FINISH;
}
#if ( $obfuscateOpt ) {
# print "obfuscateOpt: $obfuscateOpt\n";
# $obfuscatePw = 1;
#} elsif ( $clearPwOpt ) {
# $obfuscatePw = 0;
#}
!( $rc = validateConfigs() ) or goto FINISH;
!( $rc = buildDriverProgram() ) or goto FINISH;
FINISH:
exit $rc;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -18,23 +18,38 @@ AutoReqProv: no
%define fsm %(if [ "$fsm" = "1" ];then echo 1; else echo 0; fi)
# Define local variable from environment variable
%define pcm %(if [ "$pcm" = "1" ];then echo 1; else echo 0; fi)
%define notpcm %(if [ "$pcm" = "1" ];then echo 0; else echo 1; fi)
%define s390x %(if [ "$s390x" = "1" ];then echo 1; else echo 0; fi)
%define nots390x %(if [ "$s390x" = "1" ];then echo 0; else echo 1; fi)
# Define a different location for various httpd configs in s390x mode
%define httpconfigdir %(if [ "$s390x" = "1" ];then echo "xcathttpdsave"; else echo "xcat"; fi)
# AIX will build with an arch of "ppc"
# also need to fix Requires for AIX
%ifos linux
BuildArch: noarch
Requires: perl-IO-Socket-SSL perl-XML-Simple perl-XML-Parser perl-Digest-SHA1 perl(LWP::Protocol::https)
# Note: ifarch/ifnarch does not work for noarch package, use environment variable instead
%if %s390x
Requires: perl-IO-Socket-SSL perl-XML-Simple perl-XML-Parser
%else
Requires: perl-IO-Socket-SSL perl-XML-Simple perl-XML-Parser perl-Digest-SHA1 perl(LWP::Protocol::https) perl-Net-HTTPS-NB perl-HTTP-Async
%endif
Obsoletes: atftp-xcat
%endif
# The aix rpm cmd forces us to do this outside of ifos type stmts
%if %notpcm
%ifos linux
#
# PCM does not use or ship grub2-xcat
Requires: grub2-xcat perl-Net-HTTPS-NB perl-HTTP-Async
#%endif
%if %nots390x
Requires: grub2-xcat
%endif
%endif
%endif
@ -313,7 +328,7 @@ mkdir -p $RPM_BUILD_ROOT/etc/init.d
cp etc/init.d/xcatd $RPM_BUILD_ROOT/etc/init.d
%endif
#TODO: the next has to me moved to postscript, to detect /etc/xcat vs /etc/opt/xcat
mkdir -p $RPM_BUILD_ROOT/etc/xcat
mkdir -p $RPM_BUILD_ROOT/etc/%httpconfigdir
mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/doc/packages/xCAT-server
cp LICENSE.html $RPM_BUILD_ROOT/%{prefix}/share/doc/packages/xCAT-server
@ -324,7 +339,7 @@ chmod 644 $RPM_BUILD_ROOT/%{prefix}/share/doc/packages/xCAT-server/*
mkdir -p $RPM_BUILD_ROOT/%{prefix}/ws
mkdir -p $RPM_BUILD_ROOT/etc/apache2/conf.d
mkdir -p $RPM_BUILD_ROOT/etc/httpd/conf.d
mkdir -p $RPM_BUILD_ROOT/etc/xcat/conf.orig
mkdir -p $RPM_BUILD_ROOT/etc/%httpconfigdir/conf.orig
cp xCAT-wsapi/* $RPM_BUILD_ROOT/%{prefix}/ws
@ -336,18 +351,18 @@ rm -f $RPM_BUILD_ROOT/%{prefix}/ws/xcatws.cgi
%if %fsm
%else
echo "ScriptAlias /xcatrhevh %{prefix}/ws/xcatrhevh.cgi" > $RPM_BUILD_ROOT/etc/xcat/conf.orig/xcat-ws.conf.apache22
echo "ScriptAlias /xcatrhevh %{prefix}/ws/xcatrhevh.cgi" > $RPM_BUILD_ROOT/etc/xcat/conf.orig/xcat-ws.conf.apache24
echo "ScriptAlias /xcatrhevh %{prefix}/ws/xcatrhevh.cgi" > $RPM_BUILD_ROOT/etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache22
echo "ScriptAlias /xcatrhevh %{prefix}/ws/xcatrhevh.cgi" > $RPM_BUILD_ROOT/etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache24
%if %notpcm
echo "ScriptAlias /xcatws %{prefix}/ws/xcatws.cgi" >> $RPM_BUILD_ROOT/etc/xcat/conf.orig/xcat-ws.conf.apache22
echo "ScriptAlias /xcatws %{prefix}/ws/xcatws.cgi" >> $RPM_BUILD_ROOT/etc/xcat/conf.orig/xcat-ws.conf.apache24
echo "ScriptAlias /xcatws %{prefix}/ws/xcatws.cgi" >> $RPM_BUILD_ROOT/etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache22
echo "ScriptAlias /xcatws %{prefix}/ws/xcatws.cgi" >> $RPM_BUILD_ROOT/etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache24
%endif
cat $RPM_BUILD_ROOT/%{prefix}/ws/xcat-ws.conf.apache22 >> $RPM_BUILD_ROOT/etc/xcat/conf.orig/xcat-ws.conf.apache22
cat $RPM_BUILD_ROOT/%{prefix}/ws/xcat-ws.conf.apache24 >> $RPM_BUILD_ROOT/etc/xcat/conf.orig/xcat-ws.conf.apache24
cat $RPM_BUILD_ROOT/%{prefix}/ws/xcat-ws.conf.apache22 >> $RPM_BUILD_ROOT/etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache22
cat $RPM_BUILD_ROOT/%{prefix}/ws/xcat-ws.conf.apache24 >> $RPM_BUILD_ROOT/etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache24
#install lower version(<2.4) apache/httpd conf files by default
cp $RPM_BUILD_ROOT/etc/xcat/conf.orig/xcat-ws.conf.apache22 $RPM_BUILD_ROOT/etc/apache2/conf.d/xcat-ws.conf
cp $RPM_BUILD_ROOT/etc/xcat/conf.orig/xcat-ws.conf.apache22 $RPM_BUILD_ROOT/etc/httpd/conf.d/xcat-ws.conf
cp $RPM_BUILD_ROOT/etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache22 $RPM_BUILD_ROOT/etc/apache2/conf.d/xcat-ws.conf
cp $RPM_BUILD_ROOT/etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache22 $RPM_BUILD_ROOT/etc/httpd/conf.d/xcat-ws.conf
%endif
@ -362,12 +377,12 @@ rm -rf $RPM_BUILD_ROOT
%defattr(-,root,root)
#%doc LICENSE.html
%{prefix}
/etc/xcat
/etc/%httpconfigdir
%if %fsm
%else
/etc/init.d/xcatd
#/etc/xcat/conf.orig/xcat-ws.conf.apache24
#/etc/xcat/conf.orig/xcat-ws.conf.apache22
#/etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache24
#/etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache22
/etc/apache2/conf.d/xcat-ws.conf
/etc/httpd/conf.d/xcat-ws.conf
%endif
@ -434,19 +449,19 @@ fi
if [ -n "$(httpd -v 2>&1 |grep -e '^Server version\s*:.*\/2.4')" ]
then
rm -rf /etc/httpd/conf.d/xcat-ws.conf
cp /etc/xcat/conf.orig/xcat-ws.conf.apache24 /etc/httpd/conf.d/xcat-ws.conf
cp /etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache24 /etc/httpd/conf.d/xcat-ws.conf
fi
if [ -n "$(apachectl -v 2>&1 |grep -e '^Server version\s*:.*\/2.4')" ]
then
rm -rf /etc/apache2/conf.d/xcat-ws.conf
cp /etc/xcat/conf.orig/xcat-ws.conf.apache24 /etc/apache2/conf.d/xcat-ws.conf
cp /etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache24 /etc/apache2/conf.d/xcat-ws.conf
fi
if [ -n "$(apache2ctl -v 2>&1 |grep -e '^Server version\s*:.*\/2.4')" ]
then
rm -rf /etc/apache2/conf.d/xcat-ws.conf
cp /etc/xcat/conf.orig/xcat-ws.conf.apache24 /etc/apache2/conf.d/xcat-ws.conf
cp /etc/%httpconfigdir/conf.orig/xcat-ws.conf.apache24 /etc/apache2/conf.d/xcat-ws.conf
fi
exit 0

View File

@ -0,0 +1,13 @@
LoadModule rewrite_module /usr/lib64/apache2-prefork/mod_rewrite.so
# Redirect all http request to https
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTPS} !=on
RewriteRule ^/?xcatws/(.*) https://%{SERVER_NAME}/xcatws/$1 [R,L]
<Files xcatws.cgi>
Order allow,deny
Allow from all
</Files>

View File

@ -1,8 +1,10 @@
LoadModule rewrite_module /usr/lib64/apache2-prefork/mod_rewrite.so
# Redirect all http request to https
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} xcatws
RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [R,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^/?xcatws/(.*) https://%{SERVER_NAME}/xcatws/$1 [R,L]
<Files xcatws.cgi>
Order allow,deny

View File

@ -1,8 +1,8 @@
LoadModule rewrite_module /usr/lib64/apache2-prefork/mod_rewrite.so
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} xcatws
RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [R,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^/?xcatws/(.*) https://%{SERVER_NAME}/xcatws/$1 [R,L]
<Files xcatws.cgi>
Require all granted

View File

@ -0,0 +1,4 @@
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTPS} !=on
RewriteRule ^/?xcatws/(.*) https://%{SERVER_NAME}/xcatws/$1 [R,L]