Compare commits
199 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ca7cc188a0 | |||
| f7d1f6c17b | |||
| 06e6eb38ae | |||
| 61540b6d43 | |||
| 87fc929900 | |||
| 9aa68aa497 | |||
| 37ccddadf6 | |||
| f0a8697c62 | |||
| 0ad769155e | |||
| 54a98d30c1 | |||
| bfacd0f253 | |||
| 243d2b7434 | |||
| 17598cf257 | |||
| a504b0f45b | |||
| bb6bbbb4e4 | |||
| d48717fdc7 | |||
| 76701f2a02 | |||
| 45d3f869a9 | |||
| 8dde7b2e89 | |||
| ae7398e33f | |||
| b7d3c4732f | |||
| 06703120e0 | |||
| f947c49b9f | |||
| 471a104632 | |||
| 3a3568d1cc | |||
| 7a467bcb1b | |||
| 5894a5dbca | |||
| e274591a1b | |||
| d6c92d6753 | |||
| 9fd5e2c095 | |||
| 2c266e9ac9 | |||
| 17c516e885 | |||
| 918f0b520c | |||
| 417606b01a | |||
| 0d4e736b6d | |||
| a3b3656ed8 | |||
| 4691f35799 | |||
| b24d5bdda4 | |||
| 3c327578e4 | |||
| 908fdf8429 | |||
| 54c2870408 | |||
| a8e96b90e6 | |||
| 15f6241aeb | |||
| 4b4ffe1441 | |||
| bbefb20cb7 | |||
| b701bed5f1 | |||
| 43681ede40 | |||
| 014b82f976 | |||
| 7a2c5dca1e | |||
| 0fa1ebf7a8 | |||
| bda289858d | |||
| ae1fc3d297 | |||
| cba796dd8d | |||
| 1068c2db5b | |||
| 3c0e4ebf57 | |||
| 481b70c330 | |||
| d378feca92 | |||
| 147b7b2ced | |||
| 5c946182b5 | |||
| 6229cea13f | |||
| 4eacb904a1 | |||
| 5dd913d220 | |||
| 5c278f3396 | |||
| fb152e9131 | |||
| f2f8b983c3 | |||
| 47454dba0e | |||
| b75e2139a8 | |||
| 66d5ac4091 | |||
| b672c8ea08 | |||
| a3adbd7669 | |||
| 53d70830f5 | |||
| 293fe015ce | |||
| 73c420eefc | |||
| 1fcadbd9f4 | |||
| 5e3832753f | |||
| 66cab13065 | |||
| 8ac69f0630 | |||
| e7168c2d00 | |||
| 3795edd2a8 | |||
| 7e4fa98e00 | |||
| ee1521f080 | |||
| 66ca2f0003 | |||
| 3e3be8425b | |||
| 991e039470 | |||
| 32c39eb1e9 | |||
| 966e66e9e3 | |||
| 5b71f2638a | |||
| 5065feab5a | |||
| d18e7d8646 | |||
| 0b4e207e73 | |||
| b9bee92289 | |||
| a5cf74fa66 | |||
| c764fe725c | |||
| 862f1459a1 | |||
| e7e8a28f7f | |||
| 580ffb203f | |||
| 7beb515aa0 | |||
| 69e6dd69cf | |||
| 58dc9496cf | |||
| c02119ea54 | |||
| b979de76b6 | |||
| 210239303c | |||
| 5487553e41 | |||
| 63497743c7 | |||
| cd2cb8112e | |||
| 3c862b2451 | |||
| b148e997e9 | |||
| 1b9e2b16cf | |||
| e40f69e508 | |||
| b60378d8e4 | |||
| f910d5bab8 | |||
| 899cb5028d | |||
| 7a5fa1df0e | |||
| 5a52fb253d | |||
| 44452f4cd8 | |||
| d3a9856f9d | |||
| 9f39989eb4 | |||
| bafbe2361a | |||
| 2a44f59f15 | |||
| 437c8a4863 | |||
| ab2f4e9dfd | |||
| e574664a50 | |||
| 742f8b611b | |||
| 2dc79ab397 | |||
| 1f377385a0 | |||
| 9b5f66ba3c | |||
| 8a2f7bc617 | |||
| db3c98cffe | |||
| 5e85167b7b | |||
| f48da3fc64 | |||
| 0c29a9c630 | |||
| dbbed4ef1f | |||
| 54af542d35 | |||
| 321e6696f8 | |||
| f1472b029d | |||
| d3d959d0e2 | |||
| 6ef42b3ae8 | |||
| bca4a317f4 | |||
| db70dcfaa3 | |||
| a292d019d6 | |||
| c976cb43a1 | |||
| 357baafde0 | |||
| 92aedad727 | |||
| b6658bd232 | |||
| 37ceb9fc13 | |||
| 1f8574c8fc | |||
| de8815cb0b | |||
| fd2055c51c | |||
| 543b2d23af | |||
| 6ec9da5de7 | |||
| 76d749c270 | |||
| 103f32d2a2 | |||
| 8311ef3f4d | |||
| 8ec332fbc4 | |||
| e397ebaeac | |||
| 39c9881cc1 | |||
| ef3653559f | |||
| befcde6768 | |||
| e3517ad904 | |||
| bd774c768f | |||
| 4bcc4e2dbc | |||
| 15b679b907 | |||
| ccccc1e743 | |||
| 76a8941cbc | |||
| 16ecce4057 | |||
| ceb6370771 | |||
| 1039462c44 | |||
| 0b999b2888 | |||
| 43998b11e2 | |||
| 70e64d8b68 | |||
| f56d9b0c12 | |||
| c3129c1701 | |||
| 2bd823ec59 | |||
| c616532194 | |||
| 50322fae7d | |||
| 990b282fc7 | |||
| b8cacc08b5 | |||
| 641b6c7aa9 | |||
| 2000a8c562 | |||
| 6a50b11ffc | |||
| 137e201aba | |||
| 5fa4bdb407 | |||
| f2f22c029d | |||
| 9394d1bb66 | |||
| 212e4ef603 | |||
| acd44f27ee | |||
| 77dcec5195 | |||
| 672fab87a9 | |||
| 8f9350ed61 | |||
| ed3b0046da | |||
| f9f111fd08 | |||
| abfd87772a | |||
| a00a818197 | |||
| 2bcd1f152c | |||
| 9b152fedd7 | |||
| 10680eb9db | |||
| 5451c4eb59 | |||
| 564ded27a4 | |||
| 22b4999589 |
+1
-1
@@ -53,7 +53,7 @@ for i in $*; do
|
||||
done
|
||||
|
||||
# Supported distributions
|
||||
dists="maverick natty oneiric precise saucy"
|
||||
dists="maverick natty oneiric precise saucy trusty"
|
||||
|
||||
c_flag= # xcat-core (trunk-delvel) path
|
||||
d_flag= # xcat-dep (trunk) path
|
||||
|
||||
@@ -85,6 +85,7 @@ function makexcat {
|
||||
cd `dirname $0`/$RPMNAME
|
||||
tar --exclude .svn -czf $RPMROOT/SOURCES/license.tar.gz LICENSE.html
|
||||
cp xcat.conf $RPMROOT/SOURCES
|
||||
cp xcat.conf.apach24 $RPMROOT/SOURCES
|
||||
cp xCATSN $RPMROOT/SOURCES
|
||||
cd - >/dev/null
|
||||
elif [ "$RPMNAME" = "xCAT-buildkit" ]; then
|
||||
|
||||
@@ -48,7 +48,7 @@ binary-arch: build install
|
||||
chmod 644 `pwd`/debian/perl-xcat/opt/xcat/share/doc/man5/*
|
||||
chmod 644 `pwd`/debian/perl-xcat/opt/xcat/share/man/man7/*
|
||||
chmod 644 `pwd`/debian/perl-xcat/opt/xcat/share/doc/man7/*
|
||||
./modifyUtils `cat ../Version` `svn info | grep Revision | cut -d" " -f 2`
|
||||
./modifyUtils `cat ../Version` `git log -n 1 | head -n 1 | cut -f 2 -d ' '`
|
||||
# dh_installmenu
|
||||
# dh_installdebconf
|
||||
# dh_installlogrotate
|
||||
|
||||
+125
-2
@@ -500,6 +500,7 @@ sub setCFMPkglistFile {
|
||||
Arguments:
|
||||
$imagename - the specified linuximage name
|
||||
@curospkgs - the currently selected OS packages list
|
||||
$mode - using Fuzzy Matching or Exact Matching to check packages
|
||||
Returns:
|
||||
0 - update successfully
|
||||
1 - update failed
|
||||
@@ -509,13 +510,22 @@ sub setCFMPkglistFile {
|
||||
none
|
||||
Example:
|
||||
my $ret = CAT::CFMUtils->updateCFMPkglistFile($imagename, @cur_selected_pkgs);
|
||||
my $ret = CAT::CFMUtils->updateCFMPkglistFile($imagename, @cur_selected_pkgs, 1);
|
||||
|
||||
=cut
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
sub updateCFMPkglistFile {
|
||||
my ($class, $img, $ospkgs) = @_;
|
||||
|
||||
my ($class, $img, $ospkgs, $mode) = @_;
|
||||
|
||||
if(defined($mode)){
|
||||
# Exact Matching
|
||||
$mode = 1;
|
||||
}else {
|
||||
# Fuzzy Matching
|
||||
$mode = 0;
|
||||
}
|
||||
|
||||
my @cur_selected = @$ospkgs;
|
||||
my $cfmpkglist = "/install/osimages/$img/pkglist.cfm";
|
||||
|
||||
@@ -549,6 +559,14 @@ sub updateCFMPkglistFile {
|
||||
my @selected = @$selected_ref;
|
||||
@basepkgs = xCAT::CFMUtils->arrayops("U", \@basepkgs, \@selected);
|
||||
}
|
||||
|
||||
# Fuzzy Matching
|
||||
if (not $mode){
|
||||
my ($ref1, $ref2, $ref3) = xCAT::CFMUtils->updateSelectedPkgs(\@pre_selected, \@pre_removed, \@cur_selected);
|
||||
@pre_selected = @$ref1;
|
||||
@pre_removed = @$ref2;
|
||||
@cur_selected = @$ref3;
|
||||
}
|
||||
|
||||
# get diff between previous and current selected OS packages lists
|
||||
my @diff = xCAT::CFMUtils->getPkgsDiff(\@pre_selected, \@cur_selected);
|
||||
@@ -661,6 +679,48 @@ sub getPreOSpkgsList {
|
||||
return (\@selected, \@removed);
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
=head3 getPreBaseOSpkgsList
|
||||
Get previously selected and removed base OS packages lists from pkglist file. Packages named with "example.xxx" should be the base name "example"
|
||||
|
||||
Arguments:
|
||||
$ospkglist - the path for ospkglist file
|
||||
Returns:
|
||||
refs for selected and removed OS packages arrays
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
my $pre_selected_ref = xCAT::CFMUtils->getPreOSpkgsList($ospkglist);
|
||||
|
||||
=cut
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
sub getPreBaseOSpkgsList {
|
||||
my ($class, $pkglist) = @_;
|
||||
|
||||
my ($pre_selected_ref, $pre_removed_ref) = xCAT::CFMUtils->getPreOSpkgsList($pkglist);
|
||||
|
||||
my %pre_selected_hash = ();
|
||||
foreach (@$pre_selected_ref) {
|
||||
my @names = split(/\./, $_);
|
||||
my $basename = $names[0];
|
||||
|
||||
if ($_ =~ /^$basename\.([^\.]+)$/) {
|
||||
$pre_selected_hash{$basename} = 1;
|
||||
}else {
|
||||
$pre_selected_hash{$_} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
my @pre_selected = keys %pre_selected_hash;
|
||||
|
||||
return \@pre_selected;
|
||||
}
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
=head3 getPkgsDiff
|
||||
@@ -819,3 +879,66 @@ sub arrayops {
|
||||
|
||||
#return (\@union, \@intersection, \@difference);
|
||||
}
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
=head3 updateSelectedPkgs
|
||||
Update previous selected, previous removed and current selected packages based on fuzzy matching rules. Packages named with "example.i686" should be same with package "example"
|
||||
|
||||
Arguments:
|
||||
\@pre_selected - reference to previous selected packages
|
||||
\@pre_removed - reference to previous removed packages
|
||||
\@cur_selected - reference to current selected packages
|
||||
Returns:
|
||||
new previous selected, previous removed, current selected packages
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
my ($ref1, $ref2, $ref3) = xCAT::CFMUtils->arrayops(\@pre_selected, \@pre_removed, \@cur_selected);
|
||||
|
||||
=cut
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
sub updateSelectedPkgs() {
|
||||
my ($class, $pre_selected_ref, $pre_removed_ref, $cur_selected_ref) = @_;
|
||||
|
||||
my %pre_selected_hash = map{$_ => 1} @$pre_selected_ref;
|
||||
my %pre_removed_hash = map{$_ => 1} @$pre_removed_ref;
|
||||
my %cur_selected_hash = map{$_ => 1} @$cur_selected_ref;
|
||||
|
||||
my %new_pre_selected_hash = %pre_selected_hash;
|
||||
my %new_pre_removed_hash = %pre_removed_hash;
|
||||
my %new_cur_selected_hash = %cur_selected_hash;
|
||||
|
||||
foreach (keys %cur_selected_hash) {
|
||||
my $father = $_;
|
||||
my $flag = 0;
|
||||
foreach (keys %pre_selected_hash) {
|
||||
my $child = $_;
|
||||
if ($child =~ /^$father\.([^\.]+)$/) {
|
||||
$new_cur_selected_hash{$child} = 1;
|
||||
$flag = 1;
|
||||
}
|
||||
}
|
||||
if ($flag and not exists $pre_selected_hash{$father}){
|
||||
delete $new_cur_selected_hash{$father} if exists $new_cur_selected_hash{$father};
|
||||
}
|
||||
|
||||
foreach (keys %pre_removed_hash) {
|
||||
my $child = $_;
|
||||
if ($child =~ /^$father\.([^\.]+)$/) {
|
||||
delete $new_pre_removed_hash{$child} if exists $new_pre_removed_hash{$child};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
my @new_cur_selected = keys %new_cur_selected_hash;
|
||||
my @new_pre_selected = keys %new_pre_selected_hash;
|
||||
my @new_pre_removed = keys %new_pre_removed_hash;
|
||||
|
||||
|
||||
return (\@new_pre_selected, \@new_pre_removed, \@new_cur_selected);
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ if ($inet6support) {
|
||||
|
||||
if ($^O =~ /^linux/i) {
|
||||
# Is IPv6 enabled on the MN or xcat client node at all?
|
||||
my $ipv6enabled = `ip addr | grep inet6`;
|
||||
my $ipv6enabled = `ip addr 2> /dev/null | grep inet6`;
|
||||
if (!$ipv6enabled) {
|
||||
$inet6support = 0;
|
||||
}
|
||||
|
||||
@@ -264,7 +264,7 @@ sub temp {
|
||||
# No frame commands for IVM
|
||||
#################################
|
||||
if ( $hwtype eq "ivm" ) {
|
||||
push @result, [$name,"$prefix Not available (No BPA)",1];
|
||||
push @result, [$name,"$prefix Not available (No BPA)",0];
|
||||
next;
|
||||
}
|
||||
#################################
|
||||
@@ -272,14 +272,14 @@ sub temp {
|
||||
#################################
|
||||
if ( @$d[4] !~ /^(fsp|lpar|cec)$/ ) {
|
||||
my $text = "$prefix Only available for CEC/LPAR";
|
||||
push @result, [$name,$text,1];
|
||||
push @result, [$name,$text,0];
|
||||
next;
|
||||
}
|
||||
#################################
|
||||
# Error - No frame
|
||||
#################################
|
||||
if ( $mtms eq "0" ) {
|
||||
push @result, [$name,"$prefix Not available (No BPA)",1];
|
||||
push @result, [$name,"$prefix Not available (No BPA)",0];
|
||||
next;
|
||||
}
|
||||
#################################
|
||||
@@ -352,7 +352,7 @@ sub rackenv {
|
||||
#################################
|
||||
if ( @$d[4] !~ /^(bpa|frame)$/ ) {
|
||||
my $text = "$prefix Only available for BPA/Frame";
|
||||
push @result, [$name,$text,1];
|
||||
push @result, [$name,$text,0];
|
||||
next;
|
||||
}
|
||||
|
||||
|
||||
+15
-4
@@ -53,6 +53,7 @@ my %param_list_map = (
|
||||
'vmcpus' => 'part_get_lpar_processing',
|
||||
'vmmemory' => 'part_get_lpar_memory',
|
||||
'vmphyslots' => 'part_get_all_io_bus_info',
|
||||
'del_physlots' => 'part_get_all_io_bus_info',
|
||||
'vmnics' => 'part_get_all_vio_info',
|
||||
'vmstorage' => 'part_get_all_vio_info',
|
||||
'del_vadapter' => 'part_get_all_vio_info'
|
||||
@@ -62,7 +63,7 @@ sub chvm_parse_extra_options {
|
||||
my $args = shift;
|
||||
my $opt = shift;
|
||||
# Partition used attributes #
|
||||
my @support_ops = qw(vmcpus vmmemory vmphyslots vmothersetting vmstorage vmnics del_vadapter);
|
||||
my @support_ops = qw(vmcpus vmmemory vmphyslots vmothersetting vmstorage vmnics del_vadapter del_physlots);
|
||||
if (ref($args) ne 'ARRAY') {
|
||||
return "$args";
|
||||
}
|
||||
@@ -94,7 +95,13 @@ sub chvm_parse_extra_options {
|
||||
if ($value !~ /^\d+$/) {
|
||||
return "Invalid param '$value', only one slot id can be specified";
|
||||
}
|
||||
|
||||
} elsif ($cmd eq "del_physlots") {
|
||||
my @tmp_array = split ",",$value;
|
||||
foreach (@tmp_array) {
|
||||
unless (/(0x\w{8})/) {
|
||||
return "'$_' is invalid";
|
||||
}
|
||||
}
|
||||
} elsif ($cmd eq "vmothersetting") {
|
||||
if ($value =~ /hugepage:\s*(\d+)/i) {
|
||||
$opt->{huge_page} = $1;
|
||||
@@ -797,7 +804,7 @@ sub do_op_extra_cmds {
|
||||
$action = "set_huge_page";
|
||||
} elsif ($op eq "vmcpus") {
|
||||
$action = "part_set_lpar_pending_proc";
|
||||
} elsif ($op eq "vmphyslots") {
|
||||
} elsif ($op eq "vmphyslots" or $op eq "del_physlots") {
|
||||
$action = "set_io_slot_owner_uber";
|
||||
} elsif ($op eq "del_vadapter") {
|
||||
$action = "part_clear_vslot_config";
|
||||
@@ -885,7 +892,11 @@ sub do_op_extra_cmds {
|
||||
}
|
||||
my $tmp_value = ($param eq '*') ? $name : $param;
|
||||
xCAT::MsgUtils->verbose_message($request, "$request->{command} $action for node:$name, parm:$tmp_value.");
|
||||
my $value = xCAT::FSPUtils::fsp_api_action($request, $name, $d, $action, 0, $tmp_value);
|
||||
my @tmpd = @$d;
|
||||
if ($op eq "del_physlots") {
|
||||
@tmpd[0] = "-1";
|
||||
}
|
||||
my $value = xCAT::FSPUtils::fsp_api_action($request, $name, \@tmpd, $action, 0, $tmp_value);
|
||||
if (@$value[1] && ((@$value[1] =~ /Error/i) && (@$value[2] ne '0'))) {
|
||||
return ([[$name, @$value[1], '1']]) ;
|
||||
} else {
|
||||
|
||||
@@ -217,14 +217,13 @@ sub is_me
|
||||
#my ($b1, $b2, $b3, $b4) = split /\./, $nameIP;
|
||||
|
||||
# get all the possible IPs for the node I'm running on
|
||||
my $ifcmd = "ifconfig -a | grep 'inet'";
|
||||
my $result = xCAT::Utils->runcmd($ifcmd, -1, 1);
|
||||
my $ipcmd = "ip addr | grep 'inet'";
|
||||
my $result = xCAT::Utils->runcmd($ipcmd, -1, 1);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $rsp;
|
||||
# push @{$rsp->{data}}, "Could not run $ifcmd.\n";
|
||||
# xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
$::VERBOSE = $verb;
|
||||
my $str="Error running ipcmd";
|
||||
xCAT::MsgUtils->message("S", $str);
|
||||
$::VERBOSE = $verb;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -232,7 +231,6 @@ sub is_me
|
||||
{
|
||||
my ($inet, $myIP, $str) = split(" ", $int);
|
||||
chomp $myIP;
|
||||
$myIP =~ s/addr://;
|
||||
$myIP =~ s/\/.*//; # ipv6 address 4000::99/64
|
||||
$myIP =~ s/\%.*//; # ipv6 address ::1%1/128
|
||||
|
||||
|
||||
@@ -1240,6 +1240,12 @@ sub ping_server{
|
||||
$msg[3] = "Status: ping return code now on stack\n";
|
||||
$newstate[3] = 4;
|
||||
|
||||
# get the timeout for ping test
|
||||
my $to4pt;
|
||||
if ( $ENV{TIMEOUT4PINGTEST} =~ /^\d+$/ ) {
|
||||
$to4pt = ",$ENV{TIMEOUT4PINGTEST}";
|
||||
}
|
||||
|
||||
#IPv6
|
||||
if ( $server_ip =~ /:/ ) {
|
||||
#::1, calculate link local address
|
||||
@@ -1249,9 +1255,9 @@ sub ping_server{
|
||||
} else {
|
||||
$linklocal_ip = $client_ip;
|
||||
}
|
||||
$cmd[3] = "ping $full_path_name:ipv6,$server_ip,$linklocal_ip,$gateway_ip\r";
|
||||
$cmd[3] = "ping $full_path_name:ipv6,$server_ip,$linklocal_ip,$gateway_ip$to4pt\r";
|
||||
} else {
|
||||
$cmd[3] = "ping $full_path_name:$server_ip,$client_ip,$gateway_ip\r";
|
||||
$cmd[3] = "ping $full_path_name:$server_ip,$client_ip,$gateway_ip$to4pt\r";
|
||||
}
|
||||
$pattern[3] = ".*ping(.*)ok(.*)0 >(.*)";
|
||||
|
||||
|
||||
+203
-233
@@ -19,7 +19,7 @@ use File::Path;
|
||||
use Math::BigInt;
|
||||
use Socket;
|
||||
use xCAT::GlobalDef;
|
||||
use Data::Dumper;
|
||||
#use Data::Dumper;
|
||||
use strict;
|
||||
use warnings "all";
|
||||
my $socket6support = eval { require Socket6 };
|
||||
@@ -643,16 +643,11 @@ sub get_nic_ip
|
||||
{
|
||||
my $nic;
|
||||
my %iphash;
|
||||
my $cmd = "ifconfig -a";
|
||||
my $result = `$cmd`;
|
||||
my $mode = "MULTICAST";
|
||||
my $payingattention=0;
|
||||
my $interface;
|
||||
my $keepcurrentiface;
|
||||
|
||||
#############################################
|
||||
# Error running command
|
||||
#############################################
|
||||
if ( !$result ) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
if (xCAT::Utils->isAIX()) {
|
||||
##############################################################
|
||||
@@ -664,6 +659,14 @@ sub get_nic_ip
|
||||
# en1: ...
|
||||
#
|
||||
##############################################################
|
||||
my $cmd = "ifconfig -a";
|
||||
my $result = `$cmd`;
|
||||
#############################################
|
||||
# Error running command
|
||||
#############################################
|
||||
if ( !$result ) {
|
||||
return undef;
|
||||
}
|
||||
my @adapter = split /(\w+\d+):\s+flags=/, $result;
|
||||
foreach ( @adapter ) {
|
||||
if ($_ =~ /^(en\d)/) {
|
||||
@@ -683,44 +686,39 @@ sub get_nic_ip
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
##############################################################
|
||||
# Should look like this for Linux:
|
||||
# eth0 Link encap:Ethernet HWaddr 00:02:55:7B:06:30
|
||||
# inet addr:9.114.154.193 Bcast:9.114.154.223
|
||||
# inet6 addr: fe80::202:55ff:fe7b:630/64 Scope:Link
|
||||
# UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
|
||||
# RX packets:1280982 errors:0 dropped:0 overruns:0 frame:0
|
||||
# TX packets:3535776 errors:0 dropped:0 overruns:0 carrier:0
|
||||
# collisions:0 txqueuelen:1000
|
||||
# RX bytes:343489371 (327.5 MiB) TX bytes:870969610 (830.6 MiB)
|
||||
# Base address:0x2600 Memory:fbfe0000-fc0000080
|
||||
#
|
||||
# eth1 ...
|
||||
# Redhat7
|
||||
#eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
|
||||
# inet 10.1.0.178 netmask 255.255.0.0 broadcast 10.1.255.255
|
||||
#
|
||||
##############################################################
|
||||
my @adapter= split /\n{2,}/, $result;
|
||||
foreach ( @adapter ) {
|
||||
if ( !($_ =~ /LOOPBACK/ ) and
|
||||
$_ =~ /UP( |,|>)/ and
|
||||
$_ =~ /$mode/ ) {
|
||||
my @ip = split /\n/;
|
||||
for my $ent ( @ip ) {
|
||||
if ($ent =~ /^(eth\d|ib\d|hf\d)\s+/) {
|
||||
$nic = $1;
|
||||
}
|
||||
if ($ent =~ /^(eth\d:|ib\d:|hf\d:)\s+/) {
|
||||
$nic = $1;
|
||||
}
|
||||
$ent=~ s/addr://; # works for Redhat7 also
|
||||
if ( $ent =~ /^\s*inet \s*(\d+\.\d+\.\d+\.\d+)/ ) {
|
||||
$iphash{$nic} = $1;
|
||||
next;
|
||||
}
|
||||
else { # linux
|
||||
my @ipoutput = `ip addr`;
|
||||
#############################################
|
||||
# Error running command
|
||||
#############################################
|
||||
if ( !@ipoutput ) {
|
||||
return undef;
|
||||
}
|
||||
foreach my $line (@ipoutput) {
|
||||
if ($line =~ /^\d/) { # new interface, new context..
|
||||
if ($interface and not $keepcurrentiface) {
|
||||
#don't bother reporting unusable nics
|
||||
delete $iphash{$interface};
|
||||
}
|
||||
$keepcurrentiface=0;
|
||||
if ( !($line =~ /LOOPBACK/ ) and
|
||||
$line =~ /UP( |,|>)/ and
|
||||
$line =~ /$mode/ ) {
|
||||
|
||||
$payingattention=1;
|
||||
$line =~ /^([^:]*): ([^:]*):/;
|
||||
$interface=$2;
|
||||
} else {
|
||||
$payingattention=0;
|
||||
next;
|
||||
}
|
||||
}
|
||||
unless ($payingattention) { next; }
|
||||
if ($line =~ /inet/) {
|
||||
$keepcurrentiface=1;
|
||||
}
|
||||
if ( $line =~ /^\s*inet \s*(\d+\.\d+\.\d+\.\d+)/ ) {
|
||||
$iphash{$interface} = $1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1603,58 +1601,124 @@ sub thishostisnot
|
||||
=cut
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
#sub gethost_ips1
|
||||
#{
|
||||
# my ($class) = @_;
|
||||
# my $cmd;
|
||||
# my @ipaddress;
|
||||
# $cmd = "ifconfig" . " -a";
|
||||
# $cmd = $cmd . "| grep \"inet\"";
|
||||
# my @result = xCAT::Utils->runcmd($cmd, 0);
|
||||
# if ($::RUNCMD_RC != 0)
|
||||
# {
|
||||
# xCAT::MsgUtils->message("S", "Error from $cmd\n");
|
||||
# exit $::RUNCMD_RC;
|
||||
# }
|
||||
# foreach my $addr (@result)
|
||||
# {
|
||||
# my @ip;
|
||||
# if (xCAT::Utils->isLinux())
|
||||
# {
|
||||
# if ($addr =~ /inet6/)
|
||||
# {
|
||||
# #TODO, Linux ipv6
|
||||
# }
|
||||
# else
|
||||
# {
|
||||
# my ($inet, $addr1, $Bcast, $Mask) = split(" ", $addr);
|
||||
# #@ip = split(":", $addr1);
|
||||
# #push @ipaddress, $ip[1];
|
||||
# $addr1 =~ s/.*://;
|
||||
# push @ipaddress, $addr1;
|
||||
# }
|
||||
# }
|
||||
# else
|
||||
# { #AIX
|
||||
# if ($addr =~ /inet6/)
|
||||
# {
|
||||
# $addr =~ /\s*inet6\s+([\da-fA-F:]+).*\/(\d+)/;
|
||||
# my $v6ip = $1;
|
||||
# my $v6mask = $2;
|
||||
# if ($v6ip)
|
||||
# {
|
||||
# push @ipaddress, $v6ip;
|
||||
# }
|
||||
# }
|
||||
# else
|
||||
# {
|
||||
# my ($inet, $addr1, $netmask, $mask1, $Bcast, $bcastaddr) =
|
||||
# split(" ", $addr);
|
||||
# push @ipaddress, $addr1;
|
||||
# }
|
||||
#
|
||||
# }
|
||||
# }
|
||||
# my @names = @ipaddress;
|
||||
# foreach my $ipaddr (@names)
|
||||
# {
|
||||
# my $hostname = xCAT::NetworkUtils->gethostname($ipaddr);
|
||||
# if ($hostname)
|
||||
# {
|
||||
# my @shorthost = split(/\./, $hostname);
|
||||
# push @ipaddress, $shorthost[0];
|
||||
# }
|
||||
# }
|
||||
#
|
||||
# return @ipaddress;
|
||||
#}
|
||||
|
||||
|
||||
sub gethost_ips
|
||||
{
|
||||
my ($class) = @_;
|
||||
my $cmd;
|
||||
my @ipaddress;
|
||||
$cmd = "ifconfig" . " -a";
|
||||
$cmd = $cmd . "| grep \"inet\"";
|
||||
my @result = xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
if (xCAT::Utils->isLinux())
|
||||
{
|
||||
xCAT::MsgUtils->message("S", "Error from $cmd\n");
|
||||
exit $::RUNCMD_RC;
|
||||
$cmd="ip -4 --oneline addr show |awk -F ' ' '{print \$4}'|awk -F '/' '{print \$1}'";
|
||||
my @result =xCAT::Utils->runcmd($cmd);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
xCAT::MsgUtils->message("S", "Error from $cmd\n");
|
||||
exit $::RUNCMD_RC;
|
||||
}
|
||||
|
||||
push @ipaddress, @result;
|
||||
}
|
||||
foreach my $addr (@result)
|
||||
{
|
||||
my @ip;
|
||||
if (xCAT::Utils->isLinux())
|
||||
{
|
||||
if ($addr =~ /inet6/)
|
||||
{
|
||||
#TODO, Linux ipv6
|
||||
}
|
||||
else
|
||||
{
|
||||
my ($inet, $addr1, $Bcast, $Mask) = split(" ", $addr);
|
||||
#@ip = split(":", $addr1);
|
||||
#push @ipaddress, $ip[1];
|
||||
$addr1 =~ s/.*://;
|
||||
push @ipaddress, $addr1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ #AIX
|
||||
if ($addr =~ /inet6/)
|
||||
{
|
||||
$addr =~ /\s*inet6\s+([\da-fA-F:]+).*\/(\d+)/;
|
||||
my $v6ip = $1;
|
||||
my $v6mask = $2;
|
||||
if ($v6ip)
|
||||
{
|
||||
push @ipaddress, $v6ip;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
my ($inet, $addr1, $netmask, $mask1, $Bcast, $bcastaddr) =
|
||||
split(" ", $addr);
|
||||
push @ipaddress, $addr1;
|
||||
}
|
||||
else
|
||||
{ #AIX
|
||||
|
||||
$cmd = "ifconfig" . " -a";
|
||||
$cmd = $cmd . "| grep \"inet\"";
|
||||
my @result = xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
xCAT::MsgUtils->message("S", "Error from $cmd\n");
|
||||
exit $::RUNCMD_RC;
|
||||
}
|
||||
|
||||
foreach my $addr (@result)
|
||||
{
|
||||
if ($addr =~ /inet6/)
|
||||
{
|
||||
$addr =~ /\s*inet6\s+([\da-fA-F:]+).*\/(\d+)/;
|
||||
my $v6ip = $1;
|
||||
my $v6mask = $2;
|
||||
if ($v6ip)
|
||||
{
|
||||
push @ipaddress, $v6ip;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
my ($inet, $addr1, $netmask, $mask1, $Bcast, $bcastaddr) =
|
||||
split(" ", $addr);
|
||||
push @ipaddress, $addr1;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
my @names = @ipaddress;
|
||||
foreach my $ipaddr (@names)
|
||||
{
|
||||
@@ -1665,9 +1729,9 @@ sub gethost_ips
|
||||
push @ipaddress, $shorthost[0];
|
||||
}
|
||||
}
|
||||
|
||||
return @ipaddress;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
=head3 get_subnet_aix
|
||||
@@ -1843,102 +1907,6 @@ sub validate_ip
|
||||
}
|
||||
return([0]);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
=head3 getFacingIP
|
||||
Gets the ip address of the adapter of the localhost that is facing the
|
||||
the given node.
|
||||
Assume it is the same as my_ip_facing...
|
||||
Arguments:
|
||||
The name of the node that is facing the localhost.
|
||||
Returns:
|
||||
The ip address of the adapter that faces the node.
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
sub getFacingIP
|
||||
{
|
||||
my ($class, $node) = @_;
|
||||
my $ip;
|
||||
my $cmd;
|
||||
my @ipaddress;
|
||||
|
||||
my $nodeip = inet_ntoa(inet_aton($node));
|
||||
unless ($nodeip =~ /\d+\.\d+\.\d+\.\d+/)
|
||||
{
|
||||
return 0; #Not supporting IPv6 here IPV6TODO
|
||||
}
|
||||
|
||||
$cmd = "ifconfig" . " -a";
|
||||
$cmd = $cmd . "| grep \"inet \"";
|
||||
my @result = xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
xCAT::MsgUtils->message("S", "Error from $cmd\n");
|
||||
exit $::RUNCMD_RC;
|
||||
}
|
||||
|
||||
# split node address
|
||||
my ($n1, $n2, $n3, $n4) = split('\.', $nodeip);
|
||||
|
||||
foreach my $addr (@result)
|
||||
{
|
||||
my $ip;
|
||||
my $mask;
|
||||
if (xCAT::Utils->isLinux())
|
||||
{
|
||||
my ($inet, $addr1, $Bcast, $Mask) = split(" ", $addr);
|
||||
if ((!$addr1) || (!$Mask)) { next; }
|
||||
my @ips = split(":", $addr1);
|
||||
my @masks = split(":", $Mask);
|
||||
$ip = $ips[1];
|
||||
$mask = $masks[1];
|
||||
}
|
||||
else
|
||||
{ #AIX
|
||||
my ($inet, $addr1, $netmask, $mask1, $Bcast, $bcastaddr) =
|
||||
split(" ", $addr);
|
||||
if ((!$addr1) && (!$mask1)) { next; }
|
||||
$ip = $addr1;
|
||||
$mask1 =~ s/0x//;
|
||||
$mask =
|
||||
`printf "%d.%d.%d.%d" \$(echo "$mask1" | sed 's/../0x& /g')`;
|
||||
}
|
||||
|
||||
if ($ip && $mask)
|
||||
{
|
||||
|
||||
# split interface IP
|
||||
my ($h1, $h2, $h3, $h4) = split('\.', $ip);
|
||||
|
||||
# split mask
|
||||
my ($m1, $m2, $m3, $m4) = split('\.', $mask);
|
||||
|
||||
# AND this interface IP with the netmask of the network
|
||||
my $a1 = ((int $h1) & (int $m1));
|
||||
my $a2 = ((int $h2) & (int $m2));
|
||||
my $a3 = ((int $h3) & (int $m3));
|
||||
my $a4 = ((int $h4) & (int $m4));
|
||||
|
||||
# AND node IP with the netmask of the network
|
||||
my $b1 = ((int $n1) & (int $m1));
|
||||
my $b2 = ((int $n2) & (int $m2));
|
||||
my $b3 = ((int $n3) & (int $m3));
|
||||
my $b4 = ((int $n4) & (int $m4));
|
||||
|
||||
if (($b1 == $a1) && ($b2 == $a2) && ($b3 == $a3) && ($b4 == $a4))
|
||||
{
|
||||
return $ip;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xCAT::MsgUtils->message("S", "Cannot find master for the node $node\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
=head3 isIpaddr
|
||||
@@ -1992,50 +1960,6 @@ sub isIpaddr
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
=head3 getSubnetGateway
|
||||
Description:
|
||||
Get gateway from the networks table of the specified net.
|
||||
|
||||
Arguments:
|
||||
net: the net, ie. the "net" field of the networks table
|
||||
Returns:
|
||||
Return a string, of the gateway
|
||||
undef - Failed to get the gateway
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
my $gateway = xCAT::NetworkUtils::getSubnetGateway('192.168.1.0');
|
||||
Comments:
|
||||
none
|
||||
|
||||
=cut
|
||||
#-------------------------------------------------------------------------------
|
||||
sub getSubnetGateway
|
||||
{
|
||||
my $netname=shift;
|
||||
if( $netname =~ /xCAT::NetworkUtils/)
|
||||
{
|
||||
$netname=shift;
|
||||
}
|
||||
|
||||
my $gateway=undef;
|
||||
my $nettab = xCAT::Table->new("networks");
|
||||
unless($nettab) { die "No entry defined in networks"; }
|
||||
my @nets = $nettab->getAllAttribs('net','gateway');
|
||||
foreach(@nets)
|
||||
{
|
||||
if("$_->{net}" eq "$netname")
|
||||
{
|
||||
$gateway = $_->{gateway};
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
return $gateway;
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -2093,6 +2017,50 @@ sub getNodeNameservers{
|
||||
return \%nodenameservers;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
=head3 getNodeGateway
|
||||
Description:
|
||||
Get gateway from the networks table of the node.
|
||||
|
||||
Arguments:
|
||||
ip: the ip address of the node
|
||||
Returns:
|
||||
Return a string, of the gateway
|
||||
undef - Failed to get the gateway
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
my $gateway = xCAT::NetworkUtils::getNodeGateway('192.168.1.0');
|
||||
Comments:
|
||||
none
|
||||
|
||||
=cut
|
||||
#-------------------------------------------------------------------------------
|
||||
sub getNodeGateway
|
||||
{
|
||||
my $ip=shift;
|
||||
if( $ip =~ /xCAT::NetworkUtils/)
|
||||
{
|
||||
$ip=shift;
|
||||
}
|
||||
my $gateway=undef;
|
||||
|
||||
my $nettab = xCAT::Table->new("networks");
|
||||
if ($nettab) {
|
||||
my @nets = $nettab->getAllAttribs('net','mask','gateway');
|
||||
foreach my $net (@nets) {
|
||||
if (xCAT::NetworkUtils::isInSameSubnet( $net->{'net'}, $ip, $net->{'mask'}, 0)) {
|
||||
$gateway=$net->{'gateway'};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $gateway;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
=head3 getNodeNetworkCfg
|
||||
@@ -2122,8 +2090,8 @@ sub getNodeNetworkCfg
|
||||
if( $node =~ /xCAT::NetworkUtils/)
|
||||
{
|
||||
$node =shift;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
my $nets = xCAT::NetworkUtils::my_nets();
|
||||
my $ip = xCAT::NetworkUtils->getipaddr($node);
|
||||
my $mask = undef;
|
||||
@@ -2132,12 +2100,14 @@ sub getNodeNetworkCfg
|
||||
{
|
||||
my $netname;
|
||||
($netname,$mask) = split /\//, $net;
|
||||
$gateway=xCAT::NetworkUtils::getSubnetGateway($netname);
|
||||
last if ( xCAT::NetworkUtils::isInSameSubnet( $netname, $ip, $mask, 1));
|
||||
}
|
||||
$gateway=xCAT::NetworkUtils::getNodeGateway($ip);
|
||||
return ($ip, $node, $gateway, xCAT::NetworkUtils::formatNetmask($mask,1,0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
=head3 get_hdwr_ip
|
||||
|
||||
@@ -436,9 +436,9 @@ sub sshcfg {
|
||||
#####################################
|
||||
# userid@host not found in key file
|
||||
#####################################
|
||||
if ( $sshkey !~ /\s+(\S+\@\S+$)/ ) {
|
||||
return( [[$server,"Cannot find userid\@host in '$fname'",RC_ERROR]] );
|
||||
}
|
||||
#if ( $sshkey !~ /\s+(\S+\@\S+$)/ ) {
|
||||
# return( [[$server,"Cannot find userid\@host in '$fname'",RC_ERROR]] );
|
||||
#}
|
||||
my $logon = $1;
|
||||
|
||||
#####################################
|
||||
|
||||
@@ -347,7 +347,7 @@ sub bus {
|
||||
#################################
|
||||
# Output header
|
||||
#################################
|
||||
push @result, [$name,"I/O Bus Information"];
|
||||
push @result, [$name,"I/O Bus Information", 0];
|
||||
|
||||
#################################
|
||||
# Output error
|
||||
@@ -532,7 +532,7 @@ sub config {
|
||||
#################################
|
||||
# Output header
|
||||
#################################
|
||||
push @result, [$name,"Machine Configuration Info"];
|
||||
push @result, [$name,"Machine Configuration Info", 0];
|
||||
my $i;
|
||||
|
||||
foreach ( @prefix ) {
|
||||
|
||||
@@ -203,7 +203,7 @@ sub voltage {
|
||||
# Voltages available in frame
|
||||
#################################
|
||||
if ( @$d[4] ne "bpa" ) {
|
||||
push @result, [$name,"$text Only available for BPA",1];
|
||||
push @result, [$name,"$text Only available for BPA",0];
|
||||
next;
|
||||
}
|
||||
my $volt = enumerate_volt( $exp, $d );
|
||||
@@ -256,7 +256,7 @@ sub temp {
|
||||
# No frame commands for IVM
|
||||
#################################
|
||||
if ( $hwtype eq "ivm" ) {
|
||||
push @result, [$name,"$prefix Not available (No BPA)",1];
|
||||
push @result, [$name,"$prefix Not available (No BPA)",0];
|
||||
next;
|
||||
}
|
||||
#################################
|
||||
@@ -264,14 +264,14 @@ sub temp {
|
||||
#################################
|
||||
if ( @$d[4] !~ /^(fsp|cec|lpar)$/ ) {
|
||||
my $text = "$prefix Only available for CEC/LPAR";
|
||||
push @result, [$name,$text,1];
|
||||
push @result, [$name,$text,0];
|
||||
next;
|
||||
}
|
||||
#################################
|
||||
# Error - No frame
|
||||
#################################
|
||||
if ( $mtms eq "0" ) {
|
||||
push @result, [$name,"$prefix Not available (No BPA)",1];
|
||||
push @result, [$name,"$prefix Not available (No BPA)",0];
|
||||
next;
|
||||
}
|
||||
#################################
|
||||
|
||||
@@ -810,6 +810,10 @@ sub senddeviceskeys
|
||||
# add to the command
|
||||
$setupcmd .=$key;
|
||||
$setupcmd .="\"";
|
||||
# Special case for vios
|
||||
if ($ENV{DEVICETYPE} eq 'vios') {
|
||||
$setupcmd = "\"echo $key | tee -a ~/.ssh/authorized_keys2\"";
|
||||
}
|
||||
# For each input device
|
||||
my @nodelist=split(/,/,$nodes);
|
||||
foreach my $node (@nodelist) {
|
||||
|
||||
@@ -389,7 +389,46 @@ ipmi => {
|
||||
descriptions => {
|
||||
node => 'The node name or group name.',
|
||||
bmc => 'The hostname of the BMC adapater.',
|
||||
bmcport => 'In systems with selectable shared/dedicated ethernet ports, this parameter can be used to specify the preferred port. 0 means use the shared port, 1 means dedicated, blank is to not assign',
|
||||
bmcport => ' In systems with selectable shared/dedicated ethernet ports,
|
||||
this parameter can be used to specify the preferred port. 0
|
||||
means use the shared port, 1 means dedicated, blank is to not
|
||||
assign.
|
||||
|
||||
The following special cases exist for IBM System x servers:
|
||||
|
||||
For x3755 M3 systems, 0 means use the dedicated port, 1 means
|
||||
shared, blank is to not assign.
|
||||
|
||||
For certain systems which have a mezzaine or ML2 adapter, there is a second
|
||||
value to include:
|
||||
|
||||
|
||||
For x3750 M4 (Model 8722):
|
||||
|
||||
|
||||
0 2 1st 1Gbps interface for LOM
|
||||
|
||||
0 0 1st 10Gbps interface for LOM
|
||||
|
||||
0 3 2nd 1Gbps interface for LOM
|
||||
|
||||
0 1 2nd 10Gbps interface for LOM
|
||||
|
||||
|
||||
For x3750 M4 (Model 8752), x3850/3950 X6, dx360 M4, x3550 M4, and x3650 M4:
|
||||
|
||||
|
||||
0 Shared (1st onboard interface)
|
||||
|
||||
1 Dedicated
|
||||
|
||||
2 0 First interface on ML2 or mezzanine adapter
|
||||
|
||||
2 1 Second interface on ML2 or mezzanine adapter
|
||||
|
||||
2 2 Third interface on ML2 or mezzanine adapter
|
||||
|
||||
2 3 Fourth interface on ML2 or mezzanine adapter',
|
||||
taggedvlan => 'Have bmcsetup place the BMC on the specified vlan tag on a shared netwirk interface. Some network devices may be incompatible with this option',
|
||||
bmcid => 'Unique identified data used by discovery processes to distinguish known BMCs from unrecognized BMCs',
|
||||
username => 'The BMC userid. If not specified, the key=ipmi row in the passwd table is used as the default.',
|
||||
@@ -708,7 +747,7 @@ linuximage => {
|
||||
table_desc => 'Information about a Linux operating system image that can be used to deploy cluster nodes.',
|
||||
descriptions => {
|
||||
imagename => 'The name of this xCAT OS image definition.',
|
||||
template => 'The fully qualified name of the template file that is used to create the kick start file for diskful installation.',
|
||||
template => 'The fully qualified name of the template file that will be used to create the OS installer configuration file for stateful installations (e.g. kickstart for RedHat, autoyast for SLES).',
|
||||
boottarget => 'The name of the boottarget definition. When this attribute is set, xCAT will use the kernel, initrd and kernel params defined in the boottarget definition instead of the default.',
|
||||
addkcmdline=> 'User specified arguments to be passed to the kernel. The user arguments are appended to xCAT.s default kernel arguments. This attribute is ignored if linuximage.boottarget is set.',
|
||||
pkglist => 'The fully qualified name of the file that stores the distro packages list that will be included in the image. Make sure that if the pkgs in the pkglist have dependency pkgs, the dependency pkgs should be found in one of the pkgdir',
|
||||
@@ -727,7 +766,7 @@ linuximage => {
|
||||
permission => 'The mount permission of /.statelite directory is used, its default value is 755',
|
||||
dump => qq{The NFS directory to hold the Linux kernel dump file (vmcore) when the node with this image crashes, its format is "nfs://<nfs_server_ip>/<kdump_path>". If you want to use the node's "xcatmaster" (its SN or MN), <nfs_server_ip> can be left blank. For example, "nfs:///<kdump_path>" means the NFS directory to hold the kernel dump file is on the node's SN, or MN if there's no SN.},
|
||||
crashkernelsize => 'the size that assigned to the kdump kernel. If the kernel size is not set, 256M will be the default value.',
|
||||
partitionfile => 'The path of the configuration file which is used to part the disk for the node. For stateful: two types of value can be set for this attribute. One is "<partition file absolute path>", the content of the partition file must use the corresponding format with the OS type. The other one is "s:<partition file absolute path>", the content of the partition file should be a shell script which must write the partition definition into /tmp/partitionfile on the node. For statelite: the valid value is <partition file absolute path>, refer to the statelite doc for the xCAT defined format of the configuration file.',
|
||||
partitionfile => 'The path of the configuration file which will be used to partition the disk for the node. For stateful osimages,two types of files are supported: "<partition file absolute path>" which contains a partitioning definition that will be inserted directly into the generated autoinst configuration file and must be formatted for the corresponding OS installer (e.g. kickstart for RedHat, autoyast for SLES). "s:<partitioning script absolute path>" which specifies a shell script that will be run from the OS installer configuration file %pre section; the script must write the correct partitioning definition into the file /tmp/partitionfile on the node which will be included into the configuration file during the install process. For statelite osimages, partitionfile should specify "<partition file absolute path>"; see the xCAT Statelite documentation for the xCAT defined format of this configuration file.',
|
||||
driverupdatesrc => 'The source of the drivers which need to be loaded during the boot. Two types of driver update source are supported: Driver update disk and Driver rpm package. The value for this attribute should be comma separated sources. Each source should be the format tab:full_path_of_srouce_file. The tab keyword can be: dud (for Driver update disk) and rpm (for driver rpm). If missing the tab, the rpm format is the default. e.g. dud:/install/dud/dd.img,rpm:/install/rpm/d.rpm',
|
||||
comments => 'Any user-written notes.',
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
@@ -742,7 +781,7 @@ winimage => {
|
||||
imagename => 'The name of this xCAT OS image definition.',
|
||||
template => 'The fully qualified name of the template file that is used to create the windows unattend.xml file for diskful installation.',
|
||||
installto => 'The disk and partition that the Windows will be deployed to. The valid format is <disk>:<partition>. If not set, default value is 0:1 for bios boot mode(legacy) and 0:3 for uefi boot mode; If setting to 1, it means 1:1 for bios boot and 1:3 for uefi boot',
|
||||
partitionfile => 'The path of partition configuration file. Since the partition configuration for bios boot mode and uefi boot mode are different, this configuration file should include two parts if customer wants to support both bios and uefi mode. If customer just wants to support one of the modes, specify one of them anyway. Example of partition configuration file: [BIOS]xxxxxxx[UEFI]yyyyyyy. To simplify the setting, you also can set installto in partitionfile with section likes [INSTALLTO]0:1',
|
||||
partitionfile => 'The path of partition configuration file. Since the partition configuration for bios boot mode and uefi boot mode are different, this configuration file can include both configurations if you need to support both bios and uefi mode. Either way, you must specify the boot mode in the configuration. Example of partition configuration file: [BIOS]xxxxxxx[UEFI]yyyyyyy. To simplify the setting, you also can set installto in partitionfile with section like [INSTALLTO]0:1',
|
||||
winpepath => 'The path of winpe which will be used to boot this image. If the real path is /tftpboot/winboot/winpe1/, the value for winpepath should be set to winboot/winpe1',
|
||||
comments => 'Any user-written notes.',
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
|
||||
@@ -243,6 +243,7 @@ my %usage = (
|
||||
chvm <noderange> [vmcpus=min/req/max] [vmmemory=min/req/max]
|
||||
[vmphyslots=drc_index1,drc_index2...] [vmothersetting=hugepage:N,bsr:N]
|
||||
[vmnics=vlan1,vlan2] [vmstorage=<N|viosnode:slotid>] [--vios]
|
||||
chvm <noderange> [del_physlots=drc_index1,drc_index2...]
|
||||
chvm <noderange> [del_vadapter=slotid]
|
||||
VMware specific:
|
||||
chvm <noderange> [-a size][-d disk][-p disk][--resize disk=size][--cpus count][--mem memory]
|
||||
|
||||
+532
-6
@@ -1339,11 +1339,30 @@ sub runxcmd_output
|
||||
}
|
||||
}
|
||||
}
|
||||
if (defined($node->{error}))
|
||||
{
|
||||
if (ref(\($node->{error}->[0])) eq 'SCALAR')
|
||||
{
|
||||
$desc = $desc . ": " . $node->{error}->[0];
|
||||
}
|
||||
}
|
||||
if (defined($node->{errorcode}))
|
||||
{
|
||||
if (ref(\($node->{errorcode}->[0])) eq 'SCALAR')
|
||||
{
|
||||
$::RUNCMD_RC |= $node->{errorcode}->[0];
|
||||
}
|
||||
}
|
||||
push @$::xcmd_outref, $desc;
|
||||
}
|
||||
if (defined($resp->{error}))
|
||||
{
|
||||
push @$::xcmd_outref, @{$resp->{error}};
|
||||
if (ref($resp->{error}) eq 'ARRAY')
|
||||
{
|
||||
push @$::xcmd_outref, @{$resp->{error}};
|
||||
} else {
|
||||
push @$::xcmd_outref, $resp->{error};
|
||||
}
|
||||
}
|
||||
if (defined($resp->{errorcode}))
|
||||
{
|
||||
@@ -1829,8 +1848,7 @@ sub get_image_name
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
=head3 StartService
|
||||
Supports AIX and Linux as long as the service is registered with
|
||||
lssrc or startsrc.
|
||||
Supports AIX only, for Linux use startservice
|
||||
Used by the service node plugin (AAsn.pm) to start requested services.
|
||||
Checks to see if the input service is already started. If it is started
|
||||
it stops and starts the service. Otherwise
|
||||
@@ -1850,7 +1868,9 @@ sub get_image_name
|
||||
Example:
|
||||
if (xCAT::Utils->startService("named") { ...}
|
||||
Comments:
|
||||
none
|
||||
this subroutine is deprecated,
|
||||
will be used as an internal function to process AIX service,
|
||||
for linux, use xCAT::Utils->startservice instead
|
||||
|
||||
=cut
|
||||
|
||||
@@ -3425,10 +3445,11 @@ sub version_cmp {
|
||||
string of the bin file name
|
||||
Returns:
|
||||
string of the full path name of the binary executable file
|
||||
string of the bin file name in the argument if failed
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
string of the bin file name in the argument
|
||||
none
|
||||
Example:
|
||||
my $CHKCONFIG = xCAT::Utils->fullpathbin("chkconfig");
|
||||
Comments:
|
||||
@@ -3491,7 +3512,7 @@ sub gettimezone
|
||||
} else { # all linux
|
||||
my $localtime = "/etc/localtime";
|
||||
my $zoneinfo = "/usr/share/zoneinfo";
|
||||
my $cmd = "find $zoneinfo -type f -exec cmp -s $localtime {} \\; -print | grep -v posix | grep -v SystemV";
|
||||
my $cmd = "find $zoneinfo -xtype f -exec cmp -s $localtime {} \\; -print | grep -v posix | grep -v SystemV | grep -v right | grep -v localtime ";
|
||||
my $zone_result = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
@@ -3516,4 +3537,509 @@ sub gettimezone
|
||||
}
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
=head3 servicemap
|
||||
returns the name of service unit(for systemd) or service daemon(for SYSVinit).
|
||||
Arguments:
|
||||
$svcname: the name of the service
|
||||
$svcmgrtype: the service manager type:
|
||||
0: SYSVinit
|
||||
1: systemd
|
||||
2: upstart
|
||||
Returns:
|
||||
the name of service unit or service daemon
|
||||
undef on fail
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
None
|
||||
Example:
|
||||
my $svc = xCAT::Utils->servicemap($svcname,1);
|
||||
Comments:
|
||||
none
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
sub servicemap{
|
||||
my $svcname=shift;
|
||||
if( $svcname =~ /xCAT::Utils/)
|
||||
{
|
||||
$svcname=shift;
|
||||
}
|
||||
|
||||
my $svcmgrtype=shift;
|
||||
|
||||
|
||||
#hash structure:
|
||||
#"service name $svcname" =>{
|
||||
#"service manager name(SYSVinit/systemd) $svcmgrtype"
|
||||
#=> ["list of possible service file names for the specified $svcname under the specified $svcmgrtype "]
|
||||
# }
|
||||
my %svchash=(
|
||||
"dhcp" => ["dhcp3-server","dhcpd","isc-dhcp-server"],
|
||||
"nfs" => ["nfsserver","nfs-server","nfs","nfs-kernel-server"],
|
||||
"named" => ["named","bind9"],
|
||||
"syslog" => ["syslog","syslogd","rsyslog"],
|
||||
"firewall" => ["iptables","firewalld","SuSEfirewall2_setup","ufw"],
|
||||
"http" => ["apache2","httpd"],
|
||||
"ntpserver" =>["ntpd","ntp"],
|
||||
"mysql" => ["mysqld","mysql"],
|
||||
);
|
||||
|
||||
my $path=undef;
|
||||
my $postfix="";
|
||||
my $retdefault=$svcname;
|
||||
if($svcmgrtype == 0){
|
||||
$path="/etc/init.d/";
|
||||
}elsif ($svcmgrtype == 1){
|
||||
$path="/usr/lib/systemd/system/";
|
||||
$postfix=".service";
|
||||
$retdefault=$svcname.".service";
|
||||
}elsif ($svcmgrtype == 2){
|
||||
$path="/etc/init/";
|
||||
$postfix=".conf";
|
||||
}
|
||||
|
||||
|
||||
my $ret=undef;
|
||||
if($svchash{$svcname}){
|
||||
foreach my $file (@{$svchash{$svcname}}){
|
||||
if(-e $path.$file.$postfix ){
|
||||
$ret=$file;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(-e $path.$retdefault.$postfix){
|
||||
$ret=$retdefault;
|
||||
}
|
||||
}
|
||||
|
||||
return $ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
=head3 startservice
|
||||
start a service
|
||||
Arguments:
|
||||
service name
|
||||
Returns:
|
||||
0 on success
|
||||
nonzero otherwise
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
xCAT::Utils->startservice("nfs");
|
||||
Comments:
|
||||
none
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
sub startservice{
|
||||
my $svcname=shift;
|
||||
if( $svcname =~ /xCAT::Utils/)
|
||||
{
|
||||
$svcname=shift;
|
||||
}
|
||||
|
||||
my $cmd="";
|
||||
#for Systemd
|
||||
my $svcunit=undef;
|
||||
#for sysVinit
|
||||
my $svcd=undef;
|
||||
#for upstart
|
||||
my $svcjob=undef;
|
||||
|
||||
$svcunit=servicemap($svcname,1);
|
||||
$svcjob=servicemap($svcname,2);
|
||||
$svcd=servicemap($svcname,0);
|
||||
if($svcunit)
|
||||
{
|
||||
$cmd="systemctl start $svcunit";
|
||||
}
|
||||
elsif( $svcjob )
|
||||
{
|
||||
$cmd="initctl start $svcjob";
|
||||
}
|
||||
elsif( $svcd )
|
||||
{
|
||||
$cmd="service $svcd start";
|
||||
}
|
||||
|
||||
#print "$cmd\n";
|
||||
if( $cmd eq "" )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
#xCAT::Utils->runcmd($cmd, -1); # do not use runcmd (backtics), must use system to not fork
|
||||
system($cmd);
|
||||
$::RUNCMD_RC=$?;
|
||||
return $::RUNCMD_RC;
|
||||
}
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
=head3 stopservice
|
||||
stop a service
|
||||
Arguments:
|
||||
service name
|
||||
Returns:
|
||||
0 on success
|
||||
nonzero otherwise
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
xCAT::Utils->stopservice("nfs");
|
||||
Comments:
|
||||
none
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
sub stopservice{
|
||||
my $svcname=shift;
|
||||
if( $svcname =~ /xCAT::Utils/)
|
||||
{
|
||||
$svcname=shift;
|
||||
}
|
||||
|
||||
my $cmd="";
|
||||
my $svcunit=undef;
|
||||
my $svcd=undef;
|
||||
my $svcjob=undef;
|
||||
|
||||
$svcunit=servicemap($svcname,1);
|
||||
$svcjob=servicemap($svcname,2);
|
||||
$svcd=servicemap($svcname,0);
|
||||
if($svcunit)
|
||||
{
|
||||
$cmd="systemctl stop $svcunit";
|
||||
}
|
||||
elsif( $svcjob )
|
||||
{
|
||||
$cmd="initctl status $svcjob |grep stop; if [ \"\$?\" != \"0\" ]; then initctl stop $svcjob ; fi";
|
||||
}
|
||||
elsif( $svcd )
|
||||
{
|
||||
$cmd="service $svcd stop";
|
||||
}
|
||||
|
||||
|
||||
#print "$cmd\n";
|
||||
if( $cmd eq "" )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
#xCAT::Utils->runcmd($cmd, -1); # do not use runcmd (backtics), must use system to not fork
|
||||
system($cmd);
|
||||
$::RUNCMD_RC=$?;
|
||||
return $::RUNCMD_RC;
|
||||
}
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
=head3 restartservice
|
||||
restart a service
|
||||
Arguments:
|
||||
service name
|
||||
Returns:
|
||||
0 on success
|
||||
nonzero otherwise
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
xCAT::Utils->restartservice("nfs");
|
||||
Comments:
|
||||
none
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
sub restartservice{
|
||||
my $svcname=shift;
|
||||
if( $svcname =~ /xCAT::Utils/)
|
||||
{
|
||||
$svcname=shift;
|
||||
}
|
||||
|
||||
my $cmd="";
|
||||
my $svcunit=undef;
|
||||
my $svcd=undef;
|
||||
my $svcjob=undef;
|
||||
|
||||
$svcunit=servicemap($svcname,1);
|
||||
$svcjob=servicemap($svcname,2);
|
||||
$svcd=servicemap($svcname,0);
|
||||
if($svcunit)
|
||||
{
|
||||
$cmd="systemctl restart $svcunit";
|
||||
}
|
||||
elsif( $svcd )
|
||||
{
|
||||
$cmd="service $svcd restart";
|
||||
}
|
||||
elsif( $svcjob )
|
||||
{
|
||||
$cmd="initctl status $svcjob |grep stop; if [ \"\$?\" != \"0\" ]; then initctl restart $svcjob ; else initctl start $svcjob; fi";
|
||||
}
|
||||
|
||||
#print "$cmd\n";
|
||||
if( $cmd eq "" )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
return $::RUNCMD_RC;
|
||||
}
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
=head3 checkservicestatus
|
||||
returns theservice status.
|
||||
Arguments:
|
||||
$svcname: the name of the service
|
||||
$outputoption[optional]:
|
||||
the output option
|
||||
1: return a hashref with the keys:"retcode","retmsg"
|
||||
otherwise: return retcode only
|
||||
Returns:
|
||||
undef on fail
|
||||
a hashref if $outputoption is 1,the hash structure is:
|
||||
{"retcode"=>(status code, 0 for running/active,1 for stopped/inactive,2 for failed)
|
||||
"retmsg" =>(status string, running/active/stopped/inactive/failed)
|
||||
}
|
||||
the status code otherwise
|
||||
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
None
|
||||
Example:
|
||||
my $ret = xCAT::Utils-checkservicestatus($svcname,1);
|
||||
my $retcode = xCAT::Utils-checkservicestatus($svcname);
|
||||
Comments:
|
||||
none
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
sub checkservicestatus{
|
||||
my $svcname=shift;
|
||||
if( $svcname =~ /xCAT::Utils/)
|
||||
{
|
||||
$svcname=shift;
|
||||
}
|
||||
|
||||
my $outputoption=shift;
|
||||
|
||||
my $cmd="";
|
||||
my $svcunit=undef;
|
||||
my $svcd=undef;
|
||||
my $svcjob=undef;
|
||||
my %ret;
|
||||
|
||||
$svcunit=servicemap($svcname,1);
|
||||
$svcjob=servicemap($svcname,2);
|
||||
$svcd=servicemap($svcname,0);
|
||||
my $output=undef;
|
||||
|
||||
if($svcunit)
|
||||
{
|
||||
#for systemd, parse the output since it is formatted
|
||||
$cmd="systemctl show --property=ActiveState $svcunit|awk -F '=' '{print \$2}'";
|
||||
$output=xCAT::Utils->runcmd($cmd, -1);
|
||||
if($output =~ /^active$/i){
|
||||
$ret{retcode}=0;
|
||||
}elsif($output =~ /^failed$/i){
|
||||
$ret{retcode}=2;
|
||||
|
||||
}elsif($output =~ /^inactive$/i){
|
||||
$ret{retcode}=1;
|
||||
}
|
||||
}
|
||||
elsif ( $svcjob )
|
||||
{
|
||||
#for upstart, parse the output
|
||||
$cmd="initctl status $svcjob";
|
||||
$output=xCAT::Utils->runcmd($cmd, -1);
|
||||
if($output =~ /waiting/i){
|
||||
$ret{retcode}=2;
|
||||
}elsif($output =~ /running/i){
|
||||
$ret{retcode}=0;
|
||||
}
|
||||
|
||||
}
|
||||
elsif( $svcd )
|
||||
{
|
||||
#for SYSVinit, check the return value since the "service" command output is confused
|
||||
$cmd="service $svcd status";
|
||||
$output=xCAT::Utils->runcmd($cmd, -1);
|
||||
$ret{retcode}=$::RUNCMD_RC;
|
||||
# if($output =~ /stopped|not running/i){
|
||||
# $ret{retcode}=1;
|
||||
# }elsif($output =~ /running/i){
|
||||
# $ret{retcode}=0;
|
||||
# }
|
||||
}
|
||||
if($output)
|
||||
{
|
||||
$ret{retmsg}=$output;
|
||||
}
|
||||
|
||||
|
||||
if(defined $outputoption and $outputoption == 1 ){
|
||||
return \%ret;
|
||||
}elsif(exists $ret{retcode}){
|
||||
return $ret{retcode};
|
||||
}
|
||||
|
||||
return undef;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
=head3 enableservice
|
||||
enable a service to start it on the system bootup
|
||||
Arguments:
|
||||
service name
|
||||
Returns:
|
||||
0 on success
|
||||
nonzero otherwise
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
xCAT::Utils->enableservice("nfs");
|
||||
Comments:
|
||||
none
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
sub enableservice{
|
||||
my $svcname=shift;
|
||||
if( $svcname =~ /xCAT::Utils/)
|
||||
{
|
||||
$svcname=shift;
|
||||
|
||||
}
|
||||
my $cmd="";
|
||||
my $svcunit=undef;
|
||||
my $svcd=undef;
|
||||
my $svcjob=undef;
|
||||
|
||||
$svcunit=servicemap($svcname,1);
|
||||
$svcjob=servicemap($svcname,2);
|
||||
$svcd=servicemap($svcname,0);
|
||||
if($svcunit)
|
||||
{
|
||||
$cmd="systemctl enable $svcunit";
|
||||
}
|
||||
elsif($svcjob)
|
||||
{
|
||||
$cmd="update-rc.d $svcjob defaults";
|
||||
|
||||
}
|
||||
elsif( $svcd )
|
||||
{
|
||||
my $CHKCONFIG = xCAT::Utils->fullpathbin("chkconfig");
|
||||
if($CHKCONFIG ne "chkconfig"){
|
||||
$cmd="$CHKCONFIG $svcd on";
|
||||
}else{
|
||||
$CHKCONFIG = xCAT::Utils->fullpathbin("update-rc.d");
|
||||
if($CHKCONFIG ne "update-rc.d"){
|
||||
$cmd="$CHKCONFIG $svcd defaults";
|
||||
}
|
||||
}
|
||||
}
|
||||
if( $cmd eq "" )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
return $::RUNCMD_RC;
|
||||
}
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
=head3 disableservice
|
||||
disable a service to prevent it from starting on system bootup
|
||||
Arguments:
|
||||
service name
|
||||
Returns:
|
||||
0 on success
|
||||
nonzero otherwise
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
xCAT::Utils->disableservice("nfs");
|
||||
Comments:
|
||||
none
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
sub disableservice{
|
||||
my $svcname=shift;
|
||||
if( $svcname =~ /xCAT::Utils/)
|
||||
{
|
||||
$svcname=shift;
|
||||
|
||||
}
|
||||
my $cmd="";
|
||||
my $svcunit=undef;
|
||||
my $svcjob=undef;
|
||||
my $svcd=undef;
|
||||
|
||||
$svcunit=servicemap($svcname,1);
|
||||
$svcjob=servicemap($svcname,2);
|
||||
$svcd=servicemap($svcname,0);
|
||||
if($svcunit)
|
||||
{
|
||||
$cmd="systemctl disable $svcunit";
|
||||
}
|
||||
elsif($svcjob)
|
||||
{
|
||||
$cmd="update-rc.d -f $svcjob remove";
|
||||
|
||||
}
|
||||
elsif( $svcd )
|
||||
{
|
||||
my $CHKCONFIG = xCAT::Utils->fullpathbin("chkconfig");
|
||||
if($CHKCONFIG ne "chkconfig"){
|
||||
$cmd="$CHKCONFIG $svcd off";
|
||||
}else{
|
||||
$CHKCONFIG = xCAT::Utils->fullpathbin("update-rc.d");
|
||||
if($CHKCONFIG ne "update-rc.d"){
|
||||
$cmd="$CHKCONFIG -f $svcd remove";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# print "$cmd\n";
|
||||
if( $cmd eq "" )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
return $::RUNCMD_RC;
|
||||
}
|
||||
1;
|
||||
|
||||
@@ -72,6 +72,7 @@ require Exporter;
|
||||
"1339640148.070971" => "rhelhpc6.3",#x86_64
|
||||
"1359576195.413831" => "rhelhpc6.4",#x86_64, RHEL ComputeNode
|
||||
"1384196516.465862" => "rhelhpc6.5",#x86_64, RHEL ComputeNode
|
||||
"1399449226.140088" => "rhelhpc7.0",#x86_64, RHEL ComputeNode
|
||||
"1194015916.783841" => "fedora8",
|
||||
"1194015385.299901" => "fedora8",
|
||||
"1210112435.291709" => "fedora9",
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
# AIX Bundle file for compiler runtime packages
|
||||
|
||||
I:xlC.aix61
|
||||
I:xlC.rte
|
||||
I:xlfrte
|
||||
I:xlfrte.aix61
|
||||
I:xlfrte.msg.en_US
|
||||
I:xlsmp.aix61.rte
|
||||
I:xlsmp.msg.en_US.rte
|
||||
I:xlsmp.rte
|
||||
@@ -62,7 +62,8 @@ else
|
||||
file=$1
|
||||
fi
|
||||
|
||||
ifconfig -a | grep 'inet ' | awk ' { print $2 } ' | grep -v 127.0.0.1 |
|
||||
#ifconfig -a | grep 'inet ' | awk ' { print $2 } ' | grep -v 127.0.0.1 |
|
||||
ip -4 -oneline addr show 2>/dev/null |grep inet | sed -ne "s/.*inet //p"|awk -F ' ' '{print $1}'|awk -F '/' '{print $1}'|
|
||||
while read my_address ; do
|
||||
##print "checking $my_address"
|
||||
grep -q " ${my_address}$" $file
|
||||
|
||||
@@ -100,8 +100,8 @@ change_host_name()
|
||||
|
||||
if [ "$str_os_type" = "sles" ];then
|
||||
echo "Persistently changing the hostname not implemented yet."
|
||||
#debian ubuntu
|
||||
elif [ "$str_os_type" = "debian" ];then
|
||||
#debian ubuntu and rh7
|
||||
elif [ -f "/etc/hostname" ];then
|
||||
conf_file="/etc/hostname"
|
||||
echo "$str_hostname" > $conf_file
|
||||
else
|
||||
|
||||
@@ -36,8 +36,8 @@ change_host_name()
|
||||
|
||||
if [ "$str_os_type" = "sles" ];then
|
||||
echo "Persistently changing the hostname not implemented yet."
|
||||
#debian ubuntu
|
||||
elif [ "$str_os_type" = "debian" ];then
|
||||
#debian ubuntu and rh7
|
||||
elif [ -f "/etc/hostname" ];then
|
||||
conf_file="/etc/hostname"
|
||||
echo "$str_hostname" > $conf_file
|
||||
else
|
||||
|
||||
@@ -92,7 +92,7 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%ifos linux
|
||||
if [ -f "/proc/cmdline" ]; then # prevent running it during install into chroot image
|
||||
if [ -f $RPM_INSTALL_PREFIX0/sbin/xcatd ]; then
|
||||
/etc/init.d/xcatd reload
|
||||
/etc/init.d/xcatd restart
|
||||
fi
|
||||
fi
|
||||
%endif
|
||||
|
||||
@@ -38,11 +38,9 @@ if (scalar(@ARGV)>1) { $usage->(1); }
|
||||
my $hnmatch = $ARGV[0]; # if they specified a hostname match, only show svrs that start with that
|
||||
|
||||
readconf("$ENV{HOME}/.slconfig"); # get the userid and api key from the config file
|
||||
#my $api_username = 'SL276540';
|
||||
#my $api_key = '799d5d9267a927a330ec016f00bfe17e6fc532d203cf68b3b0d997b2d27a3ce1';
|
||||
|
||||
my $slinstalled = eval { push @INC, $CONFIG{apidir}; require SoftLayer::API::SOAP; };
|
||||
if (!$slinstalled) { die "Error: the SoftLayer::API::SOAP perl module is not installed. Download it using 'git clone https://github.com/softlayer/softlayer-api-perl-client' and put the directory in ~/.slconfig ."; }
|
||||
if (!$slinstalled) { die "$@\nError: either the SoftLayer::API::SOAP perl module is not installed, or some dependencies are missing. Download it using 'git clone https://github.com/softlayer/softlayer-api-perl-client', put the directory in ~/.slconfig , and ensure its dependencies are installed."; }
|
||||
|
||||
my $client = SoftLayer::API::SOAP->new('SoftLayer_Account', undef, $CONFIG{userid}, $CONFIG{apikey});
|
||||
|
||||
@@ -64,12 +62,23 @@ foreach my $server (@$servers) {
|
||||
print "\tbmc=".$server->{remoteManagementComponent}->{ipmiIpAddress}."\n";
|
||||
print "\tbmcusername=".$server->{remoteManagementAccounts}->[0]->{username}."\n";
|
||||
print "\tbmcpassword=".$server->{remoteManagementAccounts}->[0]->{password}."\n";
|
||||
print "\tmac=".$server->{backendNetworkComponents}->[0]->{macAddress}."\n";
|
||||
print "\tip=".$server->{privateIpAddress}."\n";
|
||||
|
||||
# find the 1st active private nic that is not the bmc
|
||||
foreach my $nic (@{$server->{backendNetworkComponents}}) {
|
||||
#print "nic:\n"; foreach my $key (keys(%$nic)) { print " $key = ", $nic->{$key}, "\n"; }
|
||||
if ($nic->{status} eq 'ACTIVE' && $nic->{name} eq 'eth' && $nic->{macAddress} && $nic->{primaryIpAddress}) {
|
||||
# found it
|
||||
print "\tmac=".$nic->{macAddress}."\n";
|
||||
print "\tip=".$nic->{primaryIpAddress}."\n";
|
||||
}
|
||||
}
|
||||
#print "\tip=".$server->{privateIpAddress}."\n"; # getting this from the backendNetworkComponents instead
|
||||
print "\tserial=".$server->{manufacturerSerialNumber}."\n";
|
||||
print "\tnetboot=xnba\n";
|
||||
print "\tarch=x86_64\n";
|
||||
print "\tusercomment=hostname:".$server->{fullyQualifiedDomainName}.", user:".$server->{operatingSystem}->{passwords}->[0]->{username}.", pw:".$server->{operatingSystem}->{passwords}->[0]->{password}."\n";
|
||||
|
||||
verbose('SoftLayer API bare metal server entry: ' . Dumper($server));
|
||||
#print Dumper($server->{remoteManagementAccounts});
|
||||
#print "#Softlayer_account_info_for ".$server->{fullyQualifiedDomainName} . " Username: ";
|
||||
#print $server->{operatingSystem}->{passwords}->[0]->{username} . " Password: ";
|
||||
|
||||
Executable
+88
@@ -0,0 +1,88 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# remove entries from the .ssh/known_hosts file for a node
|
||||
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
use Data::Dumper;
|
||||
#$Data::Dumper::Maxdepth=2;
|
||||
|
||||
# Globals - these are set once and then only read.
|
||||
my $HELP;
|
||||
my $VERBOSE;
|
||||
my $file = '~/.ssh/known_hosts';
|
||||
|
||||
my $usage = sub {
|
||||
my $exitcode = shift @_;
|
||||
print "Usage: khrem <node>\n";
|
||||
print " Removes the entries in the .ssh/known_hosts file associated with this node.\n";
|
||||
exit $exitcode;
|
||||
};
|
||||
|
||||
# Process the cmd line args
|
||||
Getopt::Long::Configure("bundling");
|
||||
#Getopt::Long::Configure("pass_through");
|
||||
Getopt::Long::Configure("no_pass_through");
|
||||
if (!GetOptions('h|?|help' => \$HELP, 'v|verbose' => \$VERBOSE)) { $usage->(1); }
|
||||
|
||||
if ($HELP) { $usage->(0); }
|
||||
if (scalar(@ARGV)!=1) { $usage->(1); }
|
||||
my $node = $ARGV[0]; # if they specified a hostname match, only show svrs that start with that
|
||||
|
||||
my @output = runcmd("host $node");
|
||||
my $hostname;
|
||||
my $line = shift @output;
|
||||
#print "line=$line\n";
|
||||
if ($line =~ m/is an alias for /) {
|
||||
($hostname) = $line =~ m/is an alias for ([^\.]+)/;
|
||||
#print "hostname=$hostname\n";
|
||||
$line = shift @output;
|
||||
}
|
||||
#print "line=$line\n";
|
||||
my ($ip) = $line =~ m/has address (.+)$/;
|
||||
if (defined($hostname)) {
|
||||
print "Removing entries from $file for: $node, $hostname, $ip\n";
|
||||
runcmd("sed -i '/^$node/d;/^$hostname/d;/^$ip/d' $file");
|
||||
}
|
||||
else {
|
||||
print "Removing entries from $file for: $node, $ip\n";
|
||||
runcmd("sed -i '/^$node/d;/^$ip/d' $file");
|
||||
}
|
||||
|
||||
exit(0);
|
||||
|
||||
|
||||
# Pring msg only if -v was specified
|
||||
sub verbose { if ($VERBOSE) { print shift, "\n"; } }
|
||||
|
||||
|
||||
|
||||
|
||||
# Run a command. If called in the context of return an array, it will capture the output
|
||||
# of the cmd and return it. Otherwise, it will display the output to stdout.
|
||||
# If the cmd has a non-zero rc, this function will die with a msg.
|
||||
sub runcmd
|
||||
{
|
||||
my ($cmd) = @_;
|
||||
my $rc;
|
||||
|
||||
$cmd .= ' 2>&1' ;
|
||||
verbose($cmd);
|
||||
|
||||
my @output;
|
||||
if (wantarray) {
|
||||
@output = `$cmd`;
|
||||
$rc = $?;
|
||||
}
|
||||
else {
|
||||
system($cmd);
|
||||
$rc = $?;
|
||||
}
|
||||
|
||||
if ($rc) {
|
||||
$rc = $rc >> 8;
|
||||
if ($rc > 0) { die "Error: rc $rc return from cmd: $cmd\n"; }
|
||||
else { die "Error: system error returned from cmd: $cmd\n"; }
|
||||
}
|
||||
elsif (wantarray) { return @output; }
|
||||
}
|
||||
+102
-23
@@ -12,12 +12,14 @@ use Socket;
|
||||
# Globals - these are set once and then only read.
|
||||
my $HELP;
|
||||
my $VERBOSE;
|
||||
my $DRYRUN;
|
||||
my $WAITTIME;
|
||||
my $PROVMETHOD;
|
||||
my $XCATNETBOOTTITLE = 'xCAT network boot kernel and initrd';
|
||||
|
||||
my $usage = sub {
|
||||
my $exitcode = shift @_;
|
||||
print "Usage: modifygrub [-?|-h|--help] [-v|--verbose] [-w <waittime>] <kernel-path> <initrd-path> <kernel-parms> <mn-ip>\n\n";
|
||||
print "Usage: modifygrub [-?|-h|--help] [-v|--verbose] [--dryrun] [-w <waittime>] [-p <provmethod] <kernel-path> <initrd-path> <kernel-parms> <mn-ip>\n\n";
|
||||
if (!$exitcode) {
|
||||
print "Modify the grub config file on the node to boot the specified kernel and initrd.\n";
|
||||
}
|
||||
@@ -30,7 +32,7 @@ if (-f '/etc/os-release') { die "This script doesn't support ubuntu yet.\n"; }
|
||||
Getopt::Long::Configure("bundling");
|
||||
#Getopt::Long::Configure("pass_through");
|
||||
Getopt::Long::Configure("no_pass_through");
|
||||
if (!GetOptions('h|?|help' => \$HELP, 'v|verbose' => \$VERBOSE, 'w|waittime=s' => \$WAITTIME)) { $usage->(1); }
|
||||
if (!GetOptions('h|?|help' => \$HELP, 'v|verbose' => \$VERBOSE, 'dryrun' => \$DRYRUN, 'w|waittime=s' => \$WAITTIME, 'p|provmethod=s' => \$PROVMETHOD)) { $usage->(1); }
|
||||
|
||||
if ($HELP) { $usage->(0); }
|
||||
if (scalar(@ARGV) != 4) { $usage->(1); }
|
||||
@@ -58,41 +60,95 @@ sub addKernelParms {
|
||||
# replace <nodename> with the nodename
|
||||
my $nodename = $ENV{NODE}; # this env var is set by xdsh
|
||||
$args->{kernelparms} =~ s/<nodename>/$nodename/g;
|
||||
|
||||
# get node ip and add it to the kernel parms
|
||||
my ($nic, $ip, $netmask, $gateway) = getNodeIpInfo($args);
|
||||
my ($nic, $ip, $netmask, $network, $broadcast, $gateway, $mac) = getNodeIpInfo($args);
|
||||
if (!$ip) { die "Error: could not find the NIC that would connect to the xCAT mgmt node's IP (".$args->{mnip}.").\n"; }
|
||||
$args->{kernelparms} .= " hostip=$ip netmask=$netmask gateway=$gateway dns=$mnip hostname=$nodename netdevice=$nic netwait=$WAITTIME textmode=1";
|
||||
# if we are booting genesis, need to add the BOOTIF parm
|
||||
my $bootif;
|
||||
if ($args->{kernelpath} =~ m/genesis\.kernel\.x86_64/) {
|
||||
$bootif = $mac;
|
||||
$bootif =~ s/:/-/g;
|
||||
$bootif = "BOOTIF=01-$bootif";
|
||||
}
|
||||
|
||||
#todo: if you are running genesis shell (nodeset <node> shell), this if-else will depend on the nodeset done before that.
|
||||
# really should check for currstate=shell, or something like that
|
||||
if (defined($PROVMETHOD) && $PROVMETHOD eq 'sysclone') {
|
||||
# add additional parms for sysclone
|
||||
# DEVICE=eth0 IPADDR=10.0.0.99 NETMASK=255.255.255.0 NETWORK=10.0.0.0 BROADCAST=10.0.0.255 GATEWAY=10.0.0.1 GATEWAYDEV=eth0
|
||||
#todo: should we also add ETHER_SLEEP=$WAITTIME textmode=1 dns=$mnip ?
|
||||
$args->{kernelparms} .= " $bootif IPADDR=$ip NETMASK=$netmask NETWORK=$network BROADCAST=$broadcast GATEWAY=$gateway HOSTNAME=$nodename DEVICE=$nic GATEWAYDEV=$nic";
|
||||
}
|
||||
else { # scripted install
|
||||
#todo: the parameters for kickstart are likely different
|
||||
$args->{kernelparms} .= " $bootif hostip=$ip netmask=$netmask gateway=$gateway dns=$mnip hostname=$nodename netdevice=$nic netwait=$WAITTIME textmode=1";
|
||||
# print Dumper($args->{kernelparms})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# get this nodes nic, ip, netmask, and gateway. Returns them in a 4 element array.
|
||||
# get this nodes nic, ip, netmask, gateway, and mac. Returns them in a 5 element array.
|
||||
sub getNodeIpInfo {
|
||||
my $args = shift @_;
|
||||
my ($ipprefix) = $args->{mnip}=~m/^(\d+\.\d+)\./; #todo: this is a hack, just using the 1st 2 octets of the mn ip addr
|
||||
my ($ipprefix) = $args->{mnip}=~m/^(\d+)\./; #todo: this is a hack, just using the 1st octet of the mn ip addr
|
||||
verbose("using IP prefix $ipprefix");
|
||||
|
||||
# parse ip addr show output, looking for ipprefix, to determine nic and ip
|
||||
my @output = runcmd("ip addr show");
|
||||
my ($nic, $ipandmask);
|
||||
# parse ip addr show output, looking for ipprefix, to determine nic, ip, mac
|
||||
my @output = runcmd("/sbin/ip addr show");
|
||||
my ($nic, $mac, $ipandmask);
|
||||
foreach my $line (@output) {
|
||||
my ($nictmp, $iptmp);
|
||||
my ($nictmp, $mactmp, $iptmp);
|
||||
if (($nictmp) = $line=~m/^\d+:\s+(\S+): /) { $nic = $nictmp; } # new stanza, remember it
|
||||
if (($mactmp) = $line=~m|^\s+link/ether\s+(\S+) |) { $mac = $mactmp; } # got mac, remember it
|
||||
if (($iptmp) = $line=~m/^\s+inet\s+($ipprefix\S+) /) { $ipandmask = $iptmp; last; } # got ip, we are done
|
||||
}
|
||||
my ($ip, $netmask) = convertIpAndMask($ipandmask);
|
||||
if (!defined($ipandmask)) { die "Error: can't find a NIC with a prefix $ipprefix that communicates with".$args->{mnip}.".\n"; }
|
||||
my ($ip, $netmask, $network, $broadcast) = convertIpAndMask($ipandmask);
|
||||
|
||||
# if the nic is a bonded nic (common on sl), then find the 1st real nic that is part of it
|
||||
my $realnic = $nic;
|
||||
# if the nic is a bonded nic (common on sl), then find the 1st real nic that is up that is part of it.
|
||||
# also find that real nics real mac
|
||||
my $realnic;
|
||||
if ($nic =~ /^bond/) {
|
||||
my @nics = grep(m/\s+master\s+$nic\s+/, @output);
|
||||
if (!scalar(@nics)) { die "Error: can't find the NICs that are part of $nic.\n"; }
|
||||
($realnic) = $nics[0]=~m/^\d+:\s+(\S+): /;
|
||||
foreach my $line (@nics) {
|
||||
my ($nictmp, $state) = $line=~m/^\d+:\s+(\S+): .* state\s+(\S+)/;
|
||||
if (defined($nictmp) && defined($state) && $state eq 'UP') { $realnic = $nictmp; last; } # got ip, we are done
|
||||
}
|
||||
if (!defined($realnic)) { die "Error: can't find a physical NIC that is up and part of $nic.\n"; }
|
||||
|
||||
# now get the real mac of this real nic (when 2 nics are bonded, ip addr show displays one of the nics
|
||||
# macs for both nics and the bond). So we have to depend on /proc/net/bonding/$bond instead.
|
||||
my @bondout = runcmd("cat /proc/net/bonding/$nic");
|
||||
my $foundnic;
|
||||
foreach my $line (@bondout) {
|
||||
my $mactmp;
|
||||
if ($line=~m/^Slave Interface:\s+$realnic/) { $foundnic = 1; } # found the stanza for this nic, remember it
|
||||
if ($foundnic && (($mactmp) = $line=~m/^Permanent HW addr:\s+(\S+)/)) { $mac = $mactmp; last; }
|
||||
}
|
||||
}
|
||||
else { $realnic = $nic; }
|
||||
|
||||
# centos/redhat seems to name the nic in a different order than sles on some svrs.
|
||||
# sles seems to name them in the same order as 'ip addr show' displays them, centos does not.
|
||||
# so if we are on centos right now, we need to count down to determine the number that sles
|
||||
# will give the nic that we have selected, because it is the sles naming that we care about,
|
||||
# because that is the initrd that will be running in the scripted install case.
|
||||
# For the sysclone case, genesis doxcat should be changed to use the mac to find the nic.
|
||||
if (isRedhat()) {
|
||||
my @nics = grep(m/^\d+:\s+eth/, @output);
|
||||
my $i = 0;
|
||||
foreach my $line (@nics) {
|
||||
my ($nictmp) = $line=~m/^\d+:\s+(\S+):/;
|
||||
if (defined($nictmp) && $nictmp eq $realnic) { $realnic = "eth$i"; last; } # got ip, we are done
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
print "Determined that SLES will call the install NIC $realnic (it has mac $mac)\n";
|
||||
|
||||
# finally, find the gateway
|
||||
my $gateway;
|
||||
my @output = runcmd("ip route");
|
||||
my @output = runcmd("/sbin/ip route");
|
||||
# we are looking for a line like: 10.0.0.0/8 via 10.54.51.1 dev bond0
|
||||
my @networks = grep(m/ via .* $nic\s*$/, @output);
|
||||
if (scalar(@networks)) { ($gateway) = $networks[0]=~m/ via\s+(\S+)/; }
|
||||
@@ -102,19 +158,37 @@ sub getNodeIpInfo {
|
||||
verbose("using xCAT mgmt node IP as the fall back gateway.");
|
||||
}
|
||||
|
||||
verbose("IP info: realnic=$realnic, ip=$ip, netmask=$netmask, gateway=$gateway");
|
||||
return ($realnic, $ip, $netmask, $gateway);
|
||||
verbose("IP info: realnic=$realnic, ip=$ip, netmask=$netmask, gateway=$gateway, mac=$mac");
|
||||
return ($realnic, $ip, $netmask, $network, $broadcast, $gateway, $mac);
|
||||
}
|
||||
|
||||
|
||||
# Convert an ip/mask in slash notation (like 10.0.0.1/26) to separate ip and netmask like 10.0.0.1 and 255.255.255.192
|
||||
# Convert an ip/mask in slash notation (like 10.1.1.1/26) to separate ip, netmask, network, and broadcast values,
|
||||
# like: 10.1.1.1, 255.255.255.192, 10.1.1.0, 10.1.1.63
|
||||
sub convertIpAndMask {
|
||||
my $ipandmask = shift @_;
|
||||
my ($ip, $masknum) = split('/', $ipandmask);
|
||||
my $netbin = oct("0b" . '1' x $masknum . '0' x (32-$masknum)); # create a str like '1111100', then convert to binary
|
||||
my @netarr=unpack('C4',pack('N',$netbin)); # separate into the 4 octets
|
||||
my $netmask=join('.',@netarr); # put them together into the normal looking netmask
|
||||
return ($ip, $netmask);
|
||||
|
||||
# build the netmask
|
||||
my $nmbin = oct("0b" . '1' x $masknum . '0' x (32-$masknum)); # create a str like '1111100', then convert to binary
|
||||
my @nmarr=unpack('C4',pack('N',$nmbin)); # separate into the 4 octets
|
||||
my $netmask=join('.',@nmarr); # put them together into the normal looking netmask
|
||||
|
||||
# create binary form of ip
|
||||
my @iparr=split(/\./,$ip);
|
||||
my ( $ipbin ) = unpack('N', pack('C4',@iparr ) );
|
||||
|
||||
# Calculate network address by logical AND operation of ip & netmask and convert network address to IP address format
|
||||
my $netbin = ( $ipbin & $nmbin );
|
||||
my @netarr=unpack('C4', pack('N',$netbin ) );
|
||||
my $network=join(".",@netarr);
|
||||
|
||||
# Calculate broadcast address by inverting the netmask and adding it to the network address
|
||||
my $bcbin = ( $ipbin & $nmbin ) + ( ~ $nmbin );
|
||||
my @bcarr=unpack('C4', pack('N',$bcbin ) ) ;
|
||||
my $broadcast=join(".",@bcarr);
|
||||
|
||||
return ($ip, $netmask, $network, $broadcast);
|
||||
}
|
||||
|
||||
|
||||
@@ -155,6 +229,11 @@ sub updateGrub {
|
||||
"\tkernel " . $fileprefix . $args->{kernelpath} . ' ' . $args->{kernelparms} . "\n",
|
||||
"\tinitrd " . $fileprefix . $args->{initrdpath} . "\n",
|
||||
);
|
||||
if ($DRYRUN) {
|
||||
print "Dry run: would add this stanza to $grubfile:\n";
|
||||
foreach my $l (@entry) { print $l; }
|
||||
return;
|
||||
}
|
||||
|
||||
my $needtowritefile = 1;
|
||||
if (grep(/^title\s+$XCATNETBOOTTITLE/, @lines)) { $needtowritefile = updateGrubEntry(\@lines, \@entry); } # there is already an entry in there
|
||||
|
||||
+155
-21
@@ -13,12 +13,13 @@ use Data::Dumper;
|
||||
# Globals - these are set once and then only read.
|
||||
my $HELP;
|
||||
my $VERBOSE;
|
||||
my $DRYRUN;
|
||||
my $WAITTIME;
|
||||
my $NOAUTOINST;
|
||||
|
||||
my $usage = sub {
|
||||
my $exitcode = shift @_;
|
||||
print "Usage: pushinitrd [-?|-h|--help] [-v|--verbose] [-w <waittime>] <noderange>\n\n";
|
||||
print "Usage: pushinitrd [-?|-h|--help] [-v|--verbose] [--dryrun] [-w <waittime>] <noderange>\n\n";
|
||||
if (!$exitcode) {
|
||||
print "Copy the initrd, kernel, params, and static IP info to nodes, so they can net install\n";
|
||||
print "even across vlans (w/o setting up pxe/dhcp broadcast relay). This assumes a working\n";
|
||||
@@ -32,7 +33,7 @@ my $usage = sub {
|
||||
Getopt::Long::Configure("bundling");
|
||||
#Getopt::Long::Configure("pass_through");
|
||||
Getopt::Long::Configure("no_pass_through");
|
||||
if (!GetOptions('h|?|help' => \$HELP, 'v|verbose' => \$VERBOSE, 'w|waittime=s' => \$WAITTIME, 'a|noautoinst' => \$NOAUTOINST)) { $usage->(1); }
|
||||
if (!GetOptions('h|?|help' => \$HELP, 'v|verbose' => \$VERBOSE, 'dryrun' => \$DRYRUN, 'w|waittime=s' => \$WAITTIME, 'a|noautoinst' => \$NOAUTOINST)) { $usage->(1); }
|
||||
|
||||
if ($HELP) { $usage->(0); }
|
||||
if (scalar(@ARGV) != 1) { $usage->(1); }
|
||||
@@ -45,32 +46,45 @@ copyFilesToNodes($noderange, \%bootparms);
|
||||
|
||||
updateGrubOnNodes($noderange, \%bootparms);
|
||||
|
||||
if (!$NOAUTOINST) { modifyAutoinstFiles($noderange, \%bootparms); }
|
||||
if ($DRYRUN) { exit(0); }
|
||||
|
||||
if ($bootparms{osimageprovmethod} eq 'install' && !$NOAUTOINST) { modifyAutoinstFiles($noderange, \%bootparms); }
|
||||
|
||||
if ($bootparms{osimageprovmethod} eq 'sysclone') { copySyscloneFiles(); }
|
||||
|
||||
exit(0);
|
||||
|
||||
sub isRedhat { return (-e '/etc/redhat-release' || -e '/etc/centos-release' || -e '/etc/fedora-release'); }
|
||||
|
||||
# Query the db for the kernel, initrd, and kcmdline attributes of the 1st node in the noderange
|
||||
sub getBootParms {
|
||||
my $nr = shift @_;
|
||||
my %bootparms;
|
||||
my @output = runcmd("nodels $nr bootparams.kernel bootparams.initrd bootparams.kcmdline");
|
||||
my @output = runcmd("nodels $nr bootparams.kernel bootparams.initrd bootparams.kcmdline nodetype.provmethod");
|
||||
|
||||
# the attributes can be displayed in a different order than requested, so need to grep for them
|
||||
my @gresults;
|
||||
foreach my $a (qw(kernel initrd kcmdline)) {
|
||||
my $attr = "bootparams.$a";
|
||||
@gresults = grep(/^\S+:\s+$attr:/, @output);
|
||||
foreach my $attr (qw(bootparams.kernel bootparams.initrd bootparams.kcmdline nodetype.provmethod)) {
|
||||
my ($a) = $attr =~ m/\.(.*)$/;
|
||||
my @gresults = grep(/^\S+:\s+$attr:/, @output);
|
||||
if (!scalar(@gresults)) { die "Error: attribute $attr not defined for the noderange. Did you run 'nodeset <noderange> osimage=<osimage>' ?\n"; }
|
||||
# for now just pick the 1st one. They should all be the same, except for the node name in kcmdline
|
||||
chomp($gresults[0]);
|
||||
$gresults[0] =~ s/^\S+:\s+$attr:\s*//;
|
||||
#print "gresults='$gresults[0]'\n";
|
||||
if ($gresults[0] !~ m/\S/) { die "Error: attribute $attr not defined for the noderange. Did you run 'nodeset <noderange> osimage=<osimage>' ?\n"; }
|
||||
$bootparms{$a} = $gresults[0];
|
||||
if ($a eq 'kcmdline') { $bootparms{$a} =~ s|/install/autoinst/\S+|/install/autoinst/<nodename>|; }
|
||||
}
|
||||
$bootparms{kcmdline} =~ s|/install/autoinst/\S+|/install/autoinst/<nodename>|;
|
||||
|
||||
# from the nodes provmethod, get the osimage provmethod, so we know the type of install
|
||||
@output = runcmd("lsdef -t osimage $bootparms{provmethod} -ci provmethod");
|
||||
chomp($output[0]);
|
||||
if ($output[0] =~ m/^Could not find/) { die "Error: provmethod $bootparms{provmethod} is set for the node, but there is no osimage definition by that name."; }
|
||||
my ($junk, $provmethod) = split(/=/, $output[0]);
|
||||
$bootparms{osimageprovmethod} = $provmethod;
|
||||
|
||||
# get the mgmt node cluster-facing ip addr
|
||||
@output = runcmd('lsdef -t site -i master -c');
|
||||
@output = runcmd('lsdef -t site -ci master');
|
||||
chomp($output[0]);
|
||||
my ($junk, $ip) = split(/=/, $output[0]);
|
||||
$bootparms{mnip} = $ip;
|
||||
@@ -90,8 +104,13 @@ sub copyFilesToNodes {
|
||||
my $localfile = "/tftpboot/$file";
|
||||
# for the
|
||||
my $remotefile = '/boot/' . remoteFilename($file);
|
||||
print "Copying $localfile to $nr:$remotefile\n";
|
||||
runcmd("xdcp $nr -p $localfile $remotefile");
|
||||
if ($DRYRUN) {
|
||||
print "Dry run: would copy $localfile to $nr:$remotefile\n";
|
||||
}
|
||||
else {
|
||||
print "Copying $localfile to $nr:$remotefile\n";
|
||||
runcmd("xdcp $nr -p $localfile $remotefile");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,7 +118,7 @@ sub copyFilesToNodes {
|
||||
# Form the remote file name, using the last 2 parts of the path, separated by "-"
|
||||
sub remoteFilename {
|
||||
my $f = shift @_;
|
||||
$f =~ s|^.*/([^/]+)/([^/]+)$|$1-$2|;
|
||||
$f =~ s|^.*?([^/]+)/([^/]+)$|$1-$2|;
|
||||
return $f;
|
||||
}
|
||||
|
||||
@@ -110,10 +129,12 @@ sub updateGrubOnNodes {
|
||||
my $nr = shift @_;
|
||||
my $bootparms = shift @_;
|
||||
my $vtxt = ($VERBOSE ? '-v' : '');
|
||||
my $dtxt = ($DRYRUN ? '--dryrun' : '');
|
||||
my @output = runcmd('which modifygrub');
|
||||
my $modifygrub = $output[0];
|
||||
chomp($modifygrub);
|
||||
my $cmd = "xdsh $nr -e $modifygrub $vtxt -w $WAITTIME " . remoteFilename($bootparms->{kernel}) . ' ' . remoteFilename($bootparms->{initrd}) . ' ';
|
||||
my $euser ="root";
|
||||
my $cmd = "xdsh $nr -l $euser -e $modifygrub $vtxt $dtxt -w $WAITTIME -p " . $bootparms->{osimageprovmethod} . ' ' . remoteFilename($bootparms->{kernel}) . ' ' . remoteFilename($bootparms->{initrd}) . ' ';
|
||||
# we need to quote the kernel parms, both here when passing it to xdsh, and on the node
|
||||
# when xdsh is passing it to modifygrub. The way to get single quotes inside single quotes
|
||||
# is to quote each of the outer single quotes with double quotes.
|
||||
@@ -124,8 +145,7 @@ sub updateGrubOnNodes {
|
||||
}
|
||||
|
||||
|
||||
# Hack the autoinst files to wait in a key spot to make them work even tho it takes
|
||||
# the NICs almost a min before they can transmit after a state change.
|
||||
# Hack the autoinst files to overcome the nic coming up delay.
|
||||
#todo: this has only been tested with SLES nodes
|
||||
sub modifyAutoinstFiles {
|
||||
my $nr = shift @_;
|
||||
@@ -135,30 +155,144 @@ sub modifyAutoinstFiles {
|
||||
my @nodes = runcmd("nodels $nr");
|
||||
chomp(@nodes);
|
||||
|
||||
# Modify chroot.sles to insert a wait in the /etc/init.d/network of each node. This is
|
||||
# necessary because even tho compute.sles11.softlayer.tmpl configures bonding, when autoyast
|
||||
# reboots the node after installing the rpms, it does not bring up the network in the normal way
|
||||
# at first and seems to skip any bonding and the if-up.d scripts. So we are left doing this.
|
||||
# (After autoyast is done with all of its post-configuration, it brings up the network in the
|
||||
# normal way, so bonding gets done then, which is good at least.)
|
||||
|
||||
# Edit each file to have chroot.sles insert a wait at the end of /etc/init.d/network
|
||||
# this finds the end of boot.sh script (which is chroot.sles)
|
||||
my $search = '\n\]\]>\s*</source>\s*</script>\s*</chroot-scripts>';
|
||||
# hack the /etc/init.d/network script to put a wait in it
|
||||
my $file = '/mnt/etc/init.d/network'; # at this point in the installation, the permanent file system is just mounted
|
||||
#my $waitstring = 'echo Sleeping for 55s;sleep 55';
|
||||
# this is the string to insert in the nodes /etc/init.d/network script. It is a while loop pinging the mn, but some of the chars need to be escape for sed
|
||||
my $waitstring = 'echo Waiting to reach xCAT mgmt node...;while \[ \$\(\(xcati+=1\)\) -le 60 \] \&\& ! ping -c2 -w3 ' . $bootparms->{mnip} .'; do echo i=\$xcati ; done; sleep 10';
|
||||
# this is the string to insert in the nodes /etc/init.d/network script. It is a while loop pinging the mn, but some of the chars need to be escaped for sed
|
||||
my $waitstring = 'echo -n Waiting to reach xCAT mgmt node ' . $bootparms->{mnip} . '.;xcatretries=60;while \[ \$\(\(xcati+=1\)\) -le \$xcatretries \] \&\& ! ping -c2 -w3 ' . $bootparms->{mnip} .' \>\/dev\/null 2\>\&1; do echo -n .; done; if \[ \$xcati -le \$xcatretries \]; then echo success; else echo failed; fi';
|
||||
# this crazy sed string is from google. It gathers up the whole file into the hold buffer, and then the substitution is done on the whole file
|
||||
my $sedstring = q|sed -n '1h;1!H;${;g;s/\(\t\treload_firewall\n\)\n/\1\t\t| . $waitstring . q(\n\n/g;p;}') . " $file > $file.new";
|
||||
# finally create the perl replace string that will be used to modify the autoinst file
|
||||
my $replace = "$sedstring\nchmod 755 $file.new; mv -f $file.new $file";
|
||||
|
||||
# now actually update the file
|
||||
# Add a script that gets invoked by the OS after the nic is brought up
|
||||
# Note: this does not work, because midway thru the autoyast process, the if-up.d scripts do not seem to get invoked
|
||||
# so autoyast fails to get the media
|
||||
# these are specific to SLES
|
||||
#my $netdir = '/etc/sysconfig/network';
|
||||
#my $filename = '/etc/sysconfig/network/if-up.d/xcat-sl-wait';
|
||||
#my $mnip = $bootparms->{mnip};
|
||||
#todo: to support rhel, use these values instead
|
||||
#my $netdir='/etc/sysconfig/network-scripts';
|
||||
#my $filename='/sbin/ifup-local';
|
||||
#my $replace = qq(
|
||||
#FILENAME=$filename
|
||||
#NETDIR=$netdir
|
||||
#MNIP=$mnip
|
||||
#);
|
||||
# $replace .= q(
|
||||
#cat >$FILENAME << EOF1
|
||||
#MNIP=$MNIP
|
||||
#NETDIR=$NETDIR
|
||||
#EOF1
|
||||
#
|
||||
# this part of the file we do NOT want to expand the variables in the content
|
||||
#cat >>$FILENAME << 'EOF2'
|
||||
#NIC="$1"
|
||||
# look in this ifcfg script to get the nics ip to see if this is the one we should be waiting on
|
||||
#NICIP=`awk -F= '/^IPADDR/ {print $2}' $NETDIR/ifcfg-$NIC | tr -d \' `
|
||||
#if [ "${NICIP%.*.*}" != "${MNIP%.*.*}" ]; then exit; fi # hack: compare the 1st 2 octets
|
||||
#echo -n Waiting to reach xCAT mgmt node $MNIP.
|
||||
#xcatretries=60
|
||||
#while [ $((xcati+=1)) -le $xcatretries ] && ! ping -c2 -w3 $MNIP >/dev/null 2>&1; do echo -n .; done
|
||||
#if [ $xcati -le $xcatretries ]; then echo " success"; else echo " failed"; fi
|
||||
#sleep 3
|
||||
#EOF2
|
||||
#
|
||||
#chmod +x $FILENAME
|
||||
#);
|
||||
|
||||
# The compute.sles11.softlayer.tmpl file contains 2 variables (node ip and netmask) that are
|
||||
# not replaced by Template.pm. Substitute those in the autoinst files now.
|
||||
# Also use our own multiline sed to put the network script hack in.
|
||||
print "Updating /install/autoinst files.\n";
|
||||
foreach my $n (@nodes) {
|
||||
my $f = "/install/autoinst/$n";
|
||||
my ($ip, $netmask, $gateway) = getNodeIpInfo($n);
|
||||
runcmd("sudo sed -i 's/#NODEIPADDR#/$ip/;s/#NODENETMASK#/$netmask/;s/#NODEGATEWAY#/$gateway/' $f");
|
||||
my $matches = sed($f, $search, $replace, mode=>'insertbefore');
|
||||
if (!$matches) { die "Error: could not find the right place in $f to insert the sed of the network wait.\n"; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Copy softlayer specific systemimager post-install scripts to the systemimager location.
|
||||
# These cause si to use static ip and insert a wait into the bring up of the network.
|
||||
sub copySyscloneFiles {
|
||||
my $cmd = "cp -f /opt/xcat/share/xcat/sysclone/post-install/* /install/sysclone/scripts/post-install";
|
||||
print "Copying SoftLayer-specific post scripts to the SystemImager post-install directory.\n";
|
||||
runcmd($cmd);
|
||||
}
|
||||
|
||||
|
||||
# Get IP and network of a node
|
||||
sub getNodeIpInfo {
|
||||
my $node = shift;
|
||||
|
||||
# get ip for the node
|
||||
my @output = runcmd("nodels $node hosts.ip");
|
||||
chomp($output[0]);
|
||||
my ($junk, $ip) = split(/\s+/, $output[0]);
|
||||
#todo: also support getting the ip from name resolution
|
||||
if (!$ip) { die "Error: the ip attribute must be set for $node.\n"; }
|
||||
|
||||
# find relevant network in the networks table
|
||||
# first get the networks in a hash
|
||||
my %networks;
|
||||
@output = runcmd("lsdef -t network -ci net,mask,gateway");
|
||||
foreach my $line (@output) {
|
||||
chomp($line);
|
||||
my ($netname, $attr, $val) = $line =~ m/^(.+):\s+(.+?)=(.+)$/;
|
||||
$networks{$netname}->{$attr} = $val;
|
||||
}
|
||||
# now go thru the networks looking for the correct one
|
||||
my ($netmask, $gateway);
|
||||
foreach my $key (keys %networks) {
|
||||
if (isIPinNet($ip, $networks{$key}->{net}, $networks{$key}->{mask})) { # found it
|
||||
$netmask = $networks{$key}->{mask};
|
||||
$gateway = $networks{$key}->{gateway};
|
||||
last;
|
||||
}
|
||||
}
|
||||
if (!$netmask) { die "Error: could not find a network in the networks table that $node $ip is part of.\n"; }
|
||||
if (!$gateway) { die "Error: gateway not specified in the networks table for the network that $node $ip is part of.\n"; }
|
||||
|
||||
verbose("IP info for $node: ip=$ip, netmask=$netmask, gateway=$gateway");
|
||||
return ($ip, $netmask, $gateway);
|
||||
}
|
||||
|
||||
|
||||
# Is the IP in the network/netmask combo
|
||||
sub isIPinNet {
|
||||
my ($ip, $net, $mask) = @_;
|
||||
my $ipbin = convert2bin($ip);
|
||||
my $netbin = convert2bin($net);
|
||||
my $maskbin = convert2bin($mask);
|
||||
$ipbin &= $maskbin;
|
||||
if ($ipbin && $netbin && ($ipbin == $netbin)) { return 1; }
|
||||
else { return 0; }
|
||||
}
|
||||
|
||||
|
||||
# Convert dotted decimal format (1.2.3.4) to a binary number
|
||||
sub convert2bin {
|
||||
my @arr=split(/\./, shift);
|
||||
my ($bin) = unpack('N', pack('C4',@arr ) );
|
||||
return $bin;
|
||||
}
|
||||
|
||||
|
||||
# this is like multi-line sed replace function
|
||||
# Args: filename, search-string, replace-string
|
||||
# Args: filename, search-string, replace-string, options (mode=>{insertbefore,insertafter,replace})
|
||||
sub sed {
|
||||
my ($file, $search, $replace, %options) = @_;
|
||||
#my $opts = 's';
|
||||
|
||||
Executable
+248
@@ -0,0 +1,248 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# xCAT postscript for configuring bonding of nics.
|
||||
# Usage: configbond bond1 eth1 [eth3]
|
||||
#
|
||||
# Note: this postscript currently has some assumptions that are specific to the softlayer environment.
|
||||
# We only use this to configure bond1, because bond0 gets configured by the node provisioning process.
|
||||
# (altho this script would work for bond0)
|
||||
|
||||
use strict;
|
||||
# Check number of args
|
||||
|
||||
my $nargs = $#ARGV + 1;
|
||||
if (scalar(@ARGV) < 2 || scalar(@ARGV) > 3) {
|
||||
system("logger -t xcat -p local4.err 'Usage: configbond <bond> <dev0> [<dev1>]'");
|
||||
exit 1;
|
||||
}
|
||||
|
||||
my $bond = shift(@ARGV);
|
||||
my $nic = $ARGV[0];
|
||||
my @devs;
|
||||
foreach my $a (@ARGV) { push(@devs,split('@',$a)); } # support the new syntax in the xcat configbond postscript
|
||||
my $nicips = $ENV{NICIPS};
|
||||
my $nicnetworks = $ENV{NICNETWORKS};
|
||||
my $net_cnt = $ENV{NETWORKS_LINES};
|
||||
|
||||
#todo: change this script so they dont need to specify nicnetworks
|
||||
if (!$nicips || !$nicnetworks) { system("logger -t xcat -p local4.err 'configbond: must specify attributes nicips and nicnetworks in the xcat db for this node.'"); exit 1; }
|
||||
|
||||
#todo: these are specific to softlayer. They should be another attribute or argument
|
||||
my $bondingopts = 'mode=4 miimon=100 downdelay=0 updelay=0 lacp_rate=fast xmit_hash_policy=1';
|
||||
|
||||
my $netmask ='';
|
||||
my $ipaddr = '';
|
||||
my $nic_num = '';
|
||||
my $subnet = '';
|
||||
my $nic_net = '';
|
||||
my $net_name = '';
|
||||
my @nic_nets = (); # array of networks for this nic
|
||||
my @nic_ips =(); # array of ipaddresses for this nic
|
||||
my @networks = (); # array of all networks from networks table.
|
||||
# { network_name, subnet, netmask }
|
||||
|
||||
system("logger -t xcat -p local4.err 'configbond: Master: $bond'");
|
||||
system("logger -t xcat -p local4.err 'configbond: Slaves: @devs'");
|
||||
#system("logger -t xcat -p local4.err 'configbond: NIC: $nic'");
|
||||
system("logger -t xcat -p local4.err 'configbond: NICNETWORKS: $nicnetworks'");
|
||||
system("logger -t xcat -p local4.err 'configbond: NICIPS: $nicips'");
|
||||
|
||||
# Update modprobe
|
||||
my $file = "/etc/modprobe.d/$bond.conf";
|
||||
if (!open(FILE, ">$file")) { system("logger -t xcat -p local4.err 'configbond: cannot open $file.'"); exit 1; }
|
||||
|
||||
print FILE "alias $bond bonding\n";
|
||||
# the bonding options are put in the ifcfg file instead
|
||||
#print FILE "options $bond mode=balance-rr miimon=100\n";
|
||||
close FILE;
|
||||
|
||||
# create array of network info. Needed in case where there are
|
||||
# more than one ip address per nic and shouldn't be many networks.
|
||||
my $net_info;
|
||||
my $cnt = 1;
|
||||
|
||||
while ( $cnt <= $net_cnt ) {
|
||||
$net_info = $ENV{"NETWORKS_LINE$cnt"};
|
||||
$net_info =~ /^netname=([^\|]*)\|\|/;
|
||||
$net_name = $1;
|
||||
$net_info =~ /net=([^\|]*)\|\|/;
|
||||
$subnet = $1;
|
||||
$net_info =~ /mask=([^\|]*)\|\|/;
|
||||
$netmask = $1;
|
||||
push @{ $networks[$cnt-1] }, ($net_name, $subnet, $netmask);
|
||||
$cnt +=1;
|
||||
}
|
||||
|
||||
# get network or networks for this nic from NICNETWORKS:
|
||||
# eth0:1_0_0_0-255_255_0_0|network2,eth1:1_1_0_0
|
||||
# create array of networks for this nic
|
||||
foreach my $nic_networks (split(/,/,$nicnetworks)) {
|
||||
my @net = ();
|
||||
if ( $nic_networks =~ /!/ ) {
|
||||
@net = split(/!/,$nic_networks);
|
||||
} else {
|
||||
@net = split(/:/,$nic_networks);
|
||||
}
|
||||
if ($net[0] eq $nic) {
|
||||
@nic_nets = split(/\|/,$net[1]);
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
# get all nic ipaddress from $nicips: i.e. eth0:1.0.0.1|2.0.0.1,eth1:1.1.1.1
|
||||
# Then get all ips for this specific nic, i.e. eth0.
|
||||
foreach my $ips (split(/,/,$nicips)) {
|
||||
my @ip = ();
|
||||
if ( $ips =~ /!/ ) {
|
||||
@ip = split(/!/,$ips);
|
||||
} else {
|
||||
@ip = split(/:/,$ips);
|
||||
}
|
||||
if ($ip[0] eq $nic ) {
|
||||
@nic_ips = split(/\|/,$ip[1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
my $i;
|
||||
for ($i=0; $i < (scalar @nic_ips) ; $i++ ) {
|
||||
|
||||
# Time to create the interfaces.
|
||||
# loop through the nic networks, find the matching networks to get the
|
||||
# subnet and netmask and then create the appropriate ifcfg file for linux
|
||||
my $specific_nic = $nic;
|
||||
if ($i > 0) {
|
||||
$specific_nic = $nic . ":" . ($i);
|
||||
}
|
||||
|
||||
#todo: support case in which nicnetworks is not specified, find the correct network by calculation
|
||||
$cnt = 0;
|
||||
$subnet = "";
|
||||
$netmask = "";
|
||||
$net_name = "";
|
||||
while ( $cnt < $net_cnt ) {
|
||||
if ( $networks[$cnt][0] eq $nic_nets[$i] ) {
|
||||
|
||||
$subnet = $networks[$cnt][1];
|
||||
$netmask = $networks[$cnt][2];
|
||||
$cnt = $net_cnt; # found match - get out.
|
||||
}
|
||||
else {
|
||||
$cnt++;
|
||||
}
|
||||
}
|
||||
|
||||
# check that there is a subnet and netmask set
|
||||
if ( !(length($subnet) > 0) || !(length($netmask) > 0) ) {
|
||||
system("logger -t xcat -p local4.err 'configbond: network subnet or netmask not set.'");
|
||||
exit 1;
|
||||
}
|
||||
system("logger -t xcat -p local4.err 'configbond: network subnet and netmask: $subnet, $netmask'");
|
||||
system("logger -t xcat -p local4.err 'configbond: $specific_nic, $nic_ips[$i]'");
|
||||
|
||||
# Write the master info to the ifcfg file
|
||||
if (-d "/etc/sysconfig/network-scripts") {
|
||||
# rhel/centos/fedora
|
||||
my $dir = "/etc/sysconfig/network-scripts";
|
||||
if (!open(FILE, ">$dir/ifcfg-$bond")) { system("logger -t xcat -p local4.err 'configbond: cannot open $dir/ifcfg-$bond.'"); exit 1; }
|
||||
|
||||
print FILE "DEVICE=$bond\n";
|
||||
print FILE "BOOTPROTO=none\n";
|
||||
print FILE "IPADDR=$nic_ips[$i]\n";
|
||||
print FILE "NETMASK=$netmask\n";
|
||||
print FILE "ONBOOT=yes\n";
|
||||
print FILE "USERCTL=no\n";
|
||||
print FILE qq(BONDING_OPTS="$bondingopts"\n);
|
||||
close FILE;
|
||||
|
||||
# Configure slaves
|
||||
my @output = `ip addr show 2>&1`; # to check for existance of the device later
|
||||
foreach my $dev (@devs) {
|
||||
# as a convenience, make sure the device exists before adding it to the bond
|
||||
if (!grep(m/^\d+:\s+$dev:/, @output)) {
|
||||
system("logger -t xcat -p local4.err 'configbond: not configuring $dev because it does not exist.'");
|
||||
unlink("$dir/ifcfg-$dev"); # in case it was left over in the image we are cloning
|
||||
next;
|
||||
}
|
||||
|
||||
system("logger -t xcat -p local4.err 'configbond: slave dev: $dev'");
|
||||
if (!open(FILE, ">$dir/ifcfg-$dev")) { system("logger -t xcat -p local4.err 'configbond: cannot open $dir/ifcfg-$dev'"); exit 1; }
|
||||
print FILE "DEVICE=$dev\n";
|
||||
print FILE "BOOTPROTO=none\n";
|
||||
print FILE "MASTER=$bond\n";
|
||||
print FILE "ONBOOT=yes\n";
|
||||
print FILE "SLAVE=yes\n";
|
||||
print FILE "USERCTL=no\n";
|
||||
close FILE;
|
||||
}
|
||||
}
|
||||
elsif (-d "/etc/sysconfig/network") {
|
||||
# sles
|
||||
my $dir = "/etc/sysconfig/network";
|
||||
if (!open(FILE, ">$dir/ifcfg-$bond")) { system("logger -t xcat -p local4.err 'configbond: cannot open $dir/ifcfg-$bond.'"); exit 1; }
|
||||
|
||||
print FILE "BOOTPROTO=static\n";
|
||||
print FILE "BONDING_MASTER=yes\n";
|
||||
print FILE "BONDING_MODULE_OPTS='$bondingopts'\n";
|
||||
print FILE "NAME='Bonded Interface'\n";
|
||||
print FILE "IPADDR=$nic_ips[$i]\n";
|
||||
print FILE "NETMASK=$netmask\n";
|
||||
print FILE "STARTMODE=onboot\n";
|
||||
print FILE "USERCONTROL=no\n";
|
||||
my $devnum = 0;
|
||||
my @output = `ip addr show 2>&1`; # to check for existance of the device later
|
||||
foreach my $dev (@devs) {
|
||||
if (!grep(m/^\d+:\s+$dev:/, @output)) { next; }
|
||||
print FILE "BONDING_SLAVE_$devnum=$dev\n";
|
||||
$devnum++;
|
||||
}
|
||||
close FILE;
|
||||
|
||||
# Configure slaves
|
||||
foreach my $dev (@devs) {
|
||||
# as a convenience, make sure the device exists before adding it to the bond
|
||||
if (!grep(m/^\d+:\s+$dev:/, @output)) {
|
||||
system("logger -t xcat -p local4.err 'configbond: not configuring $dev because it does not exist.'");
|
||||
unlink("$dir/ifcfg-$dev"); # in case it was left over in the image we are cloning
|
||||
next;
|
||||
}
|
||||
|
||||
system("logger -t xcat -p local4.err 'configbond: slave dev: $dev'");
|
||||
if (!open(FILE, ">$dir/ifcfg-$dev")) { system("logger -t xcat -p local4.err 'configbond: cannot open $dir/ifcfg-$dev'"); exit 1; }
|
||||
print FILE "BOOTPROTO=none\n";
|
||||
print FILE "STARTMODE=hotplug\n";
|
||||
close FILE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
# do not recognize this distro
|
||||
system("logger -t xcat -p local4.err 'configbond: network directory is not either the Red Hat or SuSE format.'");
|
||||
exit 1;
|
||||
}
|
||||
|
||||
# Apply the changes. Since we are only doing bond1 right now, lets not restart the whole network
|
||||
# so we dont disrupt the installnic connection. Instead we just need to bring down the slave nics,
|
||||
# and then bring up the bond nic.
|
||||
#runcmd("service network restart");
|
||||
foreach my $dev (@devs) {
|
||||
runcmd("ifdown $dev");
|
||||
}
|
||||
runcmd("ifdown $bond"); # in case it was already up
|
||||
runcmd("ifup $bond"); # note: this wont reload the bonding kernel module, so we are depending on the provisioning process to already have set the correct bonding options
|
||||
system("logger -t xcat -p local4.info 'configbond: successfully configured $specific_nic.'");
|
||||
|
||||
}
|
||||
exit 0;
|
||||
|
||||
sub runcmd {
|
||||
my $cmd = shift @_;
|
||||
$cmd .= ' 2>&1';
|
||||
my @output = `$cmd`;
|
||||
my $rc = $? >> 8;
|
||||
if ($rc) {
|
||||
system("logger -t xcat -p local4.err 'configeth: command $cmd failed with rc $rc: " . join('',@output) . "'");
|
||||
my $errout= "configeth: command $cmd failed with rc $rc.";
|
||||
`echo $errout`;
|
||||
exit $rc;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
# set the default route of the node to the ip address and nic passed in
|
||||
# this should be added to the postbootscripts, NOT postscripts
|
||||
|
||||
set -x
|
||||
ip route replace to default via $1 dev $2
|
||||
gateway="$1"
|
||||
nic="$2"
|
||||
|
||||
# set it temporarily
|
||||
echo "ip route replace to default via $gateway dev $nic"
|
||||
ip route replace to default via $gateway dev $nic
|
||||
|
||||
# set it permanently
|
||||
#todo: this is only for sles right now
|
||||
file=/etc/sysconfig/network/routes
|
||||
if grep -q -E '^default ' $file; then
|
||||
# replace the default route that is already in there
|
||||
sed -i 's/^default .*$/default '$gateway' - -/' $file
|
||||
else
|
||||
# no default route yet, append to file
|
||||
echo "default $gateway - -" >>$file
|
||||
fi
|
||||
|
||||
# While we are here, clean up the network wait hack, if it is still there.
|
||||
# (It was added during scripted install, because autoyast will not use the bond
|
||||
# configuration for 1 part of the process.) Do not know a better place to clean
|
||||
# this up.
|
||||
sed -i '/Waiting to reach xCAT mgmt node/d' /etc/init.d/network
|
||||
@@ -67,7 +67,6 @@
|
||||
</user>
|
||||
</users>
|
||||
<networking>
|
||||
<keep_install_network config:type="boolean">true</keep_install_network>
|
||||
<dns>
|
||||
<domain>#TABLE:site:key=domain:value#</domain>
|
||||
<hostname>#TABLE:nodelist:$NODE:node#</hostname>
|
||||
@@ -78,10 +77,53 @@
|
||||
<search>#TABLE:site:key=domain:value#</search>
|
||||
</searchlist>
|
||||
</dns>
|
||||
<interfaces config:type="list">
|
||||
<interface>
|
||||
<bonding_master>yes</bonding_master>
|
||||
<bonding_module_opts>mode=4 miimon=100 downdelay=0 updelay=0 lacp_rate=fast xmit_hash_policy=1</bonding_module_opts>
|
||||
<bonding_slave0>eth0</bonding_slave0>
|
||||
<bonding_slave1>eth2</bonding_slave1>
|
||||
<device>bond0</device>
|
||||
<bootproto>static</bootproto>
|
||||
<startmode>auto</startmode>
|
||||
<ipaddr>#NODEIPADDR#</ipaddr>
|
||||
<netmask>#NODENETMASK#</netmask>
|
||||
<usercontrol>no</usercontrol>
|
||||
</interface>
|
||||
<interface>
|
||||
<bootproto>none</bootproto>
|
||||
<device>eth0</device>
|
||||
<name>Ethernet Card 0</name>
|
||||
<startmode>off</startmode>
|
||||
</interface>
|
||||
<interface>
|
||||
<bootproto>none</bootproto>
|
||||
<device>eth2</device>
|
||||
<name>Ethernet Card 2</name>
|
||||
<startmode>off</startmode>
|
||||
</interface>
|
||||
</interfaces>
|
||||
<routing>
|
||||
<ip_forward config:type="boolean">false</ip_forward>
|
||||
<routes config:type="list">
|
||||
<route>
|
||||
<destination>default</destination>
|
||||
<device>-</device>
|
||||
<gateway>#NODEGATEWAY#</gateway>
|
||||
<netmask>-</netmask>
|
||||
</route>
|
||||
</routes>
|
||||
</routing>
|
||||
</networking>
|
||||
<files config:type="list">
|
||||
<file>
|
||||
<file_contents><![CDATA[alias bond0 bonding
|
||||
]]></file_contents>
|
||||
<file_owner>root</file_owner>
|
||||
<file_path>/etc/modprobe.d/bond0.conf</file_path>
|
||||
<file_permissions>644</file_permissions>
|
||||
</file>
|
||||
</files>
|
||||
<scripts>
|
||||
#INCLUDE:#ENV:XCATROOT#/share/xcat/install/scripts/pre.sles#
|
||||
#INCLUDE:#ENV:XCATROOT#/share/xcat/install/scripts/chroot.sles#
|
||||
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
#!/bin/bash
|
||||
|
||||
# SI post-install script to configure the efi boot mgr or grub after SI has installed the OS
|
||||
# SI post-install scripts run in a chroot environment of the final OS image
|
||||
|
||||
if [ -d /sys/firmware/efi ]; then
|
||||
echo "Setting Boot Manager for the next boot."
|
||||
echo "delete all sysclone boot list"
|
||||
str_bootnums=`efibootmgr | grep 'syscloneLinux' | awk '{print $1}' | sed 's/boot//i' | sed 's/*//'`
|
||||
for str_num in $str_bootnums
|
||||
do
|
||||
efibootmgr -b $str_num -B -q
|
||||
done
|
||||
|
||||
if [ -f "/boot/efi/EFI/redhat/grub.efi" ];then
|
||||
efibootmgr -c -l \\EFI\\redhat\\grub.efi -L syscloneLinux
|
||||
elif [ -f "/boot/efi/efi/SuSE/elilo.efi" ];then
|
||||
efibootmgr -c -l \\efi\\SuSE\\elilo.efi -L syscloneLinux
|
||||
else
|
||||
echo "Can not find the boot loader."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "run grub-install to configure the MBR."
|
||||
if [ -e /etc/mtab ];then
|
||||
mv /etc/mtab /etc/mtab.bak
|
||||
fi
|
||||
grep -v rootfs /proc/mounts > /etc/mtab
|
||||
boot_device=''
|
||||
if [ -f "/etc/systemconfig/systemconfig.conf" ];then
|
||||
boot_device=`cat /etc/systemconfig/systemconfig.conf | grep BOOTDEV | awk '{print $3}'`
|
||||
else
|
||||
boot_root=`mount | grep -E ' on\s+/ type ' | awk '{print $1}'`
|
||||
boot_device=`echo $boot_root | sed -e 's/[0-9]*$//'`
|
||||
|
||||
#str_temp=`mount | awk '{print $1","$3}'`
|
||||
#for line in $str_temp
|
||||
#do
|
||||
# mp=`echo $line | awk -F, '{print $2}'`
|
||||
# if [ "$mp" = "/" ];then
|
||||
# boot_device=`echo $line | awk -F, '{print $1}' | sed -e 's/[0-9]*$//'`
|
||||
# break
|
||||
# fi
|
||||
#done
|
||||
fi
|
||||
|
||||
if [ -n "$boot_device" ];then
|
||||
echo "The boot device is $boot_device"
|
||||
echo "The boot root device is $boot_root"
|
||||
else
|
||||
echo "Can not find the boot device, return error"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# set grub to use this boot device
|
||||
if grep -qe '^VERSION\s*=\s*11' /etc/SuSE-release; then
|
||||
#sles11, run grub-install.unsupported directly
|
||||
echo "grub-install.unsupported --no-floppy --recheck $boot_device"
|
||||
grub-install.unsupported --no-floppy --recheck $boot_device
|
||||
# note: the error about grub-set-default not existing is harmless, because we want the default to be 0 anyway
|
||||
else
|
||||
#for sles10, should run grub-install with parameters
|
||||
echo "grub-install --no-floppy --recheck $boot_device"
|
||||
grub-install --no-floppy --recheck $boot_device
|
||||
fi
|
||||
|
||||
# change the entries in the grub conf file to use the correct boot root device
|
||||
# (not the one leftover from the golden image)
|
||||
if [ -f "/boot/grub/grub.conf" ];then
|
||||
conffile="/boot/grub/grub.conf"
|
||||
else
|
||||
conffile="/boot/grub/menu.lst"
|
||||
fi
|
||||
sed -i 's| root=\S*| root='$boot_root'|' $conffile
|
||||
sed -i 's| resume=\S*| noresume|' $conffile
|
||||
|
||||
if [ -e /etc/mtab.bak ];then
|
||||
mv -f /etc/mtab.bak /etc/mtab
|
||||
else
|
||||
rm -f /etc/mtab
|
||||
fi
|
||||
fi
|
||||
+209
@@ -0,0 +1,209 @@
|
||||
#!/bin/bash
|
||||
|
||||
# SI post-install script to configure network settings after SI has installed the OS
|
||||
# SI post-install scripts run in a chroot environment of the final OS image
|
||||
|
||||
. /tmp/post-install/variables.txt
|
||||
|
||||
bondingopts='mode=4 miimon=100 downdelay=0 updelay=0 lacp_rate=fast xmit_hash_policy=1'
|
||||
|
||||
# determine if we should be using a static ip or dhcp
|
||||
staticIP () {
|
||||
# Eventually we should use the SI variable IP_ASSIGNMENT_METHOD below to determine this.
|
||||
# But this requires a patch in both xcat/sysclone (to set si_getimage -ip-assignment method)
|
||||
# and SI (to set IP_ASSIGNMENT_METHOD as a result of that). Until both of those patches
|
||||
# are in the main releases, assume that if we have set the IPADDR kernel parm for the boot
|
||||
# kernel to use static ip, that the final OS should use static ip too.
|
||||
# Note: the IPADDR environment variable will be set by SI, even if it got it thru dhcp, so
|
||||
# that is not a reliable way to decide.
|
||||
str=`cat /proc/cmdline`
|
||||
#str='netmask=255.255.255.192 IPADDR=10.54.51.11 GATEWAY=10.54.51.1 dns=10.54.51.2 hostname=sap64-4 DEVICE=eth0'
|
||||
for parm in $str; do
|
||||
key=`echo $parm|awk -F= '{print $1}'`
|
||||
value=`echo $parm|awk -F= '{print $2}'`
|
||||
if [[ $key == "IPADDR" || $key == "ipaddr" ]]; then
|
||||
return 0 # yes, we should use static ip
|
||||
fi
|
||||
done
|
||||
if [[ -n $IP_ASSIGNMENT_METHOD && ${IP_ASSIGNMENT_METHOD,,} == "static" ]]; then
|
||||
return 0 # this means yes/true
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
#delete the udev rule in the image
|
||||
rule_file=`ls /etc/udev/rules.d/*net_persistent_names.rules 2>/dev/null`
|
||||
if [ -n "$rule_file" ];then
|
||||
rm -f $rule_file
|
||||
fi
|
||||
|
||||
hostname $HOSTNAME
|
||||
bond=bond0
|
||||
# this is a softlayer assumption that the two devices on the private net will be eth0 and eth2
|
||||
if [[ $DEVICE == "eth0" ]]; then
|
||||
DEVICE2=eth2
|
||||
elif [[ $DEVICE == "eth2" ]]; then
|
||||
DEVICE2=eth0
|
||||
fi
|
||||
ip addr show|grep -q -E "^[0-9]+:\s+$DEVICE2:" # make sure it exists on the system
|
||||
if [[ $? == 0 ]]; then
|
||||
DEVICE2EXISTS="yes"
|
||||
fi
|
||||
|
||||
device_names=`ifconfig -a | grep -i hwaddr | grep -i 'Ethernet' | grep -v usb| awk '{print $1}'`
|
||||
str_cfg_file=''
|
||||
if [ -d "/etc/sysconfig/network-scripts/" ];then
|
||||
#redhat
|
||||
dir="/etc/sysconfig/network-scripts"
|
||||
grep -i HOSTNAME /etc/sysconfig/network
|
||||
if [ $? -eq 0 ];then
|
||||
sed -i "s/HOSTNAME=.*/HOSTNAME=$HOSTNAME/g" /etc/sysconfig/network
|
||||
else
|
||||
echo "HOSTNAME=$HOSTNAME" >> /etc/sysconfig/network
|
||||
fi
|
||||
if staticIP; then
|
||||
# delete all nic cfg files left over from the golden node
|
||||
for i in $device_names;do
|
||||
rm -f "$dir/ifcfg-$i"
|
||||
done
|
||||
|
||||
# set static ip from variables in variables.txt
|
||||
# write ifcfg-bond0. For now we assume the installnic should be part of bond0,
|
||||
# because in SL i think that is always the case.
|
||||
i="$bond"
|
||||
str_cfg_file="$dir/ifcfg-$i"
|
||||
echo "DEVICE=$i" > $str_cfg_file
|
||||
echo "BOOTPROTO=none" >> $str_cfg_file
|
||||
echo "ONBOOT=yes" >> $str_cfg_file
|
||||
echo "USERCTL=no" >> $str_cfg_file
|
||||
echo 'BONDING_OPTS="'$bondingopts'"' >> $str_cfg_file
|
||||
echo "IPADDR=$IPADDR" >> $str_cfg_file
|
||||
echo "NETMASK=$NETMASK" >> $str_cfg_file
|
||||
echo "NETWORK=$NETWORK" >> $str_cfg_file
|
||||
echo "BROADCAST=$BROADCAST" >> $str_cfg_file
|
||||
#todo: add gateway config? Not sure, because the boot kernels gateway might not be the final OS gateway
|
||||
|
||||
# write ifcfg-eth0
|
||||
i="$DEVICE"
|
||||
str_cfg_file="$dir/ifcfg-$i"
|
||||
echo "DEVICE=$i" > $str_cfg_file
|
||||
echo "BOOTPROTO=none" >> $str_cfg_file
|
||||
echo "MASTER=$bond" >> $str_cfg_file
|
||||
echo "ONBOOT=yes" >> $str_cfg_file
|
||||
echo "SLAVE=yes" >> $str_cfg_file
|
||||
echo "USERCTL=no" >> $str_cfg_file
|
||||
|
||||
i="$DEVICE2"
|
||||
str_cfg_file="$dir/ifcfg-$i"
|
||||
if [[ $DEVICE2EXISTS == "yes" ]]; then
|
||||
# write ifcfg-eth2
|
||||
echo "DEVICE=$i" > $str_cfg_file
|
||||
echo "BOOTPROTO=none" >> $str_cfg_file
|
||||
echo "MASTER=$bond" >> $str_cfg_file
|
||||
echo "ONBOOT=yes" >> $str_cfg_file
|
||||
echo "SLAVE=yes" >> $str_cfg_file
|
||||
echo "USERCTL=no" >> $str_cfg_file
|
||||
else
|
||||
rm -f $str_cfg_file # in case it was left over in the image that was captured
|
||||
fi
|
||||
|
||||
# write modprobe alias config
|
||||
str_cfg_file="/etc/modprobe.d/$bond.conf"
|
||||
echo "alias $bond bonding" > $str_cfg_file
|
||||
|
||||
#todo: figure out how to set the default gateway in rhel
|
||||
else
|
||||
# use dhcp for all nics
|
||||
for i in $device_names;do
|
||||
str_cfg_file="$dir/ifcfg-$i"
|
||||
echo "DEVICE=$i" > $str_cfg_file
|
||||
echo "BOOTPROTO=dhcp" >> $str_cfg_file
|
||||
echo "NM_CONTROLLED=yes" >> $str_cfg_file
|
||||
echo "ONBOOT=yes" >> $str_cfg_file
|
||||
done
|
||||
fi
|
||||
elif [ -d "/etc/sysconfig/network/" ];then
|
||||
#suse
|
||||
dir="/etc/sysconfig/network"
|
||||
echo "$HOSTNAME" > /etc/HOSTNAME
|
||||
if staticIP; then
|
||||
# delete all nic cfg files left over from the golden node
|
||||
for i in $device_names;do
|
||||
rm -f "$dir/ifcfg-$i"
|
||||
done
|
||||
|
||||
# set static ip from variables in variables.txt
|
||||
# write ifcfg-bond0. For now we assume the installnic should be part of bond0,
|
||||
# because in SL i think that is always the case.
|
||||
i="$bond"
|
||||
str_cfg_file="$dir/ifcfg-$i"
|
||||
echo "BOOTPROTO=static" > $str_cfg_file
|
||||
echo "STARTMODE=onboot" >> $str_cfg_file
|
||||
echo "BONDING_MASTER=yes" >> $str_cfg_file
|
||||
echo "BONDING_MODULE_OPTS='$bondingopts'" >> $str_cfg_file
|
||||
echo "NAME='Bonded Interface'" >> $str_cfg_file
|
||||
echo "IPADDR=$IPADDR" >> $str_cfg_file
|
||||
echo "NETMASK=$NETMASK" >> $str_cfg_file
|
||||
echo "NETWORK=$NETWORK" >> $str_cfg_file
|
||||
echo "BROADCAST=$BROADCAST" >> $str_cfg_file
|
||||
echo "USERCONTROL=no" >> $str_cfg_file
|
||||
echo "BONDING_SLAVE_0=$DEVICE" >> $str_cfg_file
|
||||
if [[ $DEVICE2EXISTS == "yes" ]]; then
|
||||
echo "BONDING_SLAVE_1=$DEVICE2" >> $str_cfg_file
|
||||
fi
|
||||
|
||||
# write ifcfg-eth0
|
||||
i="$DEVICE"
|
||||
str_cfg_file="$dir/ifcfg-$i"
|
||||
echo "BOOTPROTO=none" > $str_cfg_file
|
||||
echo "STARTMODE=hotplug" >> $str_cfg_file
|
||||
|
||||
i="$DEVICE2"
|
||||
str_cfg_file="$dir/ifcfg-$i"
|
||||
if [[ $DEVICE2EXISTS == "yes" ]]; then
|
||||
# write ifcfg-eth2
|
||||
echo "BOOTPROTO=none" > $str_cfg_file
|
||||
echo "STARTMODE=hotplug" >> $str_cfg_file
|
||||
else
|
||||
rm -f $str_cfg_file # in case it was left over in the image that was captured
|
||||
fi
|
||||
|
||||
# write modprobe alias config
|
||||
str_cfg_file="/etc/modprobe.d/$bond.conf"
|
||||
echo "alias $bond bonding" > $str_cfg_file
|
||||
|
||||
# set the default gateway (at this point this is the private nic gateway, to handle provision across vlans)
|
||||
file=/etc/sysconfig/network/routes
|
||||
if grep -q -E '^default ' $file; then
|
||||
# replace the default route that is already in there
|
||||
sed -i 's/^default .*$/default '$GATEWAY' - -/' $file
|
||||
else
|
||||
# no default route yet, append to file
|
||||
echo "default $GATEWAY - -" >>$file
|
||||
fi
|
||||
|
||||
# this was the original config of the eth0 nic (without bonding)
|
||||
#echo "DEVICE=$i" > $str_cfg_file
|
||||
#echo "BOOTPROTO=static" >> $str_cfg_file
|
||||
#echo "STARTMODE=onboot" >> $str_cfg_file
|
||||
#echo "IPADDR=$IPADDR" >> $str_cfg_file
|
||||
#echo "NETMASK=$NETMASK" >> $str_cfg_file
|
||||
#echo "NETWORK=$NETWORK" >> $str_cfg_file
|
||||
#echo "BROADCAST=$BROADCAST" >> $str_cfg_file
|
||||
#todo: add gateway config? Not sure, because the boot kernels gateway might not be the final OS gateway
|
||||
else
|
||||
# use dhcp for all nics
|
||||
for i in $device_names;do
|
||||
str_cfg_file="$dir/ifcfg-$i"
|
||||
echo "DEVICE=$i" > $str_cfg_file
|
||||
echo "BOOTPROTO=dhcp" >> $str_cfg_file
|
||||
echo "STARTMODE=onboot" >> $str_cfg_file
|
||||
echo "DHCLIENT_PRIMARY_DEVICE=yes" >> $str_cfg_file
|
||||
done
|
||||
fi
|
||||
else
|
||||
#ubuntu
|
||||
echo "Does not support ubuntu."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
#Used only by sysclone
|
||||
|
||||
# This SI post-install script is needed because the initrd that autoyast/kickstart/ubuntu builds when installing
|
||||
# sles/rh/ubuntu on the golden node may not have the drivers when that initrd runs on the node that is
|
||||
# being deployed with this image (specifically, drivers to be able to mount the disk).
|
||||
# So rebuild the initrd on the to-node after putting the image on the disk, but before rebooting.
|
||||
|
||||
#todo: Make this script work on red hat by checking for dracut and using that if it exists.
|
||||
# And do whatever is necessary on ubuntu.
|
||||
|
||||
if [[ -f /sbin/dracut ]]; then
|
||||
# redhat/centos
|
||||
echo "Running dracut to regenerate the initrd with the drivers needed by this node:"
|
||||
dracut --force
|
||||
else
|
||||
# suse/sles
|
||||
echo "Running mkinitrd to regenerate the initrd with the drivers needed by this node:"
|
||||
mkinitrd
|
||||
fi
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
#!/bin/bash
|
||||
|
||||
# SI post-install script, run after SI has installed the OS, to kill processes SI does not kill
|
||||
# (so /a can be umounted cleanly)
|
||||
# SI post-install scripts run in a chroot environment of the final OS image
|
||||
|
||||
if [ -f "/etc/SuSE-release" ];then
|
||||
str_out=`ps -ef | grep -v grep | grep syslog-ng`
|
||||
if [ $? -eq 0 ];then
|
||||
str_id=`echo $str_out | awk '{print $2}'`
|
||||
kill -9 $str_id
|
||||
fi
|
||||
fi
|
||||
|
||||
# SI starts klogd in the chroot, but does not kill it. Remove this line when SI fixes their bug.
|
||||
killall klogd
|
||||
|
||||
# flush all write buffers, just in case SI can not umount /a
|
||||
echo "Syncing file systems"
|
||||
sync
|
||||
|
||||
#todo: remove
|
||||
#echo "Processes still using /:"
|
||||
#fuser -v /
|
||||
#sleep 30
|
||||
@@ -17,6 +17,11 @@ BuildArch: noarch
|
||||
Requires: xCAT-server
|
||||
#Requires: xCAT-server >= %{epoch}:%(cat Version|cut -d. -f 1,2)
|
||||
|
||||
# perl-ExtUtils-MakeMaker, perl-CPAN, perl-Test-Harness are only available in rhel.
|
||||
# When this rpm supports being installed in sles, need to add these to xcat-dep.
|
||||
# perl-SOAP-Lite is already in xcat-dep
|
||||
Requires: perl-ExtUtils-MakeMaker perl-CPAN perl-Test-Harness perl-SOAP-Lite
|
||||
|
||||
Provides: xCAT-SoftLayer = %{epoch}:%{version}
|
||||
|
||||
%description
|
||||
@@ -43,18 +48,22 @@ xCAT-SoftLayer provides Utilities to make xCAT work in a SoftLayer environment.
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
mkdir -p $RPM_BUILD_ROOT/%{prefix}/bin
|
||||
mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/xcat/install
|
||||
mkdir -p $RPM_BUILD_ROOT/install/postscripts
|
||||
mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/xcat/sysclone/postscripts
|
||||
mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/doc/packages/xCAT-SoftLayer
|
||||
mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/man/man1
|
||||
mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/doc/man1
|
||||
mkdir -p $RPM_BUILD_ROOT/%{prefix}/share/xcat/sysclone/post-install
|
||||
|
||||
cp -p -R share/xcat/install/* $RPM_BUILD_ROOT/%{prefix}/share/xcat/install/
|
||||
|
||||
cp -d bin/* $RPM_BUILD_ROOT/%{prefix}/bin
|
||||
chmod 755 $RPM_BUILD_ROOT/%{prefix}/bin/*
|
||||
|
||||
cp -d postscripts/* $RPM_BUILD_ROOT/install/postscripts
|
||||
chmod 755 $RPM_BUILD_ROOT/install/postscripts/*
|
||||
cp -d postscripts/* $RPM_BUILD_ROOT/%{prefix}/share/xcat/sysclone/postscripts
|
||||
chmod 755 $RPM_BUILD_ROOT/%{prefix}/share/xcat/sysclone/postscripts/*
|
||||
|
||||
cp -d si-post-install/* $RPM_BUILD_ROOT/%{prefix}/share/xcat/sysclone/post-install
|
||||
chmod 755 $RPM_BUILD_ROOT/%{prefix}/share/xcat/sysclone/post-install/*
|
||||
|
||||
cp LICENSE.html $RPM_BUILD_ROOT/%{prefix}/share/doc/packages/xCAT-SoftLayer
|
||||
chmod 644 $RPM_BUILD_ROOT/%{prefix}/share/doc/packages/xCAT-SoftLayer/*
|
||||
@@ -71,4 +80,13 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%defattr(-,root,root)
|
||||
#%doc LICENSE.html
|
||||
%{prefix}
|
||||
/install/postscripts
|
||||
|
||||
%post
|
||||
# We are shipping the postscripts in a sysclone dir and then copying them to /install/postscripts here,
|
||||
# because we want to allow base xcat to eventually ship them and not conflict on the file name/path
|
||||
# But base xcat now has a newer/better configbond written in bash, so if that is there do not overwrite it.
|
||||
head /install/postscripts/configbond | grep -q -E '^#! */bin/bash'
|
||||
if [[ $? != 0 ]]; then
|
||||
# the new configbond from xcat 2.8.5 is not there, so copy ours
|
||||
cp -f /%{prefix}/share/xcat/sysclone/postscripts/* /install/postscripts
|
||||
fi
|
||||
|
||||
+38
-18
@@ -590,13 +590,16 @@ sub startxcatd
|
||||
} else {
|
||||
$xcmd = "$::XCATROOT/sbin/restartxcatd";
|
||||
}
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$xcmd = "service xcatd restart";
|
||||
#$xcmd = "service xcatd restart";
|
||||
my $ret=xCAT::Utils->restartservice("xcatd");
|
||||
return $ret;
|
||||
}
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
@@ -618,13 +621,16 @@ sub shutdownxcatd
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
$xcmd = "stopsrc -s xcatd";
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$xcmd = "service xcatd stop";
|
||||
#$xcmd = "service xcatd stop";
|
||||
my $ret=xCAT::Utils->stopservice("xcatd");
|
||||
return $ret;
|
||||
}
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
@@ -2073,11 +2079,12 @@ sub adddb2paths
|
||||
#-----------------------------------------------------------------------------
|
||||
sub remove
|
||||
{
|
||||
my $cmd;
|
||||
my @output;
|
||||
my $error = 0;
|
||||
#see if DB2 is installed
|
||||
if (!(-e ($::installdb2dir)))
|
||||
my $cmd;
|
||||
my @output;
|
||||
my $error = 0;
|
||||
my $retcode=0;
|
||||
#see if DB2 is installed
|
||||
if (!(-e ($::installdb2dir)))
|
||||
{
|
||||
my $message =
|
||||
"\nDB2 is not installed.";
|
||||
@@ -2120,18 +2127,23 @@ sub remove
|
||||
|
||||
my $cmd = "ps -elf|grep xcatd";
|
||||
my @output = xCAT::Utils->runcmd($cmd, 0);
|
||||
|
||||
if ($::RUNCMD_RC == 0)
|
||||
{
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
my $cmd = "startsrc -s xcatd";
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
$retcode=$::RUNCMD_RC;
|
||||
}
|
||||
else
|
||||
{
|
||||
my $cmd = "service xcatd start";
|
||||
#my $cmd = "service xcatd start";
|
||||
$retcode=xCAT::Utils->startservice("xcatd");
|
||||
}
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
if ($::RUNCMD_RC !=0)
|
||||
#xCAT::Utils->runcmd($cmd, -1);
|
||||
#if ($::RUNCMD_RC !=0)
|
||||
if($retcode!=0)
|
||||
{
|
||||
my $message = "can't start xcatd";
|
||||
$error += 1;
|
||||
@@ -2155,13 +2167,17 @@ sub remove
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
my $cmd = "stopsrc -s xcatd";
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
$retcode=$::RUNCMD_RC;
|
||||
}
|
||||
else
|
||||
{
|
||||
my $cmd = "service xcatd stop";
|
||||
#my $cmd = "service xcatd stop";
|
||||
$retcode=xCAT::Utils->stopservice("xcatd");
|
||||
}
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
if ($::RUNCMD_RC !=0)
|
||||
#xCAT::Utils->runcmd($cmd, -1);
|
||||
#if ($::RUNCMD_RC !=0)
|
||||
if($retcode!=0)
|
||||
{
|
||||
my $message = "can't stop xcatd";
|
||||
xCAT::MsgUtils->message("E", "$message");
|
||||
@@ -2198,13 +2214,17 @@ sub remove
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
my $cmd = "startsrc -s xcatd";
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
$retcode=$::RUNCMD_RC;
|
||||
}
|
||||
else
|
||||
{
|
||||
my $cmd = "service xcatd start";
|
||||
#my $cmd = "service xcatd start";
|
||||
$retcode=xCAT::Utils->startservice("xcatd");
|
||||
}
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
if ($::RUNCMD_RC !=0)
|
||||
#xCAT::Utils->runcmd($cmd, -1);
|
||||
#if ($::RUNCMD_RC !=0)
|
||||
if($retcode!=0)
|
||||
{
|
||||
my $message = "can't start xcatd";
|
||||
xCAT::MsgUtils->message("E", "$message");
|
||||
|
||||
+79
-38
@@ -8,10 +8,9 @@
|
||||
|
||||
|
||||
|
||||
This is script is called after the installation or upgrade of MySQL
|
||||
on xCAT. It will automate the setup of the MySQL and xCAT to run
|
||||
xCAT on the MySQL DB.
|
||||
Note: if will setup an xcatdb,a xcatadmin, and a MySQL root password.
|
||||
This script automates the setup of the MySQL/MariaDB server and creates the xCAT database to run
|
||||
xCAT on MySQL/MariaDB.
|
||||
Note: it will setup an xcat database (xcatdb),a xcatadmin id , and a MySQL root password.
|
||||
It will interact for the
|
||||
password to assign, unless the XCATMYSQLADMIN_PW and the XCATMYSQLROOT_PW
|
||||
env variables are set to the admin and mysql root password, resp.
|
||||
@@ -150,8 +149,8 @@ $::linuxos = xCAT::Utils->osver();
|
||||
|
||||
#
|
||||
# check to see if mysql is installed
|
||||
#
|
||||
my $cmd = "rpm -qa | grep mysql";
|
||||
#
|
||||
my $cmd = "rpm -qa | grep -i perl-DBD-mysql";
|
||||
if ( $::debianflag ){
|
||||
$cmd = "dpkg -l | grep mysql-server";
|
||||
}
|
||||
@@ -159,10 +158,17 @@ xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $message =
|
||||
"\nMySQL is not installed. If on AIX, it should be first obtained from the xcat dependency tarballs and installed before running this command.\n If on Linux, install from the OS CDs.";
|
||||
"\nMySQL perl DBD is not installed. If on AIX, it should be first obtained from the xcat dependency tarballs and installed before running this command.\n If on Linux, install from the OS CDs.";
|
||||
xCAT::MsgUtils->message("E", " $cmd failed. $message");
|
||||
exit(1);
|
||||
}
|
||||
# is this MariaDB or MySQL
|
||||
$::MariaDB=0;
|
||||
$cmd = "rpm -qa | grep -i mariadb"; # check this is MariaDB not MySQL
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
if ($::RUNCMD_RC == 0) {
|
||||
$::MariaDB=1;
|
||||
}
|
||||
|
||||
# check to see if MySQL is running
|
||||
$::mysqlrunning = 0;
|
||||
@@ -328,7 +334,6 @@ if (($::INIT) && ($::xcatrunningmysql == 0))
|
||||
# MySQL not running, then initialize the database
|
||||
if ($::mysqlrunning == 0)
|
||||
{
|
||||
|
||||
# Add mysql user and group for AIX
|
||||
# Correct directory permissions
|
||||
#
|
||||
@@ -436,7 +441,7 @@ sub usage
|
||||
{
|
||||
xCAT::MsgUtils->message(
|
||||
'I',
|
||||
"Usage:\nmysqlsetup - Performs the setup of MySQL for xCAT to use as its database. See man mysqlsetup for more information."
|
||||
"Usage:\nmysqlsetup - Performs the setup of MySQL or MariaDB for xCAT to use as its database. See man mysqlsetup for more information."
|
||||
);
|
||||
my $msg =
|
||||
"mysqlsetup <-h|--help>\n <-v|--version>\n <-i|--init> [-f|hostfile] [-o|--odbc] [-L|--LL] [-V|--verbose]\n <-u|--update> <-f|hostfile> [-o|--odbc] [-L|--LL] [-V|--verbose]\n <-o|--odbc> [-V|--verbose]\n <-L|--LL> [-V|--verbose]";
|
||||
@@ -603,13 +608,16 @@ sub shutdownxcatd
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
$xcmd = "stopsrc -s xcatd";
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$xcmd = "service xcatd stop";
|
||||
#$xcmd = "service xcatd stop";
|
||||
my $ret=xCAT::Utils->stopservice("xcatd");
|
||||
return $ret;
|
||||
}
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
@@ -856,6 +864,7 @@ sub initmysqldb
|
||||
sub mysqlstart
|
||||
{
|
||||
my $cmd;
|
||||
my $ret=0;
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
my $hostname = `hostname`;
|
||||
@@ -867,22 +876,32 @@ sub mysqlstart
|
||||
$cmd = $cmd2;
|
||||
$cmd .=
|
||||
"$::installdir/bin/mysqld --user=mysql --basedir=$::installdir --datadir=/var/lib/mysql --user=mysql --log-error=/var/lib/mysql/$hostname.err --pid-file=/var/lib/mysql/$hostname.pid --socket=/tmp/mysql.sock --port=3306 &";
|
||||
$ret=xCAT::Utils->runcmd($cmd, 0);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($::linuxos =~ /rh.*/)
|
||||
{
|
||||
$cmd = "service mysqld start";
|
||||
}
|
||||
else
|
||||
{ # sles
|
||||
$cmd = "service mysql start";
|
||||
}
|
||||
if ($::MariaDB==1) { # running MariaDB
|
||||
#$cmd = "service mariadb start";
|
||||
$ret=xCAT::Utils->startservice("mariadb");
|
||||
|
||||
} else { # it is mysql
|
||||
|
||||
#if ($::linuxos =~ /rh.*/)
|
||||
#{
|
||||
# $cmd = "service mysqld start";
|
||||
#}
|
||||
#else
|
||||
#{ # sles
|
||||
# $cmd = "service mysql start";
|
||||
#}
|
||||
$ret=xCAT::Utils->startservice("mysql");
|
||||
}
|
||||
}
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
if ($ret != 0)
|
||||
{
|
||||
xCAT::MsgUtils->message("E", " $cmd failed.");
|
||||
xCAT::MsgUtils->message("E", " failed to start mysql/mariadb.");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -973,16 +992,21 @@ sub mysqlreboot
|
||||
}
|
||||
else # linux
|
||||
{
|
||||
if ($::linuxos =~ /rh.*/)
|
||||
{
|
||||
$cmd = "chkconfig mysqld on";
|
||||
}
|
||||
else
|
||||
{ # sles
|
||||
$cmd = "chkconfig mysql on";
|
||||
if ( $::debianflag ){
|
||||
$cmd = "update-rc.d mysql defaults";
|
||||
}
|
||||
if ($::MariaDB==1 ) { # MariaDB not MySQL
|
||||
|
||||
$cmd = "chkconfig mariadb on";
|
||||
} else { # mysql
|
||||
if ($::linuxos =~ /rh.*/)
|
||||
{
|
||||
$cmd = "chkconfig mysqld on";
|
||||
}
|
||||
else
|
||||
{ # sles
|
||||
$cmd = "chkconfig mysql on";
|
||||
if ( $::debianflag ){
|
||||
$cmd = "update-rc.d mysql defaults";
|
||||
}
|
||||
}
|
||||
}
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
@@ -1058,7 +1082,12 @@ sub setupxcatdb
|
||||
my $timeout = 10; # sets Expect default timeout, 0 accepts immediately
|
||||
my $pwd_sent = 0;
|
||||
my $pwd_prompt = 'Enter password: ';
|
||||
my $mysql_prompt = 'mysql> ';
|
||||
my $mysql_prompt;
|
||||
if ($::MariaDB == 1) { # setup MariaDB
|
||||
$mysql_prompt = 'MariaDB \[\(none\)\]> ';
|
||||
} else {
|
||||
$mysql_prompt = 'mysql> ';
|
||||
}
|
||||
my $expect_log = undef;
|
||||
my $debug = 0;
|
||||
#if ($::VERBOSE)
|
||||
@@ -1178,7 +1207,12 @@ sub setupLL
|
||||
my $timeout = 10; # sets Expect default timeout, 0 accepts immediately
|
||||
my $pwd_sent = 0;
|
||||
my $pwd_prompt = 'Enter password: ';
|
||||
my $mysql_prompt = 'mysql> ';
|
||||
my $mysql_prompt;
|
||||
if ($::MariaDB == 1) { # setup MariaDB
|
||||
$mysql_prompt = 'MariaDB \[\(none\)\]> ';
|
||||
} else {
|
||||
$mysql_prompt = 'mysql> ';
|
||||
}
|
||||
my $expect_log = undef;
|
||||
my $debug = 0;
|
||||
#if ($::VERBOSE)
|
||||
@@ -1308,7 +1342,12 @@ sub addhosts
|
||||
my $timeout = 10; # sets Expect default timeout, 0 accepts immediately
|
||||
my $pwd_sent = 0;
|
||||
my $pwd_prompt = 'Enter password: ';
|
||||
my $mysql_prompt = 'mysql> ';
|
||||
my $mysql_prompt;
|
||||
if ($::MariaDB == 1) { # setup MariaDB
|
||||
$mysql_prompt = 'MariaDB \[\(none\)\]> ';
|
||||
} else {
|
||||
$mysql_prompt = 'mysql> ';
|
||||
}
|
||||
my $expect_log = undef;
|
||||
|
||||
foreach my $host (@hosts)
|
||||
@@ -1778,12 +1817,14 @@ sub restorexcatdb
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
$xcmd = "$::XCATROOT/sbin/restartxcatd";
|
||||
|
||||
system($xcmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
$xcmd = "service xcatd restart";
|
||||
#$xcmd = "service xcatd restart";
|
||||
my $ret=xCAT::Utils->restartservice("xcatd");
|
||||
return $ret;
|
||||
}
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
|
||||
|
||||
+43
-24
@@ -444,13 +444,16 @@ sub shutdownxcatd
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
$xcmd = "stopsrc -s xcatd";
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$xcmd = "service xcatd stop";
|
||||
# $xcmd = "service xcatd stop";
|
||||
my $ret=xCAT::Utils->stopservice("xcatd");
|
||||
return $ret;
|
||||
}
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
@@ -832,6 +835,7 @@ sub initpgdb
|
||||
sub pgstart
|
||||
{
|
||||
my $cmd;
|
||||
my $ret=0;
|
||||
xCAT::MsgUtils->message("I", "Starting the PosgreSQL Server");
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
@@ -843,27 +847,35 @@ sub pgstart
|
||||
else # linux
|
||||
{
|
||||
if (defined($::postgres9)) { # set to the PTF level of postgresql 9.X
|
||||
$cmd = "service postgresql-9.$::postgres9 start";
|
||||
#$cmd = "service postgresql-9.$::postgres9 start";
|
||||
$cmd = "postgresql-9.$::postgres9";
|
||||
} else {
|
||||
$cmd = "service postgresql start";
|
||||
#$cmd = "service postgresql start";
|
||||
$cmd = "postgresql";
|
||||
}
|
||||
system($cmd);
|
||||
if ($? > 0) {
|
||||
xCAT::MsgUtils->message("E", " $cmd failed.");
|
||||
#system($cmd)
|
||||
#if ($? > 0) {
|
||||
$ret=xCAT::Utils->startservice($cmd);
|
||||
if ($ret != 0) {
|
||||
xCAT::MsgUtils->message("E", " failed to start $cmd.");
|
||||
exit(1);
|
||||
}
|
||||
# check to see if running before continuing
|
||||
my $retries =0;
|
||||
my $pgstarted =0;
|
||||
if (defined($::postgres9)) { # set to the PTF level of postgresql 9.X
|
||||
$cmd = "service postgresql-9.$::postgres9 status";
|
||||
} else {
|
||||
$cmd = "service postgresql status";
|
||||
}
|
||||
#if (defined($::postgres9)) { # set to the PTF level of postgresql 9.X
|
||||
# #$cmd = "service postgresql-9.$::postgres9 status";
|
||||
# $ret=xCAT::Utils->checkservicestatus("postgresql-9.$::postgres9");
|
||||
#} else {
|
||||
# #$cmd = "service postgresql status";
|
||||
# $ret=xCAT::Utils->checkservicestatus("postgresql");
|
||||
#}
|
||||
while ($retries < 30) {
|
||||
$retries++;
|
||||
my @status=xCAT::Utils->runcmd($cmd, -1);
|
||||
if (grep(/[r|R]unning/, @status)) {
|
||||
#my @status=xCAT::Utils->runcmd($cmd, -1);
|
||||
#if (grep(/[r|R]unning/, @status)) {
|
||||
$ret=xCAT::Utils->checkservicestatus($cmd);
|
||||
if($ret == 0){
|
||||
$pgstarted=1;
|
||||
last;
|
||||
}
|
||||
@@ -903,18 +915,22 @@ sub pgreboot
|
||||
else # linux
|
||||
{
|
||||
if (defined($::postgres9)) { # set to the postgresql ptf level
|
||||
$cmd = "chkconfig postgresql-9.$::postgres9 on";
|
||||
# $cmd = "chkconfig postgresql-9.$::postgres9 on";
|
||||
$cmd = "postgresql-9.$::postgres9";
|
||||
} else {
|
||||
$cmd = "chkconfig postgresql on";
|
||||
#$cmd = "chkconfig postgresql on";
|
||||
$cmd = "postgresql";
|
||||
}
|
||||
if ($debianflag){
|
||||
$cmd = "update-rc.d postgresql defaults";
|
||||
}
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
#if ($debianflag){
|
||||
#$cmd = "update-rc.d postgresql defaults";
|
||||
#}
|
||||
#xCAT::Utils->runcmd($cmd, 0);
|
||||
#if ($::RUNCMD_RC != 0)
|
||||
my $ret=xCAT::Utils->enableservice($cmd);
|
||||
if($cmd !=0 )
|
||||
{
|
||||
xCAT::MsgUtils->message("E",
|
||||
" $cmd failed. PostgreSQL will not restart on reboot.");
|
||||
"enable service $cmd failed. PostgreSQL will not restart on reboot.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1347,12 +1363,15 @@ sub restorexcatdb
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
$xcmd = "startsrc -s xcatd";
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$xcmd = "service xcatd start";
|
||||
#$xcmd = "service xcatd start";
|
||||
my $ret=xCAT::Utils->startservice("xcatd");
|
||||
return $ret;
|
||||
}
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ my $client = IO::Socket::SSL->new(
|
||||
SSL_cert_file=>$homedir."/.xcat/client-cred.pem",
|
||||
SSL_ca_file => $homedir."/.xcat/ca.pem",
|
||||
SSL_use_cert => 1,
|
||||
#SSL_verify_mode => 1,
|
||||
SSL_verify_mode => 1,
|
||||
);
|
||||
die "Connection failure: $!\n" unless ($client);
|
||||
my %cmdref = (command => 'noderange', noderange => $noderange);
|
||||
|
||||
@@ -115,7 +115,11 @@ else
|
||||
length=`expr $index2 - $index1`
|
||||
length=`expr $length - 1`
|
||||
cons_ip=`expr substr "$result" $pos $length`
|
||||
ifconfig |grep "$cons_ip"
|
||||
if [ "$os" == "AIX" ]; then
|
||||
ifconfig |grep "$cons_ip"
|
||||
else
|
||||
ip addr |grep "$cons_ip"
|
||||
fi
|
||||
if [ $? -eq 0 ]; then
|
||||
CONSERVER=""
|
||||
fi
|
||||
|
||||
+56
-168
@@ -1,12 +1,11 @@
|
||||
#!/usr/bin/env perl
|
||||
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
||||
|
||||
# Used as a convience command combined of [nodech]-nodeset-rpower-[rcons/wcons]
|
||||
# Used as a convience command combined of [nodech]-nodeset-rsetboot-rpower-[rcons/wcons]
|
||||
# to make ease of node OS provision
|
||||
|
||||
# To use this, sym link your cmd name to this script.
|
||||
# This is the client front-end to rinstall/winstall commands
|
||||
|
||||
use strict;
|
||||
|
||||
BEGIN
|
||||
{
|
||||
@@ -20,180 +19,69 @@ use lib "$::XCATROOT/lib/perl";
|
||||
use File::Basename;
|
||||
use Getopt::Long;
|
||||
use xCAT::MsgUtils;
|
||||
use xCAT::Table;
|
||||
use xCAT::NodeRange;
|
||||
use xCAT::Utils;
|
||||
use xCAT::Client;
|
||||
use Cwd;
|
||||
use strict;
|
||||
|
||||
|
||||
sub usage {
|
||||
print basename($0)." usage:\n";
|
||||
print " ".basename($0)." [-o|--osver] [-p|--profile] [-a|--arch] [-O|--osimage] [-c|--console] <noderange>\n"
|
||||
}
|
||||
|
||||
|
||||
|
||||
my $OSVER;
|
||||
my $PROFILE;
|
||||
my $ARCH;
|
||||
my $CONSOLE;
|
||||
my $OSIMAGE;
|
||||
|
||||
Getopt::Long::Configure("bundling");
|
||||
unless (GetOptions(
|
||||
'o|osver=s' => \$OSVER,
|
||||
'p|profile=s' => \$PROFILE,
|
||||
'a|arch=s' => \$ARCH,
|
||||
'O|osimage=s' => \$OSIMAGE,
|
||||
'c|console' => \$CONSOLE
|
||||
)) {
|
||||
usage;
|
||||
exit 1;
|
||||
}
|
||||
my $arraysize=@ARGV;
|
||||
if ($arraysize > 1) {
|
||||
print "noderange invalid\n";
|
||||
usage;
|
||||
exit 1;
|
||||
}
|
||||
if ($arraysize == 0) {
|
||||
print "noderange not supplied\n";
|
||||
usage;
|
||||
exit 1;
|
||||
}
|
||||
|
||||
my $noderange=@ARGV[0];
|
||||
my $rc=0;
|
||||
my %pnhash;
|
||||
my @allnodes;
|
||||
#use Data::Dumper;
|
||||
|
||||
# check and complain about the invalid combination of the options,
|
||||
# called when -O is specified or nodetype.provmethod=<osimage>,
|
||||
# ignore -o,-p and -a options and prompt a warning message
|
||||
sub checkoption{
|
||||
my $optstring=shift;
|
||||
if($OSVER) {print 'warning: "'.$optstring.'" specified, "[-o|--osver] '.$OSVER."\" ignored\n"};
|
||||
if($PROFILE) {print 'warning: "'.$optstring.'" specified, "[-p|--profile] '.$PROFILE."\" ignored\n"};
|
||||
if($ARCH) {print 'warning: "'.$optstring.'" specified, "[-a|--arch] '.$OSVER."\" ignored\n"};
|
||||
}
|
||||
|
||||
|
||||
@allnodes=noderange($noderange);
|
||||
if($OSIMAGE){
|
||||
|
||||
# -O|--osimage is specified, ignore any -a,-p,-o options,
|
||||
# call "nodeset ... osimage= ..." to set the boot state of the noderange to the specified osimage,
|
||||
# "nodeset" will handle the updating of node attributes such as os,arch,profile,provmethod
|
||||
|
||||
&checkoption("[-O|--osimage] $OSIMAGE");
|
||||
$rc=system("nodeset $noderange osimage=$OSIMAGE");
|
||||
if ($rc) {
|
||||
xCAT::MsgUtils->message("E","nodeset failure");
|
||||
exit 1;
|
||||
};
|
||||
}else
|
||||
# build a request to go the rinstall plugin
|
||||
my $bname = basename($0);
|
||||
my $cmdref;
|
||||
$cmdref->{command}->[0] = $bname;
|
||||
$cmdref->{cwd}->[0] = cwd();
|
||||
# allows our plugins to get the stdin of the cmd that invoked the plugin
|
||||
my $data;
|
||||
if ( (($^O =~ /^linux/i) && ($ENV{'SHELL'} =~ /\/ksh$/)) || !defined($ENV{'TERM'}) )
|
||||
{
|
||||
|
||||
# no osimage specified, update the node attributes specified by -a,-p,-o options thru "nodech",
|
||||
# then set the boot state of each node based on the nodetype.provmethod:
|
||||
# 1) if nodetype.provmethod = <osimage>, ignore any -p,-o,-a option, then call "nodeset ... osimage"
|
||||
# 2) if nodetype.provmethod = [install/netboot/statelite], update the node attributes specified by -a,-p,-o options thru "nodech", call "nodeset ... [install/netboot/statelite]"
|
||||
# 3) if nodetype.provmethod is not set, use 'install' as the default value
|
||||
|
||||
# group the nodes according to the nodetype.provmethod
|
||||
|
||||
foreach(@allnodes){
|
||||
my $tab=xCAT::Table->new("nodetype");
|
||||
my $nthash=$tab->getNodeAttribs($_,['provmethod']);
|
||||
$tab->close();
|
||||
if(defined($nthash) and defined($nthash->{'provmethod'}))
|
||||
{
|
||||
push(@{$pnhash{$nthash->{'provmethod'}}},$_);
|
||||
}
|
||||
else
|
||||
{
|
||||
#if nodetype.provmethod is not specified,
|
||||
push(@{$pnhash{'install'}},$_);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
foreach my $key (keys %pnhash)
|
||||
{
|
||||
my $rclocal=0;
|
||||
my $nodes=join(',',@{$pnhash{$key}});
|
||||
if($key =~ /^(install|netboot|statelite)$/)
|
||||
{
|
||||
|
||||
# nodetype.provmethod = [install|netboot|statelite]
|
||||
my $nodechline = "";
|
||||
if ($OSVER) {
|
||||
$nodechline = "nodetype.os=$OSVER";
|
||||
}
|
||||
if ($PROFILE) {
|
||||
$nodechline .= " nodetype.profile=$PROFILE";
|
||||
}
|
||||
if ($ARCH) {
|
||||
$nodechline .= " nodetype.arch=$ARCH";
|
||||
}
|
||||
if ($nodechline) {
|
||||
$rclocal=system("nodech $nodes $nodechline");
|
||||
if ($rclocal) {
|
||||
print "nodech failure\n";
|
||||
$rc=$rclocal;
|
||||
}
|
||||
}
|
||||
|
||||
unless($rc){
|
||||
$rclocal=system("nodeset $nodes $key");
|
||||
if ($rclocal) {
|
||||
print "nodeset $nodes failure\n";
|
||||
$rc=$rclocal;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
# nodetype.provmethod = <osimage>
|
||||
&checkoption("nodetype.provmethod=$key");
|
||||
$rclocal=system("nodeset $nodes osimage");
|
||||
if ($rclocal) {
|
||||
print "nodeset $nodes failure\n";
|
||||
$rc=$rclocal;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
my $rin="";
|
||||
my $rout;
|
||||
vec($rin,fileno(STDIN),1)=1;
|
||||
my $nfound=select($rout=$rin,"","",1);
|
||||
if ($nfound)
|
||||
{
|
||||
while ( <STDIN> ) { $data.=$_; }
|
||||
$cmdref->{stdin}->[0]=$data;
|
||||
}
|
||||
}
|
||||
|
||||
if($rc){
|
||||
xCAT::MsgUtils->message("E","nodeset failure");
|
||||
exit 1;
|
||||
else
|
||||
{
|
||||
if (-p STDIN) {
|
||||
while ( <STDIN> ) { $data.=$_; }
|
||||
$cmdref->{stdin}->[0]=$data;
|
||||
}
|
||||
}
|
||||
my $arg;
|
||||
my @tmpargv = @ARGV;
|
||||
# first
|
||||
$arg=shift(@ARGV);
|
||||
# first 1st non-hyphen arg is the noderange
|
||||
while ($arg =~ /^-/) {
|
||||
push (@{$cmdref->{arg}}, $arg);
|
||||
$arg=shift(@ARGV);
|
||||
}
|
||||
$cmdref->{noderange}->[0]=$arg;
|
||||
push (@{$cmdref->{arg}}, @ARGV);
|
||||
|
||||
# call "rsetboot" to set the boot order of the nodehm.mgt=ipmi nodes,for others, assume user has set the correct boot order before "rinstall"
|
||||
system("rsetboot $noderange net");
|
||||
my $noderange=$cmdref->{noderange}->[0]; # save the noderange
|
||||
|
||||
# call "rpower" to start the node provision process
|
||||
$rc=system("rpower $noderange boot");
|
||||
if ($rc) {
|
||||
xCAT::MsgUtils->message("E","rpower failure");
|
||||
exit 1;
|
||||
};
|
||||
# ok call Client to run the plugin rinstall.pm
|
||||
xCAT::Client::submit_request($cmdref,\&xCAT::Client::handle_response);
|
||||
|
||||
if ($xCAT::Client::EXITCODE == 0) # no errors
|
||||
{
|
||||
my $startconsole=$cmdref->{startconsole}->[0];
|
||||
# if startconsole requested ( -c flag) for rinstall always for winstall
|
||||
# This is set in the rinstall plugin
|
||||
if ($startconsole == 1) {
|
||||
if (basename($0) =~ /rinstall/) {
|
||||
|
||||
if (basename($0) =~ /rinstall/) {
|
||||
|
||||
# for rinstall, the -c|--console option can provide the remote console for only 1 node
|
||||
if ($CONSOLE) {
|
||||
if(scalar @allnodes ne 1){
|
||||
xCAT::MsgUtils->message("E","rinstall [-c|--console] will only work if there is only one node in the noderange. See winstall(8) for consoles on multiple systems");
|
||||
exit 1;
|
||||
}
|
||||
exec("rcons $noderange");
|
||||
}
|
||||
} elsif (basename($0) =~ /winstall/) {
|
||||
# winstall can commence a wcons command to the noderange for monitoring the provision cycle
|
||||
elsif (basename($0) =~ /winstall/) {
|
||||
# winstall can commence a wcons command to the noderange for monitoring the provision cycle
|
||||
|
||||
exec("wcons $noderange");
|
||||
exec("wcons $noderange");
|
||||
}
|
||||
}
|
||||
}
|
||||
exit $xCAT::Client::EXITCODE;
|
||||
|
||||
@@ -25,6 +25,7 @@ B<chvm> I<noderange> [B<lparname>={B<*>|B<name>}]
|
||||
B<chvm> I<noderange> [B<vmcpus=min/req/max>] [B<vmmemory=min/req/max>]
|
||||
[B<vmphyslots=drc_index1,drc_index2...>] [B<vmothersetting=hugepage:N,bsr:N>]
|
||||
[B<vmnics=vlan1[,vlan2..]]> [B<vmstorage=<N|viosnode:slotid>>] [B<--vios>]
|
||||
[B<del_physlots=drc_index1,drc_index2...>]
|
||||
[B<del_vadapter=slotid>]
|
||||
|
||||
=head2 VMware/KVM specific:
|
||||
@@ -205,9 +206,13 @@ To specify the parameters that will be modified.
|
||||
|
||||
To create new virtual adapter for the specified node.
|
||||
|
||||
=item B<del_vadapter=value>
|
||||
=item B<del_physlots=drc_index1,drc_index2...>
|
||||
|
||||
To specify the slot id of the virtual adapter will be deleted.
|
||||
To delete physical slots which are specified by the I<drc_index1,drc_index2...>.
|
||||
|
||||
=item B<del_vadapter=slotid>
|
||||
|
||||
To delete a virtual adapter specified by the I<slotid>.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
=head1 NAME
|
||||
|
||||
B<mysqlsetup> - Sets up the MySQL database for xCAT to use.
|
||||
B<mysqlsetup> - Sets up the MySQL or MariaDB database for xCAT to use.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -19,9 +19,10 @@ B<mysqlsetup> {B<-L>|B<--LL>} [-V|--verbose]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
B<mysqlsetup> - Sets up the MySQL database for xCAT to use. The mysqlsetup script is run on the Management Node as root after the MySQL code has been installed. Before running the init option, the MySQL server should be stopped. The xCAT daemon, xcatd, must be running, do not stop it. No xCAT commands should be run during the init process, because we will be migrating the xCAT database to MySQL and restarting the xcatd daemon as well as the MySQL daemon. For full information on all the steps that will be done, read the "Configure MySQL and Migrate xCAT Data to MySQL" sections in
|
||||
B<mysqlsetup> - Sets up the MySQL or MariaDB database (linux only for MariaDB) for xCAT to use. The mysqlsetup script is run on the Management Node as root after the MySQL code or MariaDB code has been installed. Before running the init option, the MySQL server should be stopped, if it is running. The xCAT daemon, xcatd, must be running, do not stop it. No xCAT commands should be run during the init process, because we will be migrating the xCAT database to MySQL or MariaDB and restarting the xcatd daemon as well as the MySQL daemon. For full information on all the steps that will be done, read the "Configure MySQL and Migrate xCAT Data to MySQL" sections in
|
||||
https://sourceforge.net/apps/mediawiki/xcat/index.php?title=Setting_Up_MySQL_as_the_xCAT_DB
|
||||
Two passwords must be supplied for the setup, a password for the xcatadmin id and a password for the root id in the MySQL database. These will be prompted for interactively, unless the environment variables XCATMYSQLADMIN_PW and XCATMYSQLROOT_PW are set to the passwords for the xcatadmin id and root id in the database,resp.
|
||||
Note below we refer to MySQL but it works the same for MariaDB.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
@@ -41,8 +42,8 @@ Displays verbose messages.
|
||||
|
||||
=item B<-i|--init>
|
||||
|
||||
The init option is used to setup an installed MySQL database so that xCAT can use the database. This involves creating the xcatdb database, the xcatadmin id, allowing access to the xcatdb database by the Management Node. It customizes the my.cnf configuration file for xcat and starts the MySQL server. It also backs up the current xCAT database and restores it into the newly setup xcatdb MySQL database. It creates the /etc/xcat/cfgloc file to point the xcatd daemon to the MySQL database and restarts the xcatd daemon using the database.
|
||||
On AIX, it additionally setup the mysql id and group and corrects the permissions in the MySQL install directories. For AIX, you should be using the MySQL rpms available from the xCAT website. For Linux, you should use the MySQL rpms shipped with the OS. You can chose the -f and/or the -o option, to run after the init.
|
||||
The init option is used to setup a xCAT database on an installed MySQL or MariaDB server for xCAT to use. The mysqlsetup script will check for the installed MariaDB server rpm first and will use MariaDB if it is installed. This involves creating the xcatdb database, the xcatadmin id, allowing access to the xcatdb database by the Management Node. It customizes the my.cnf configuration file for xcat and starts the MySQL server. It also backs up the current xCAT database and restores it into the newly setup xcatdb MySQL database. It creates the /etc/xcat/cfgloc file to point the xcatd daemon to the MySQL database and restarts the xcatd daemon using the database.
|
||||
On AIX, it additionally setup the mysql id and group and corrects the permissions in the MySQL install directories. For AIX, you should be using the MySQL rpms available from the xCAT website. For Linux, you should use the MySQL or MariaDB rpms shipped with the OS. You can chose the -f and/or the -o option, to run after the init.
|
||||
|
||||
=item B<-u|--update>
|
||||
|
||||
|
||||
@@ -120,8 +120,7 @@ To import nodes using a profile, follow the following steps:
|
||||
# hostinfo begin
|
||||
# This entry defines a blade.
|
||||
__hostname__:
|
||||
switch=myswitch
|
||||
switchport=9
|
||||
switches=eth0!switch1!1,eth0!switch2!1!eth1
|
||||
|
||||
Example of a node information file that specifies a CEC-based rack-mounted Power node that uses direct FSP management:
|
||||
# Node information file begins
|
||||
@@ -141,13 +140,9 @@ B<mac=<mac-address>> This is a mandatory item.
|
||||
|
||||
Description: Specify the MAC address for the NIC used by the provisionging node, where <mac-address> is the NICs MAC address.
|
||||
|
||||
B<switch=<switch-name>> This is a mandatory item, when define a switch auto discovery node.
|
||||
B<switches=<nic-name!switch-name!switch-port>> This is a mandatory item, when define switch, switchport and node nic name relationship.
|
||||
|
||||
Description: Specify switch name that the provisionging node is connected, where <switch-name> is the switch name.
|
||||
|
||||
B<switchport=<switch-port>> This is a mandatory item, when define a switch auto discovery node.
|
||||
|
||||
Description: Specify switch port that the provisionging node is connected, where <switch-port> is the connected port.
|
||||
Description: Specify nic name, switch name and switch port to define node and switch relationship. We can define multi nic-switch-port relations here, looks like: switches=eth0!switch1!1,eth1!switch1,2
|
||||
|
||||
B<slotid=<slot-id>> This is a mandatory item while define a PureFlex node.
|
||||
|
||||
|
||||
@@ -4,32 +4,42 @@ B<rinstall> - Begin OS provision on a noderange
|
||||
|
||||
=head1 B<Synopsis>
|
||||
|
||||
B<rinstall> [I<-o>|I<--osver>] [I<-p>|I<--profile>] [I<-a>|I<--arch>] [I<-O>|I<--osimage>] [I<-c>|I<--console>] [I<noderange>]
|
||||
B<rinstall> [I<-o>|I<--osver>] [I<-p>|I<--profile>] [I<-a>|I<--arch>] [I<-c>|I<--console>] [I<noderange>]
|
||||
|
||||
B<rinstall> [I<-O>|I<--osimage>] [I<-c>|I<--console>] [I<noderange>]
|
||||
|
||||
=head1 B<Description>
|
||||
|
||||
B<rinstall> is a convience command that will change tables as requested for operating system version, profile, and architecture, call B<nodeset> to modify the network boot configuration, call B<rsetboot> net to set the next boot over network (only support nodes with "nodetype.mgt=ipmi", for other nodes, make sure the correct boot order has been set before B<rinstall>), and B<rpower> to begin a boot cycle.
|
||||
B<rinstall> is a convenience command that will change tables as requested for operating system version, profile, and architecture, call B<nodeset> to modify the network boot configuration, call B<rsetboot> net to set the next boot over network (only support nodes with "nodetype.mgt=ipmi", for other nodes, make sure the correct boot order has been set before B<rinstall>), and B<rpower> to begin a boot cycle.
|
||||
|
||||
If [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage> is set, provision the noderange with the osimage specified/configured, ignore the table change options if specified.
|
||||
|
||||
If -c is specified, it will then become the text console of the node. If wanting consoles on multiple nodes with a similar command, see L<winstall(8)|winstall.8>.
|
||||
If -c is specified, it will then run rcons on the node. This is allowed only if one node in the noderange. If need consoles on multiple nodes , see L<winstall(8)|winstall.8>.
|
||||
|
||||
=head1 B<Options>
|
||||
|
||||
=over 7
|
||||
|
||||
=item B<-h>|B<--help>
|
||||
|
||||
Display usage message.
|
||||
|
||||
=item B<-v>|B<--version>
|
||||
|
||||
Display version.
|
||||
|
||||
=item B<-o>|B<--osver>
|
||||
|
||||
Specifies which os version to provision. If unspecified, the current table values are used. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
Specifies which os version to provision. If unspecified, the current node os setting is used. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
|
||||
=item B<-p>|B<--profile>
|
||||
|
||||
Specifies what profile should be used of the operating system. If not specified the tables are used as is. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
Specifies what profile should be used of the operating system. If not specified the current node profile setting is used. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
|
||||
|
||||
=item B<-a>|B<--arch>
|
||||
|
||||
Specifies what architecture of the OS to provision. Typically this is unneeded, but if provisioning betweer x86_64 and x86 frequently, this may be a useful flag. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
Specifies what architecture of the OS to provision. Typically this is unneeded, but if provisioning between x86_64 and x86 frequently, this may be a useful flag. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
|
||||
=item B<-O>|B<--osimage>
|
||||
|
||||
@@ -37,7 +47,7 @@ Specifies the osimage to provision.
|
||||
|
||||
=item B<-c>|B<--console>
|
||||
|
||||
Requests that rinstall become rcons once the provision commences. This will only work if there is only one node in the noderange. See L<winstall(8)|winstall.8> for consoles on multiple systems.
|
||||
Requests that rinstall runs rcons once the provision starts. This will only work if there is only one node in the noderange. See L<winstall(8)|winstall.8> for starting nsoles on multiple nodes.
|
||||
|
||||
=back
|
||||
|
||||
@@ -46,17 +56,17 @@ Requests that rinstall become rcons once the provision commences. This will onl
|
||||
|
||||
B<rinstall> I<node1-node20>
|
||||
|
||||
Provison nodes 1 through 20, using configuration as is from tables.
|
||||
Provison nodes 1 through 20, using their current configuration.
|
||||
|
||||
B<rinstall> -o rhels5.1 -p compute I<node1-node20>
|
||||
B<rinstall> I<node1-node20> -o rhels5.1 -p compute
|
||||
|
||||
Provision nodes 1 through 20, forcing rhels5.1 and compute profile.
|
||||
|
||||
B<rinstall> -O rhels6.4-ppc64-netboot-compute I<node1-node20>
|
||||
B<rinstall> I<node1-node20> -O rhels6.4-ppc64-netboot-compute
|
||||
|
||||
Provision nodes 1 through 20 with the osimage rhels6.4-ppc64-netboot-compute.
|
||||
|
||||
B<rinstall> -c I<node1>
|
||||
B<rinstall> I<node1> -c
|
||||
|
||||
Provisoon node1 and start a console to monitor the process.
|
||||
|
||||
|
||||
@@ -1,53 +1,64 @@
|
||||
=head1 Name
|
||||
|
||||
B<winstall> - Begin OS provision on a noderange and display in wcons
|
||||
B<winstall> - Begin OS provision on a noderange
|
||||
|
||||
=head1 B<Synopsis>
|
||||
|
||||
B<winstall> [I<-o>|I<--osver>] [I<-p>|I<--profile>] [I<-a>|I<--arch>] [I<-O>|I<--osimage>] [I<noderange>]
|
||||
B<winstall> [I<-o>|I<--osver>] [I<-p>|I<--profile>] [I<-a>|I<--arch>] [I<noderange>]
|
||||
|
||||
B<winstall> [I<-O>|I<--osimage>] [I<noderange>]
|
||||
|
||||
=head1 B<Description>
|
||||
|
||||
B<winstall> is a convience command that will change tables as requested for operating system version, profile, and architecture, call nodeset to modify the network boot configuration, and rpower to begin a boot cycle.
|
||||
B<winstall> is a convenience tool that will change attributes as requested for operating system version, profile, and architecture, call B<nodeset> to modify the network boot configuration, call B<rsetboot> net to set the next boot over network (only support nodes
|
||||
with "nodetype.mgt=ipmi", for other nodes, make sure the correct boot order has been set before B<winstall>), and B<rpower> to begin a boot cycle.
|
||||
|
||||
If [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage> is set, provision the noderange with the osimage specified/configured, ignore the table change options if specified
|
||||
If [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage> is set, provision the noderange with the osimage specified/configured, ignore the table change options if specified.
|
||||
|
||||
It will then commence a wcons command to the noderange for monitoring.
|
||||
It will then run wcons on the nodes.
|
||||
|
||||
=head1 B<Options>
|
||||
|
||||
=over 7
|
||||
|
||||
=item B<-h>|B<--help>
|
||||
|
||||
Display usage message.
|
||||
|
||||
=item B<-v>|B<--version>
|
||||
|
||||
Display version.
|
||||
|
||||
=item B<-o>|B<--osver>
|
||||
|
||||
Specifies which os version to provision. If unspecified, the current table values are used. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
Specifies which os version to provision. If unspecified, the current node os setting is used. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
|
||||
=item B<-p>|B<--profile>
|
||||
|
||||
Specifies what profile should be used of the operating system. If not specified the tables are used as is. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
Specifies what profile should be used of the operating system. If not specified the current node profile setting is used. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
|
||||
|
||||
=item B<-a>|B<--arch>
|
||||
|
||||
Specifies what architecture of the OS to provision. Typically this is unneeded, but if provisioning betweer x86_64 and x86 frequently, this may be a useful flag. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
Specifies what architecture of the OS to provision. Typically this is unneeded, but if provisioning between x86_64 and x86 frequently, this may be a useful flag. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I<osimage>.
|
||||
|
||||
=item B<-O>|B<--osimage>
|
||||
|
||||
Specifies the osimage to provision.
|
||||
Specifies the osimage to provision.
|
||||
|
||||
=back
|
||||
|
||||
=head1 B<Examples>
|
||||
|
||||
B<rinstall> I<node1-node20>
|
||||
B<winstall> I<node1-node20>
|
||||
|
||||
Provison nodes 1 through 20, using configuration as is from tables.
|
||||
Provison nodes 1 through 20, using their current configuration.
|
||||
|
||||
B<rinstall> -o rhels5.1 -p compute I<node1-node20>
|
||||
B<winstall> I<node1-node20> -o rhels5.1 -p compute
|
||||
|
||||
Provision nodes 1 through 20, forcing rhels5.1 and compute profile.
|
||||
|
||||
B<rinstall> -O rhels6.4-ppc64-netboot-compute I<node1-node20>
|
||||
B<winstall> I<node1-node20> -O rhels6.4-ppc64-netboot-compute
|
||||
|
||||
Provision nodes 1 through 20 with the osimage rhels6.4-ppc64-netboot-compute.
|
||||
|
||||
|
||||
@@ -13,6 +13,17 @@ DIR=`readlink -f $DIR`
|
||||
DRACUTMODDIR=/usr/share/dracut/modules.d/97xcat
|
||||
mkdir -p $DRACUTMODDIR
|
||||
cp $DIR/* $DRACUTMODDIR
|
||||
# For ppc64 platform, needs to remove some files,
|
||||
# and some files are in different directories
|
||||
if [ `uname -m` = "ppc64" ]; then
|
||||
sed -i 's/dracut_install efibootmgr//' $DRACUTMODDIR/install
|
||||
sed -i 's/ dmidecode//' $DRACUTMODDIR/install
|
||||
sed -i 's/\/lib\/libncurses.so.5.7/\/lib64\/libncurses.so.5.7/' $DRACUTMODDIR/install
|
||||
sed -i 's/\/usr\/lib\/libstdc++.so.6.0.13/\/usr\/lib64\/libstdc++.so.6.0.13/' $DRACUTMODDIR/install
|
||||
sed -i 's/\/lib\/libgcc_s.so.1/\/lib64\/libgcc_s.so.1/' $DRACUTMODDIR/install
|
||||
sed -i 's/\/lib\/libtinfo.so.5.7/\/lib64\/libtinfo.so.5.7/' $DRACUTMODDIR/install
|
||||
fi
|
||||
|
||||
if [ "$HOSTOS" = "mcp" ]; then
|
||||
sed -i 's/mkfs.btrfs//' $DRACUTMODDIR/install
|
||||
sed -i 's/\/etc\/redhat-release/\/etc\/base-release \/etc\/system-release/' $DRACUTMODDIR/install
|
||||
|
||||
@@ -44,8 +44,10 @@ while [ $WAITING -gt 0 ]; do
|
||||
done
|
||||
WAITING=0
|
||||
if [ ! -z "$FORCENICS" ]; then
|
||||
for nic in `ifconfig|grep HWaddr|awk '{print $1}'|egrep "$FORCENICS"`; do
|
||||
if ! ifconfig $nic|grep "inet addr" > /dev/null; then
|
||||
#for nic in `ifconfig|grep HWaddr|awk '{print $1}'|egrep "$FORCENICS"`; do
|
||||
for nic in `ip -oneline link show |grep -i ether |awk -F ':' '{print $2}'|grep -o "[^ ]\+\( \+[^ ]\+\)*"|egrep "$FORCENICS"`; do
|
||||
# if ! ifconfig $nic|grep "inet addr" > /dev/null; then
|
||||
if ! ip -4 -oneline addr show $nic|grep -i inet > /dev/null; then
|
||||
WAITING=1
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -4,7 +4,7 @@ BuildArch: noarch
|
||||
Release: snap%(date +"%Y%m%d%H%M")
|
||||
Epoch: 1
|
||||
AutoReq: false
|
||||
Requires: efibootmgr ipmitool screen btrfs-progs lldpad rpm-build compat-libstdc++-33
|
||||
Requires: ipmitool screen btrfs-progs lldpad rpm-build compat-libstdc++-33
|
||||
Prefix: /opt/xcat
|
||||
AutoProv: false
|
||||
|
||||
|
||||
@@ -51,11 +51,13 @@ if [ "$IPMIMFG" == 2 ]; then #IBM
|
||||
BMCPORT=`grep bmcport /tmp/ipmicfg.xml |awk -F\> '{print $2}'|awk -F\< '{print $1}'`
|
||||
if [ ! -z "$BMCPORT" ]; then
|
||||
let idev=0
|
||||
IFS=','
|
||||
for p in $BMCPORT; do
|
||||
ipmitool -d $idev raw 0xc 1 1 0xc0 $p > /dev/null
|
||||
ipmitool -d $idev raw 0x04 0x12 0x09 0x01 0x18 0x${p}1 0x00 > /dev/null
|
||||
let idev=idev+1
|
||||
done
|
||||
unset IFS
|
||||
fi
|
||||
elif [ "$XPROD" == "291" ]; then
|
||||
LOCKEDUSERS=1
|
||||
@@ -65,10 +67,12 @@ if [ "$IPMIMFG" == 2 ]; then #IBM
|
||||
BMCPORT=`grep bmcport /tmp/ipmicfg.xml |awk -F\> '{print $2}'|awk -F\< '{print $1}'`
|
||||
if [ ! -z "$BMCPORT" ]; then
|
||||
let idev=0
|
||||
IFS=','
|
||||
for p in $BMCPORT; do
|
||||
ipmitool -d $idev raw 0xc 1 1 0xc0 $p > /dev/null
|
||||
let idev=idev+1
|
||||
done
|
||||
unset IFS
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@@ -82,6 +86,7 @@ elif [ "$IPMIMFG" == 20301 ] ; then
|
||||
BMCPORT=`grep bmcport /tmp/ipmicfg.xml |awk -F\> '{print $2}'|awk -F\< '{print $1}'`
|
||||
if [ ! -z "$BMCPORT" ]; then
|
||||
let idev=0
|
||||
IFS=','
|
||||
for p in $BMCPORT; do
|
||||
ipmitool -d $idev raw 0xc 1 1 0xc0 $p > /dev/null
|
||||
NEWPORT=`ipmitool -d $idev raw 0xc 2 1 0xc0 0 0|awk '{print $2}'`
|
||||
@@ -89,6 +94,7 @@ elif [ "$IPMIMFG" == 20301 ] ; then
|
||||
|
||||
let idev=idev+1
|
||||
done
|
||||
unset IFS
|
||||
fi
|
||||
elif [ "$IPMIMFG" == "47488" ]; then
|
||||
LOCKEDUSERS=1
|
||||
|
||||
@@ -4,11 +4,13 @@
|
||||
# Bug reported by Jeff Lang <jrlang@uwyo.edu>. Thanks, Jeff!
|
||||
#
|
||||
|
||||
modprobe acpi_cpufreq
|
||||
modprobe acpi_cpufreq 2>/dev/null # on some machines this fails
|
||||
modprobe cpufreq_ondemand
|
||||
for gov in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
|
||||
echo -n ondemand > $gov
|
||||
done
|
||||
if ls /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor &>/dev/null; then
|
||||
for gov in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
|
||||
echo -n ondemand > $gov
|
||||
done
|
||||
fi
|
||||
if [ ! -z "$BOOTIF" ]; then
|
||||
BOOTIF=`echo $BOOTIF|sed -e s/01-// -e s/-/:/g`
|
||||
echo -n "Waiting for device with address $BOOTIF to appear.."
|
||||
@@ -74,21 +76,89 @@ echo '};' >> /var/lib/lldpad/lldpad.conf
|
||||
done
|
||||
echo '};' >> /var/lib/lldpad/lldpad.conf
|
||||
lldpad -d
|
||||
dhclient -cf /etc/dhclient.conf -pf /var/run/dhclient.$bootnic.pid $bootnic &
|
||||
#we'll kick of IPv6 and IPv4 on all nics, but not wait for them to come up unless doing discovery, to reduce
|
||||
#chances that we'll perform a partial discovery
|
||||
#in other scenarios where downed non-bootnics cause issues, will rely on retries to fix things up
|
||||
dhclient -6 -pf /var/run/dhclient6.$bootnic.pid $bootnic -lf /var/lib/dhclient/dhclient6.leases &
|
||||
NICSTOBRINGUP=`ip link|grep mtu|grep -v LOOPBACK|grep -v $bootnic|grep -v usb|grep -v ,UP|awk -F: '{print $2}'`
|
||||
export NICSTOBRINGUP
|
||||
for nic in $NICSTOBRINGUP; do
|
||||
(while ! ethtool $nic | grep Link\ detected|grep yes > /dev/null; do sleep 5; done; dhclient -cf /etc/dhclient.conf -pf /var/run/dhclient.$nic.pid $nic ) &
|
||||
(while ! ethtool $nic | grep Link\ detected|grep yes > /dev/null; do sleep 5; done; dhclient -cf /etc/dhclient.conf -6 -pf /var/run/dhclient6.$nic.pid -lf /var/lib/dhclient/dhclient6.leases $nic ) &
|
||||
done
|
||||
openssl genrsa -out /etc/xcat/certkey.pem 4096 > /dev/null 2>&1 &
|
||||
|
||||
|
||||
|
||||
# Caclulate the broadcast address of a given IP address and mask.
|
||||
bcastcalc(){
|
||||
read oct1 oct2 oct3 oct4 << HERE
|
||||
$(echo "$1" | sed -e 's/\./ /g')
|
||||
HERE
|
||||
read msk1 msk2 msk3 msk4 << HERE
|
||||
$(echo "$2" | sed -e 's/\./ /g')
|
||||
HERE
|
||||
ipa=$(($oct1+(255-($oct1 | $msk1))))
|
||||
ipb=$(($oct2+(255-($oct2 | $msk2))))
|
||||
ipc=$(($oct3+(255-($oct3 | $msk3))))
|
||||
ipd=$(($oct4+(255-($oct4 | $msk4))))
|
||||
echo "$ipa.$ipb.$ipc.$ipd"
|
||||
}
|
||||
|
||||
# Calculates the number of bits in a netmask for converting something like 255.255.255.192 to 26 so
|
||||
# you can use the notation 10.0.0.1/26
|
||||
mask2prefix() {
|
||||
nbits=0
|
||||
old_ifs=$IFS
|
||||
IFS=.
|
||||
for dec in $1 ; do
|
||||
case $dec in
|
||||
255) let nbits+=8;;
|
||||
254) let nbits+=7;;
|
||||
252) let nbits+=6;;
|
||||
248) let nbits+=5;;
|
||||
240) let nbits+=4;;
|
||||
224) let nbits+=3;;
|
||||
192) let nbits+=2;;
|
||||
128) let nbits+=1;;
|
||||
0);;
|
||||
*) echo "Error: $dec is not recognised"; exit 1
|
||||
esac
|
||||
done
|
||||
IFS=$old_ifs
|
||||
echo "$nbits"
|
||||
}
|
||||
|
||||
# see if they specified static ip info, otherwise use dhcp
|
||||
for parm in `cat /proc/cmdline`; do
|
||||
key=`echo $parm|awk -F= '{print $1}'`
|
||||
value=`echo $parm|awk -F= '{print $2}'`
|
||||
if [[ ${key,,} == "hostip" || ${key,,} == "ipaddr" ]]; then
|
||||
hostip=$value
|
||||
elif [[ ${key,,} == "netmask" ]]; then
|
||||
netmask=$value
|
||||
elif [[ ${key,,} == "gateway" ]]; then
|
||||
gateway=$value
|
||||
fi
|
||||
done
|
||||
if [[ -n $hostip && -n $netmask && -n $gateway && -n $bootnic ]]; then
|
||||
# doing static ip
|
||||
# the device was determined above from the bootif mac, and put in bootnic
|
||||
numbits=$(mask2prefix $netmask)
|
||||
broadcast=$(bcastcalc $hostip $netmask)
|
||||
echo "Setting static IP=$hostip/$numbits broadcast=$broadcast gateway=$gateway device=$bootnic BOOTIF=$BOOTIF ..."
|
||||
ip addr add $hostip/$numbits broadcast $broadcast dev $bootnic scope global label $bootnic
|
||||
ip link set $bootnic up
|
||||
ip route replace to default via $gateway dev $bootnic
|
||||
# in softlayer it takes up to 60 seconds for the nic to actually be able to communicate
|
||||
echo -n Waiting to reach xCAT mgmt node $gateway.
|
||||
xcatretries=60
|
||||
while [ $((xcati+=1)) -le $xcatretries ] && ! ping -c2 -w3 $gateway >/dev/null 2>&1; do echo -n .; done
|
||||
if [ $xcati -le $xcatretries ]; then echo " success"; else echo " failed"; fi
|
||||
sleep 3
|
||||
else
|
||||
echo "Setting IP via DHCP..."
|
||||
dhclient -cf /etc/dhclient.conf -pf /var/run/dhclient.$bootnic.pid $bootnic &
|
||||
#we'll kick of IPv6 and IPv4 on all nics, but not wait for them to come up unless doing discovery, to reduce
|
||||
#chances that we'll perform a partial discovery
|
||||
#in other scenarios where downed non-bootnics cause issues, will rely on retries to fix things up
|
||||
dhclient -6 -pf /var/run/dhclient6.$bootnic.pid $bootnic -lf /var/lib/dhclient/dhclient6.leases &
|
||||
NICSTOBRINGUP=`ip link|grep mtu|grep -v LOOPBACK|grep -v $bootnic|grep -v usb|grep -v ,UP|awk -F: '{print $2}'`
|
||||
export NICSTOBRINGUP
|
||||
for nic in $NICSTOBRINGUP; do
|
||||
(while ! ethtool $nic | grep Link\ detected|grep yes > /dev/null; do sleep 5; done; dhclient -cf /etc/dhclient.conf -pf /var/run/dhclient.$nic.pid $nic ) &
|
||||
(while ! ethtool $nic | grep Link\ detected|grep yes > /dev/null; do sleep 5; done; dhclient -cf /etc/dhclient.conf -6 -pf /var/run/dhclient6.$nic.pid -lf /var/lib/dhclient/dhclient6.leases $nic ) &
|
||||
done
|
||||
fi
|
||||
|
||||
openssl genrsa -out /etc/xcat/certkey.pem 4096 > /dev/null 2>&1 &
|
||||
|
||||
gripeiter=101
|
||||
echo -n "Acquiring network addresses.."
|
||||
|
||||
@@ -1590,7 +1590,8 @@ send_monitor_msg() {
|
||||
|
||||
# Get the client mac address.
|
||||
if [ -z "$mac" ]; then
|
||||
mac=`ifconfig $DEVICE 2>/dev/null | sed -ne "s/.*HWaddr //p" | sed "s/ //g" | sed s/:/./g`
|
||||
#mac=`ifconfig $DEVICE 2>/dev/null | sed -ne "s/.*HWaddr //p" | sed "s/ //g" | sed s/:/./g`
|
||||
mac=`ip -4 -oneline link show $DEVICE 2>/dev/null|grep -i ether|sed -ne "s/.*ether //p"|awk -F ' ' '{print $1}'|sed s/:/./g`
|
||||
fi
|
||||
|
||||
# Collect some special info only after proc file system is mounted.
|
||||
|
||||
@@ -10,12 +10,17 @@
|
||||
checks for errors.
|
||||
=cut
|
||||
#------------------------------------------------------------------------------#
|
||||
|
||||
BEGIN
|
||||
{
|
||||
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
|
||||
}
|
||||
use lib "$::XCATROOT/lib/perl";
|
||||
use strict;
|
||||
use locale;
|
||||
use Getopt::Long;
|
||||
use IPC::SysV qw(IPC_STAT S_IRWXU IPC_PRIVATE IPC_CREAT S_IRUSR S_IWUSR );
|
||||
use IPC::Msg;
|
||||
use xCAT::Utils;
|
||||
|
||||
BEGIN
|
||||
{
|
||||
@@ -109,8 +114,9 @@ if (&first_time_run)
|
||||
runcmd("/usr/bin/mkfifo $fifo");
|
||||
}
|
||||
runcmd("echo \"$embedinfo\" >> $syslogconf");
|
||||
my $cmd = service("syslog", "restart");
|
||||
runcmd($cmd);
|
||||
#my $cmd = service("syslog", "restart");
|
||||
#runcmd($cmd);
|
||||
xCAT::Utils->restartservice("syslog");
|
||||
}
|
||||
touchFile($runfile);
|
||||
}
|
||||
@@ -512,6 +518,9 @@ sub createRandomName
|
||||
'stop' or 'status'.
|
||||
Returns:
|
||||
A full cli for the service script.
|
||||
Comment:
|
||||
this subroutine is deprecated, use service subroutines in xCAT::Utils
|
||||
instead
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
@@ -106,7 +106,7 @@ fi
|
||||
%ifos linux
|
||||
if [ -f "/proc/cmdline" ]; then # prevent running it during install into chroot image
|
||||
if [ -f $RPM_INSTALL_PREFIX0/sbin/xcatd ]; then
|
||||
/etc/init.d/xcatd reload
|
||||
/etc/init.d/xcatd restart
|
||||
fi
|
||||
fi
|
||||
%else
|
||||
|
||||
@@ -121,6 +121,7 @@ sub new {
|
||||
unless ($ipmi2support) {
|
||||
$self->{ipmi15only} = 1;
|
||||
}
|
||||
$self->{privlevel} = 4;
|
||||
unless ($args{'bmc'} and defined $args{'userid'} and defined $args{'password'}) {
|
||||
$self->{error}="bmc, userid, and password must be specified";
|
||||
return $self;
|
||||
@@ -308,7 +309,7 @@ sub session_activated {
|
||||
|
||||
sub set_admin_level {
|
||||
my $self= shift;
|
||||
$self->subcmd(netfn=>0x6,command=>0x3b,data=>[4],callback=>\&admin_level_set,callback_args=>$self);
|
||||
$self->subcmd(netfn=>0x6,command=>0x3b,data=>[$self->{privlevel}],callback=>\&admin_level_set,callback_args=>$self);
|
||||
}
|
||||
sub admin_level_set {
|
||||
my $rsp = shift;
|
||||
@@ -319,6 +320,12 @@ sub admin_level_set {
|
||||
0x82 => "Cannot disable User Level authentication",
|
||||
);
|
||||
my $code = $rsp->{code};
|
||||
if (($code == 0x80 or $code == 0x81) and $self->{privlevel} == 4) {
|
||||
$self->{privlevel} = 3;
|
||||
$self->subcmd(netfn=>0x6,command=>0x3b,data=>[$self->{privlevel}],callback=>\&admin_level_set,callback_args=>$self);
|
||||
return;
|
||||
}
|
||||
|
||||
if ($code) {
|
||||
my $errtxt = sprintf("ERROR: Failed requesting administrator privilege %02xh",$code);
|
||||
if ($localcodes{$code}) {
|
||||
@@ -686,7 +693,7 @@ sub send_rakp3 {
|
||||
$self->{rmcptag}+=1;
|
||||
my @payload = ($self->{rmcptag},0,0,0,@{$self->{pendingsessionid}});
|
||||
my @user = unpack("C*",$self->{userid});
|
||||
push @payload,unpack("C*",hmac_sha1(pack("C*",@{$self->{remoterandomnumber}},@{$self->{sidm}},4,scalar @user,@user),$self->{password}));
|
||||
push @payload,unpack("C*",hmac_sha1(pack("C*",@{$self->{remoterandomnumber}},@{$self->{sidm}},$self->{privlevel},scalar @user,@user),$self->{password}));
|
||||
$self->sendpayload(payload=>\@payload,type=>$payload_types{'rakp3'});
|
||||
}
|
||||
|
||||
@@ -700,7 +707,7 @@ sub send_rakp1 {
|
||||
push @{$self->{randomnumber}},$randomnumber;
|
||||
}
|
||||
push @payload, @{$self->{randomnumber}};
|
||||
push @payload,(4,0,0); # request admin
|
||||
push @payload,($self->{privlevel},0,0); # request priv
|
||||
my @user = unpack("C*",$self->{userid});
|
||||
push @payload,scalar @user;
|
||||
push @payload,@user;
|
||||
@@ -709,6 +716,8 @@ sub send_rakp1 {
|
||||
}
|
||||
sub init {
|
||||
my $self = shift;
|
||||
$self->{confalgo} = undef;
|
||||
$self->{integrityalgo}=undef;
|
||||
$self->{sessionestablishmentcontext} = 0;
|
||||
$self->{'sequencenumber'} = 0; #init sequence number
|
||||
$self->{'sequencenumberbytes'} = [0,0,0,0]; #init sequence number
|
||||
@@ -816,6 +825,13 @@ sub got_rakp2 {
|
||||
}
|
||||
$byte = shift @data;
|
||||
unless ($byte == 0x00) {
|
||||
if (($byte == 0x9 or $byte == 0xd) and $self->{privlevel} == 4) {
|
||||
# this is probably an environment that wants to give us only operator
|
||||
# try to connect again at 3.
|
||||
$self->{privlevel} = 3;
|
||||
$self->relog();
|
||||
return;
|
||||
}
|
||||
if ($byte == 0x02) { #invalid session id is almost certainly because a retry on rmcp+ open session response rendered our session id invalid, ignore this in the hope that we'll get an answer for our retry that invalidated us..
|
||||
#$self->relog();
|
||||
#TODO: probably should disable RAKP1 retry here... high likelihood that we'll just spew a bad RAKP1 and Open Session Request retry would be more appropriate to try to discern a valid session id
|
||||
@@ -840,7 +856,7 @@ sub got_rakp2 {
|
||||
#Data now represents authcode.. sha1 only..
|
||||
my @user = unpack("C*",$self->{userid});
|
||||
my $ulength = scalar @user;
|
||||
my $hmacdata = pack("C*",(@{$self->{sidm}},@{$self->{pendingsessionid}},@{$self->{randomnumber}},@{$self->{remoterandomnumber}},@{$self->{remoteguid}},4,$ulength,@user));
|
||||
my $hmacdata = pack("C*",(@{$self->{sidm}},@{$self->{pendingsessionid}},@{$self->{randomnumber}},@{$self->{remoterandomnumber}},@{$self->{remoteguid}},$self->{privlevel},$ulength,@user));
|
||||
my @expectedhash = (unpack("C*",hmac_sha1($hmacdata,$self->{password})));
|
||||
foreach (0..(scalar(@expectedhash)-1)) {
|
||||
if ($expectedhash[$_] != $data[$_]) {
|
||||
@@ -849,7 +865,7 @@ sub got_rakp2 {
|
||||
return 9;
|
||||
}
|
||||
}
|
||||
$self->{sik} = hmac_sha1(pack("C*",@{$self->{randomnumber}},@{$self->{remoterandomnumber}},4,$ulength,@user),$self->{password});
|
||||
$self->{sik} = hmac_sha1(pack("C*",@{$self->{randomnumber}},@{$self->{remoterandomnumber}},$self->{privlevel},$ulength,@user),$self->{password});
|
||||
$self->{k1} = hmac_sha1(pack("C*",1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),$self->{sik});
|
||||
$self->{k2} = hmac_sha1(pack("C*",2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2),$self->{sik});
|
||||
my @aeskey = unpack("C*",$self->{k2});
|
||||
|
||||
@@ -151,166 +151,179 @@ sub subvars {
|
||||
}
|
||||
}
|
||||
|
||||
#do *all* includes, recursive and all
|
||||
my $doneincludes=0;
|
||||
while (not $doneincludes) {
|
||||
$doneincludes=1;
|
||||
if ($inc =~ /#INCLUDE_PKGLIST:[^#^\n]+#/) {
|
||||
$doneincludes=0;
|
||||
$inc =~ s/#INCLUDE_PKGLIST:([^#^\n]+)#/includefile($1, 0, 1)/eg;
|
||||
}
|
||||
if ($inc =~ /#INCLUDE_PTRNLIST:[^#^\n]+#/) {
|
||||
$doneincludes=0;
|
||||
$inc =~ s/#INCLUDE_PTRNLIST:([^#^\n]+)#/includefile($1, 0, 2)/eg;
|
||||
}
|
||||
if ($inc =~ /#INCLUDE_RMPKGLIST:[^#^\n]+#/) {
|
||||
$doneincludes=0;
|
||||
$inc =~ s/#INCLUDE_RMPKGLIST:([^#^\n]+)#/includefile($1, 0, 3)/eg;
|
||||
}
|
||||
if ($inc =~ /#INCLUDE:[^#^\n]+#/) {
|
||||
$doneincludes=0;
|
||||
$inc =~ s/#INCLUDE:([^#^\n]+)#/includefile($1, 0, 0)/eg;
|
||||
}
|
||||
}
|
||||
|
||||
#support multiple paths of osimage in rh/sles diskfull installation
|
||||
my @pkgdirs;
|
||||
if ( defined($media_dir) ) {
|
||||
@pkgdirs = split(",", $media_dir);
|
||||
my $source;
|
||||
my $source_in_pre;
|
||||
my $c = 0;
|
||||
foreach my $pkgdir(@pkgdirs) {
|
||||
if( $platform =~ /^(rh|SL|centos|fedora)$/ ) {
|
||||
if ( $c == 0 ) {
|
||||
# After some tests, if we put the repo in pre scripts in the kickstart like for rhels6.x
|
||||
# the rhels5.9 will not be installed successfully. So put in kickstart directly.
|
||||
$source_in_pre .= "echo 'url --url http://'\$nextserver'/$pkgdir' >> /tmp/repos";
|
||||
$source .= "url --url http://#TABLE:noderes:\$NODE:nfsserver#/$pkgdir\n"; #For rhels5.9
|
||||
} else {
|
||||
$source_in_pre .= "\necho 'repo --name=pkg$c --baseurl=http://'\$nextserver'/$pkgdir' >> /tmp/repos";
|
||||
$source .= "repo --name=pkg$c --baseurl=http://#TABLE:noderes:\$NODE:nfsserver#/$pkgdir\n"; #for rhels5.9
|
||||
}
|
||||
} elsif ($platform =~ /^(sles|suse)/) {
|
||||
my $http = "http://#TABLE:noderes:\$NODE:nfsserver#$pkgdir";
|
||||
$source .= " <listentry>
|
||||
<media_url>$http</media_url>
|
||||
<product>SuSE-Linux-pkg$c</product>
|
||||
<product_dir>/</product_dir>
|
||||
<ask_on_error config:type=\"boolean\">false</ask_on_error> <!-- available since openSUSE 11.0 -->
|
||||
<name>SuSE-Linux-pkg$c</name> <!-- available since openSUSE 11.1/SLES11 (bnc#433981) -->
|
||||
</listentry>";
|
||||
$source_in_pre .="<listentry><media_url>http://'\$nextserver'$pkgdir</media_url><product>SuSE-Linux-pkg$c</product><product_dir>/</product_dir><ask_on_error config:type=\"boolean\">false</ask_on_error><name>SuSE-Linux-pkg$c</name></listentry>";
|
||||
#if user specify the partion file, replace the default partition strategy
|
||||
my $partcontent;
|
||||
my $scriptflag = 0;
|
||||
if ($partitionfile){
|
||||
if ($partitionfile =~ /^s:(.*)/){
|
||||
$scriptflag = 1;
|
||||
$partitionfile = $1;
|
||||
}
|
||||
|
||||
if (-r $partitionfile){
|
||||
open ($inh, "<", $partitionfile);
|
||||
while (<$inh>){
|
||||
$partcontent .= $_;
|
||||
}
|
||||
$c++;
|
||||
close ($inh);
|
||||
}
|
||||
|
||||
$inc =~ s/#INSTALL_SOURCES#/$source/g;
|
||||
$inc =~ s/#INSTALL_SOURCES_IN_PRE#/$source_in_pre/g;
|
||||
# append the partition file into the $inc to do the replacement
|
||||
$inc .= "\nFFFFFFFFFFFFPARTITIONFILESTART\n".$partcontent;
|
||||
}
|
||||
|
||||
|
||||
#do *all* includes, recursive for all
|
||||
my $doneincludes=0;
|
||||
while (not $doneincludes) {
|
||||
$doneincludes=1;
|
||||
$inc =~ s/#ENV:([^#]+)#/envvar($1)/eg; # handle the variable in #INCLUDE
|
||||
if ($inc =~ /#INCLUDE_PKGLIST:[^\n]+#/) {
|
||||
# get in this section but might not do the replace since it needs wait
|
||||
# for the replace of sting inside the #INCLUDE_PKGLIST:xx#
|
||||
$doneincludes=0;
|
||||
$inc =~ s/#INCLUDE_PKGLIST:([^#^\n]+)#/includefile($1, 0, 1)/eg;
|
||||
}
|
||||
if ($inc =~ /#INCLUDE_PTRNLIST:[^\n]+#/) {
|
||||
$doneincludes=0;
|
||||
$inc =~ s/#INCLUDE_PTRNLIST:([^#^\n]+)#/includefile($1, 0, 2)/eg;
|
||||
}
|
||||
if ($inc =~ /#INCLUDE_RMPKGLIST:[^\n]+#/) {
|
||||
$doneincludes=0;
|
||||
$inc =~ s/#INCLUDE_RMPKGLIST:([^#^\n]+)#/includefile($1, 0, 3)/eg;
|
||||
}
|
||||
if ($inc =~ /#INCLUDE:[^\n]+#/) {
|
||||
$doneincludes=0;
|
||||
$inc =~ s/#INCLUDE:([^#^\n]+)#/includefile($1, 0, 0)/eg;
|
||||
}
|
||||
|
||||
#support multiple paths of osimage in rh/sles diskfull installation
|
||||
my @pkgdirs;
|
||||
if ( defined($media_dir) ) {
|
||||
@pkgdirs = split(",", $media_dir);
|
||||
my $source;
|
||||
my $source_in_pre;
|
||||
my $c = 0;
|
||||
foreach my $pkgdir(@pkgdirs) {
|
||||
my $http = "http://#TABLE:noderes:\$NODE:nfsserver#$pkgdir";
|
||||
my $http2 = "http://'\$nextserver'$pkgdir";
|
||||
if ( $pkgdir =~ /^http/ ) {
|
||||
$http = $pkgdir;
|
||||
$http2 = $pkgdir;
|
||||
}
|
||||
if( $platform =~ /^(rh|SL|centos|fedora)$/ ) {
|
||||
if ( $c == 0 ) {
|
||||
# After some tests, if we put the repo in pre scripts in the kickstart like for rhels6.x
|
||||
# the rhels5.9 will not be installed successfully. So put in kickstart directly.
|
||||
$source_in_pre .= "echo 'url --url $http2 >> /tmp/repos";
|
||||
$source .= "url --url $http\n"; #For rhels5.9
|
||||
} else {
|
||||
$source_in_pre .= "\necho 'repo --name=pkg$c --baseurl=$http2' >> /tmp/repos";
|
||||
$source .= "repo --name=pkg$c --baseurl=$http\n"; #for rhels5.9
|
||||
}
|
||||
} elsif ($platform =~ /^(sles|suse)/) {
|
||||
$source .= " <listentry>
|
||||
<media_url>$http</media_url>
|
||||
<product>SuSE-Linux-pkg$c</product>
|
||||
<product_dir>/</product_dir>
|
||||
<ask_on_error config:type=\"boolean\">false</ask_on_error> <!-- available since openSUSE 11.0 -->
|
||||
<name>SuSE-Linux-pkg$c</name> <!-- available since openSUSE 11.1/SLES11 (bnc#433981) -->
|
||||
</listentry>";
|
||||
$source_in_pre .="<listentry><media_url>$http2</media_url><product>SuSE-Linux-pkg$c</product><product_dir>/</product_dir><ask_on_error config:type=\"boolean\">false</ask_on_error><name>SuSE-Linux-pkg$c</name></listentry>";
|
||||
}
|
||||
$c++;
|
||||
}
|
||||
|
||||
$inc =~ s/#INSTALL_SOURCES#/$source/g;
|
||||
$inc =~ s/#INSTALL_SOURCES_IN_PRE#/$source_in_pre/g;
|
||||
}
|
||||
|
||||
#ok, now do everything else..
|
||||
my $shortname = $node;
|
||||
$shortname =~ s/\..*//;
|
||||
$inc =~ s/#TABLE:([^:]+):([^:]+):([^#]+)#/tabdb($1,$2,$3)/eg;
|
||||
$inc =~ s/#TABLEBLANKOKAY:([^:]+):([^:]+):([^#]+)#/tabdb($1,$2,$3,'1')/eg;
|
||||
$inc =~ s/#INCLUDE_NOP:([^#^\n]+)#/includefile($1,1,0)/eg;
|
||||
$inc =~ s/#XCATVAR:([^#]+)#/envvar($1)/eg;
|
||||
$inc =~ s/#ENV:([^#]+)#/envvar($1)/eg;
|
||||
$inc =~ s/#MACHINEPASSWORD#/machinepassword()/eg;
|
||||
$inc =~ s/#CRYPT:([^:]+):([^:]+):([^#]+)#/crydb($1,$2,$3)/eg;
|
||||
$inc =~ s/#COMMAND:([^#]+)#/command($1)/eg;
|
||||
$inc =~ s/#KICKSTARTNET#/kickstartnetwork()/eg;
|
||||
$inc =~ s/#YAST2NET#/yast2network()/eg;
|
||||
$inc =~ s/#ESXIPV6SETUP#/esxipv6setup()/eg;
|
||||
$inc =~ s/#WINTIMEZONE#/xCAT::TZUtils::get_wintimezone()/eg;
|
||||
$inc =~ s/#WINPRODKEY:([^#]+)#/get_win_prodkey($1)/eg;
|
||||
$inc =~ s/#WINNETCFG#/windows_net_cfg()/eg;
|
||||
$inc =~ s/#WINADJOIN#/windows_join_data()/eg;
|
||||
$inc =~ s/#WINDNSCFG#/windows_dns_cfg()/eg;
|
||||
$inc =~ s/#WINACCOUNTDATA#/windows_account_data()/eg;
|
||||
$inc =~ s/#WINDISABLENULLADMIN#/windows_disable_null_admin()/eg;
|
||||
$inc =~ s/#MANAGEDADDRESSMODE#/managed_address_mode()/eg;
|
||||
$inc =~ s/#HOSTNAME#/$node/g;
|
||||
$inc =~ s/#SHORTNAME#/$shortname/g;
|
||||
$inc =~ s/#GETNODEDOMAIN:([^#]+)#/get_node_domain($1)/eg;
|
||||
|
||||
my $nrtab = xCAT::Table->new("noderes");
|
||||
my $tftpserver = $nrtab->getNodeAttribs($node, ['tftpserver']);
|
||||
my $sles_sdk_media = "http://" . $tftpserver->{tftpserver} . $media_dir . "/sdk1";
|
||||
|
||||
$inc =~ s/#SLES_SDK_MEDIA#/$sles_sdk_media/eg;
|
||||
|
||||
#Support hierarchical include
|
||||
$inc =~ s/#ENV:([^#]+)#/envvar($1)/eg;
|
||||
if ($inc =~ /#INCLUDE:[^#^\n]+#/) {
|
||||
$inc =~ s/#INCLUDE:([^#^\n]+)#/includefile($1, 0, 0)/eg;
|
||||
}
|
||||
|
||||
#ok, now do everything else..
|
||||
$inc =~ s/#TABLE:([^:]+):([^:]+):([^#]+)#/tabdb($1,$2,$3)/eg;
|
||||
$inc =~ s/#TABLEBLANKOKAY:([^:]+):([^:]+):([^#]+)#/tabdb($1,$2,$3,'1')/eg;
|
||||
$inc =~ s/#INCLUDE_NOP:([^#^\n]+)#/includefile($1,1,0)/eg;
|
||||
$inc =~ s/#INCLUDE_PKGLIST:([^#^\n]+)#/includefile($1,0,1)/eg;
|
||||
$inc =~ s/#INCLUDE_PTRNLIST:([^#^\n]+)#/includefile($1,0,2)/eg;
|
||||
$inc =~ s/#INCLUDE_RMPKGLIST:([^#^\n]+)#/includefile($1,0,3)/eg;
|
||||
$inc =~ s/#INCLUDE:([^#^\n]+)#/includefile($1, 0, 0)/eg;
|
||||
$inc =~ s/#XCATVAR:([^#]+)#/envvar($1)/eg;
|
||||
$inc =~ s/#ENV:([^#]+)#/envvar($1)/eg;
|
||||
$inc =~ s/#MACHINEPASSWORD#/machinepassword()/eg;
|
||||
$inc =~ s/#CRYPT:([^:]+):([^:]+):([^#]+)#/crydb($1,$2,$3)/eg;
|
||||
$inc =~ s/#COMMAND:([^#]+)#/command($1)/eg;
|
||||
$inc =~ s/#KICKSTARTNET#/kickstartnetwork()/eg;
|
||||
$inc =~ s/#YAST2NET#/yast2network()/eg;
|
||||
$inc =~ s/#ESXIPV6SETUP#/esxipv6setup()/eg;
|
||||
$inc =~ s/#WINTIMEZONE#/xCAT::TZUtils::get_wintimezone()/eg;
|
||||
$inc =~ s/#WINPRODKEY:([^#]+)#/get_win_prodkey($1)/eg;
|
||||
$inc =~ s/#WINNETCFG#/windows_net_cfg()/eg;
|
||||
$inc =~ s/#WINADJOIN#/windows_join_data()/eg;
|
||||
$inc =~ s/#WINDNSCFG#/windows_dns_cfg()/eg;
|
||||
$inc =~ s/#WINACCOUNTDATA#/windows_account_data()/eg;
|
||||
$inc =~ s/#WINDISABLENULLADMIN#/windows_disable_null_admin()/eg;
|
||||
$inc =~ s/#MANAGEDADDRESSMODE#/managed_address_mode()/eg;
|
||||
$inc =~ s/#HOSTNAME#/$node/g;
|
||||
$inc =~ s/#GETNODEDOMAIN:([^#]+)#/get_node_domain($1)/eg;
|
||||
|
||||
my $nrtab = xCAT::Table->new("noderes");
|
||||
my $tftpserver = $nrtab->getNodeAttribs($node, ['tftpserver']);
|
||||
my $sles_sdk_media = "http://" . $tftpserver->{tftpserver} . $media_dir . "/sdk1";
|
||||
|
||||
$inc =~ s/#SLES_SDK_MEDIA#/$sles_sdk_media/eg;
|
||||
|
||||
#if user specify the partion file, replace the default partition strategy
|
||||
if ($partitionfile){
|
||||
#if the content of the partition file is definition replace the default is ok
|
||||
my $partcontent = '';
|
||||
my $scriptflag = 0;
|
||||
|
||||
if ($partitionfile =~ /^s:(.*)/){
|
||||
$scriptflag = 1;
|
||||
$partitionfile = $1;
|
||||
}
|
||||
|
||||
if (-r $partitionfile){
|
||||
open ($inh, "<", $partitionfile);
|
||||
while (<$inh>){
|
||||
$partcontent .= $_;
|
||||
}
|
||||
close ($inh);
|
||||
|
||||
#the content of the specified file is a script which can write partition definition into /tmp/partitionfile
|
||||
if ($scriptflag){
|
||||
#for redhat/sl/centos/kvm/fedora
|
||||
if ($inc =~ /#XCAT_PARTITION_START#/) {
|
||||
my $tempstr = "%include /tmp/partitionfile\n";
|
||||
$inc =~ s/#XCAT_PARTITION_START#[\s\S]*#XCAT_PARTITION_END#/$tempstr/;
|
||||
#modify the content in the file, and write into %pre part
|
||||
#$partcontent = "cat > /tmp/partscript << EOFEOF\n" . $partcontent . "\nEOFEOF\n";
|
||||
$partcontent = "echo " . "'". $partcontent . "'" . ">/tmp/partscript\n";
|
||||
|
||||
$partcontent .= "chmod 755 /tmp/partscript\n";
|
||||
$partcontent .= "/tmp/partscript\n";
|
||||
#replace the #XCA_PARTITION_SCRIPT#
|
||||
$inc =~ s/#XCA_PARTITION_SCRIPT#/$partcontent/;
|
||||
}
|
||||
#for sles/suse
|
||||
elsif ($inc =~ /<!-- XCAT-PARTITION-START -->/){
|
||||
my $tempstr = "<drive><device>XCATPARTITIONTEMP</device></drive>";
|
||||
$inc =~ s/<!-- XCAT-PARTITION-START -->[\s\S]*<!-- XCAT-PARTITION-END -->/$tempstr/;
|
||||
#$partcontent = "cat > /tmp/partscript << EOFEOF\n" . $partcontent . "\nEOFEOF\n";
|
||||
$partcontent = "echo " . "'". $partcontent . "'" . ">/tmp/partscript\n";
|
||||
$partcontent .= "chmod 755 /tmp/partscript\n";
|
||||
$partcontent .= "/tmp/partscript\n";
|
||||
$inc =~ s/#XCA_PARTITION_SCRIPT#/$partcontent/;
|
||||
}
|
||||
}
|
||||
else{
|
||||
$partcontent =~ s/\s$//;
|
||||
if ($inc =~ /#XCAT_PARTITION_START#/){
|
||||
$inc =~ s/#XCAT_PARTITION_START#[\s\S]*#XCAT_PARTITION_END#/$partcontent/;
|
||||
}
|
||||
elsif ($inc =~ /<!-- XCAT-PARTITION-START -->/){
|
||||
$inc =~ s/<!-- XCAT-PARTITION-START -->[\s\S]*<!-- XCAT-PARTITION-END -->/$partcontent/;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($partitionfile && $doneincludes) {
|
||||
#the content of the specified file is a script which can write partition definition into /tmp/partitionfile
|
||||
# split the partition file out from the $inc
|
||||
($inc, $partcontent) = split(/FFFFFFFFFFFFPARTITIONFILESTART/, $inc);
|
||||
if ($scriptflag){
|
||||
# since the whole partition file needs be packaged in %pre first and generate an executable file at running time,
|
||||
# all the special chars like ',",%,\ need be kept, we have to use the base64 coding to code it and put it in
|
||||
# %pre and decode it out during the running time.
|
||||
use MIME::Base64;
|
||||
$partcontent = encode_base64($partcontent);
|
||||
$partcontent =~ s/\n//g;
|
||||
|
||||
#for redhat/sl/centos/kvm/fedora
|
||||
if ($inc =~ /#XCAT_PARTITION_START#/) {
|
||||
my $tempstr = "%include /tmp/partitionfile\n";
|
||||
$inc =~ s/#XCAT_PARTITION_START#[\s\S]*#XCAT_PARTITION_END#/$tempstr/;
|
||||
# Put the base64 coded partitionfile into %pre part
|
||||
$partcontent = "cat > /tmp/partscript.enc << EOFEOF\n" . $partcontent . "\nEOFEOF\n";
|
||||
# Put the code to decode the partitionfile
|
||||
$partcontent .= "python -c 'import base64; print base64.b64decode(open(\"/tmp/partscript.enc\",\"rb\").read())' >/tmp/partscript\n";
|
||||
$partcontent .= "chmod 755 /tmp/partscript\n";
|
||||
$partcontent .= "/tmp/partscript\n";
|
||||
#replace the #XCA_PARTITION_SCRIPT#
|
||||
$inc =~ s/#XCA_PARTITION_SCRIPT#/$partcontent/;
|
||||
}
|
||||
#for sles/suse
|
||||
elsif ($inc =~ /<!-- XCAT-PARTITION-START -->/){
|
||||
my $tempstr = "<drive><device>XCATPARTITIONTEMP</device></drive>";
|
||||
$inc =~ s/<!-- XCAT-PARTITION-START -->[\s\S]*<!-- XCAT-PARTITION-END -->/$tempstr/;
|
||||
# Put the base64 coded partitionfile into %pre part
|
||||
$partcontent = "cat > /tmp/partscript.enc << EOFEOF\n" . $partcontent . "\nEOFEOF\n";
|
||||
# Put the code to decode the partitionfile
|
||||
$partcontent .= "perl -ne 'use MIME::Base64; print decode_base64(\$_)' </tmp/partscript.enc > /tmp/partscript\n";
|
||||
$partcontent .= "chmod 755 /tmp/partscript\n";
|
||||
$partcontent .= "/tmp/partscript\n";
|
||||
$inc =~ s/#XCA_PARTITION_SCRIPT#/$partcontent/;
|
||||
}
|
||||
}
|
||||
else{
|
||||
$partcontent =~ s/\s$//;
|
||||
if ($inc =~ /#XCAT_PARTITION_START#/){
|
||||
$inc =~ s/#XCAT_PARTITION_START#[\s\S]*#XCAT_PARTITION_END#/$partcontent/;
|
||||
}
|
||||
elsif ($inc =~ /<!-- XCAT-PARTITION-START -->/){
|
||||
$inc =~ s/<!-- XCAT-PARTITION-START -->[\s\S]*<!-- XCAT-PARTITION-END -->/$partcontent/;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($tmplerr) {
|
||||
close ($outh);
|
||||
return $tmplerr;
|
||||
}
|
||||
close ($outh);
|
||||
return $tmplerr;
|
||||
}
|
||||
print $outh $inc;
|
||||
close($outh);
|
||||
return 0;
|
||||
|
||||
@@ -13,6 +13,13 @@ our %kmskeymap = (
|
||||
"win8.professional_n" => "XCVCF-2NXM9-723PB-MHCB7-2RYQQ",
|
||||
"win8.enterprise" => "32JNW-9KQ84-P47T8-D8GGY-CWCK7",
|
||||
"win8.enterprise_n" => "JMNMF-RHW7P-DMY6X-RF3DR-X2BQT",
|
||||
"win81.professional" => "GCRJD-8NW9H-F2CDX-CCM8D-9D6T9",
|
||||
"win81.professional_n" => "HMCNV-VVBFX-7HMBH-CTY9B-B4FXY",
|
||||
"win81.enterprise" => "MHF9N-XY6XB-WVXMC-BTDCT-MKKG7",
|
||||
"win81.enterprise_n" => "TT4HM-HN7YT-62K67-RGRQJ-JFFXW",
|
||||
"win2012r2.standard" => "D2N9P-3P6X9-2R39C-7RTCD-MDVJX",
|
||||
"win2012r2.datacenter" => "W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9",
|
||||
"win2012r2.essentials" => "KNC87-3J2TX-XB4WP-VCPJV-M4FWM",
|
||||
"win2012.standard" => "XC9B7-NBPP2-83J2H-RHMBY-92BT4", #note that core and non-core share KMS key
|
||||
"win2012.datacenter" => "48HP8-DN98B-MYWDG-T2DCC-8W83P",
|
||||
"win7.professional" => "FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4",
|
||||
|
||||
@@ -66,12 +66,14 @@ sub start {
|
||||
my $mychildren_cfg="/etc/nagios/objects/mychildren.cfg";
|
||||
if ($isSN) { #start nagios daemon only when mychildren exists on the sn
|
||||
if (-f $mychildren_cfg) {
|
||||
my $rc=`service nagios restart 2>&1`;
|
||||
#my $rc=`service nagios restart 2>&1`;
|
||||
my $rc=xCAT::Utils->restartservice("nagios");
|
||||
reportError("$localhostname: $rc", $callback);
|
||||
}
|
||||
}
|
||||
else { #always start nagios daemon on mn
|
||||
my $rc=`service nagios restart 2>&1`;
|
||||
#my $rc=`service nagios restart 2>&1`;
|
||||
my $rc=xCAT::Utils->restartservice("nagios");
|
||||
reportError("$localhostname: $rc", $callback);
|
||||
}
|
||||
|
||||
|
||||
@@ -122,7 +122,8 @@ sub start_RRD_server
|
||||
print FILE "\tserver_args = - /var/rrd\n";
|
||||
print FILE "}\n";
|
||||
close FILE;
|
||||
xCAT::Utils->runcmd("service xinetd restart", 0);
|
||||
#xCAT::Utils->runcmd("service xinetd restart", 0);
|
||||
xCAT::Utils->restartservice("xinetd");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -188,7 +189,8 @@ sub stop_RRD_server
|
||||
} else {
|
||||
xCAT::Utils->runcmd("rm -f /etc/xinetd.d/rrdsrv", 0);
|
||||
}
|
||||
xCAT::Utils->runcmd("service xinetd restart", 0);
|
||||
#xCAT::Utils->runcmd("service xinetd restart", 0);
|
||||
xCAT::Utils->restartservice("xinetd");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -92,6 +92,7 @@ sub process_request {
|
||||
|
||||
my @commandslist;
|
||||
my %argslist;
|
||||
my $noupdate_flag = 0;
|
||||
my %msghash = ( "makehosts" => "Updating hosts entries",
|
||||
"makedns" => "Updating DNS entries",
|
||||
"makedhcp" => "Update DHCP entries",
|
||||
@@ -143,6 +144,10 @@ sub process_request {
|
||||
if($macflag)
|
||||
{
|
||||
if ($chainarray[0]){
|
||||
if($chainarray[0] =~ m/^osimage=/)
|
||||
{
|
||||
$noupdate_flag = 1;
|
||||
}
|
||||
push @commandslist, ['nodeset', $chainarray[0]];
|
||||
}
|
||||
}
|
||||
@@ -161,6 +166,7 @@ sub process_request {
|
||||
my $firstnode = (@$nodelist)[0];
|
||||
if (exists $profilehash{$firstnode}{"ImageProfile"}){
|
||||
my $osimage = 'osimage='.$profilehash{$firstnode}{"ImageProfile"};
|
||||
$noupdate_flag = 1;
|
||||
push @commandslist, ['nodeset', $osimage];
|
||||
}
|
||||
}
|
||||
@@ -170,7 +176,14 @@ sub process_request {
|
||||
my $current_cmd = $_->[0];
|
||||
my $current_args = $_->[1];
|
||||
setrsp_progress($msghash{$current_cmd});
|
||||
my $retref = xCAT::Utils->runxcmd({command=>[$current_cmd], node=>$nodelist, arg=>[$current_args]}, $request_command, 0, 2);
|
||||
if(($current_cmd eq "nodeset") && $noupdate_flag)
|
||||
{
|
||||
$retref = xCAT::Utils->runxcmd({command=>[$current_cmd], node=>$nodelist, arg=>[$current_args, "--noupdateinitrd"]}, $request_command, 0, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
$retref = xCAT::Utils->runxcmd({command=>[$current_cmd], node=>$nodelist, arg=>[$current_args]}, $request_command, 0, 2);
|
||||
}
|
||||
log_cmd_return($retref);
|
||||
}
|
||||
|
||||
|
||||
@@ -509,8 +509,13 @@ sub setup_CONS
|
||||
"conserver cannot be started because the file $ca_file2 cannot be found\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
my $rc = xCAT::Utils->startService("conserver");
|
||||
{
|
||||
if (xCAT::Utils->isAIX()){
|
||||
$rc=xCAT::Utils->startService("conserver");
|
||||
}elsif(xCAT::Utils->isLinux()){
|
||||
#my $rc = xCAT::Utils->startService("conserver");
|
||||
$rc=xCAT::Utils->startservice("conserver");
|
||||
}
|
||||
if ($rc != 0)
|
||||
{
|
||||
return 1;
|
||||
@@ -537,9 +542,11 @@ sub setup_DHCP
|
||||
my $snonly = 0;
|
||||
# if on the MN check to see if dhcpd is running, and start it if not.
|
||||
if (xCAT::Utils->isMN()) { # on the MN
|
||||
my @output = xCAT::Utils->runcmd("service dhcpd status", -1);
|
||||
if ($::RUNCMD_RC != 0) { # not running
|
||||
$rc = xCAT::Utils->startService("dhcpd");
|
||||
#my @output = xCAT::Utils->runcmd("service dhcpd status", -1);
|
||||
#if ($::RUNCMD_RC != 0) { # not running
|
||||
my $retcode= xCAT::Utils->checkservicestatus("dhcpd");
|
||||
if($retcode!=0){
|
||||
$rc = xCAT::Utils->startservice("dhcpd");
|
||||
if ($rc != 0)
|
||||
{
|
||||
return 1;
|
||||
@@ -573,12 +580,18 @@ sub setup_DHCP
|
||||
->($cmdref, \&xCAT::Client::handle_response);
|
||||
|
||||
my $distro = xCAT::Utils->osver();
|
||||
my $serv = "dhcpd";
|
||||
if ( $distro =~ /ubuntu.*/i || $distro =~ /debian.*/i ){
|
||||
$serv = "isc-dhcp-server";
|
||||
}
|
||||
#my $serv = "dhcpd";
|
||||
#if ( $distro =~ /ubuntu.*/i || $distro =~ /debian.*/i ){
|
||||
# $serv = "isc-dhcp-server";
|
||||
#}
|
||||
|
||||
my $rc = xCAT::Utils->startService($serv);
|
||||
#my $rc = xCAT::Utils->startService($serv);
|
||||
my $rc=0;
|
||||
if(xCAT::Utils->isAIX()){
|
||||
$rc = xCAT::Utils->startService("dhcpd");
|
||||
} elsif(xCAT::Utils->isLinux()){
|
||||
$rc = xCAT::Utils->startservice("dhcp");
|
||||
}
|
||||
if ($rc != 0)
|
||||
{
|
||||
return 1;
|
||||
@@ -672,7 +685,13 @@ sub setup_FTP
|
||||
|
||||
# start ftp
|
||||
|
||||
my $rc = xCAT::Utils->startService("vsftpd");
|
||||
#my $rc = xCAT::Utils->startService("vsftpd");
|
||||
my $rc = 0;
|
||||
if(xCAT::Utils->isAIX()){
|
||||
$rc = xCAT::Utils->startService("vsftpd");
|
||||
}elsif(xCAT::Utils->isLinux()){
|
||||
$rc = xCAT::Utils->startservice("vsftpd");
|
||||
}
|
||||
if ($rc != 0)
|
||||
{
|
||||
return 1;
|
||||
@@ -723,12 +742,19 @@ sub setup_DNS
|
||||
# turn DNS on
|
||||
|
||||
my $distro = xCAT::Utils->osver();
|
||||
my $serv = "named";
|
||||
if ( $distro =~ /ubuntu.*/i || $distro =~ /debian.*/i ){
|
||||
$serv = "bind9";
|
||||
#my $serv = "named";
|
||||
#if ( $distro =~ /ubuntu.*/i || $distro =~ /debian.*/i ){
|
||||
# $serv = "bind9";
|
||||
#}
|
||||
|
||||
#my $rc = xCAT::Utils->startService($serv);
|
||||
my $rc = 0;
|
||||
if(xCAT::Utils->isAIX()){
|
||||
$rc = xCAT::Utils->startService("named");
|
||||
}elsif(xCAT::Utils->isLinux()){
|
||||
$rc=xCAT::Utils->startservice("named");
|
||||
}
|
||||
|
||||
my $rc = xCAT::Utils->startService($serv);
|
||||
if ($rc != 0)
|
||||
{
|
||||
return 1;
|
||||
@@ -751,15 +777,17 @@ sub setup_DNS
|
||||
else
|
||||
{
|
||||
#chkconfig
|
||||
my $cmd = "/sbin/chkconfig $serv on";
|
||||
my $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
#my $cmd = "/sbin/chkconfig $serv on";
|
||||
#my $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
#if ($::RUNCMD_RC != 0)
|
||||
my $retcode=xCAT::Utils->enableservice("named");
|
||||
if($retcode!=0)
|
||||
{
|
||||
xCAT::MsgUtils->message("SE", " Error: Could not enable $serv.");
|
||||
xCAT::MsgUtils->message("SE", " Error: Could not enable dns server.");
|
||||
}
|
||||
else
|
||||
{
|
||||
xCAT::MsgUtils->message("SI", " $serv has been enabled on boot.");
|
||||
xCAT::MsgUtils->message("SI", " dns server has been enabled on boot.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -778,7 +806,14 @@ sub setup_DNS
|
||||
sub setup_LDAP
|
||||
{
|
||||
|
||||
my $rc = xCAT::Utils->startService("ldap");
|
||||
#my $rc = xCAT::Utils->startService("ldap");
|
||||
my $rc = 0;
|
||||
|
||||
if(xCAT::Utils->isAIX()){
|
||||
$rc = xCAT::Utils->startService("ldap");
|
||||
}elsif(xCAT::Utils->isLinux()){
|
||||
$rc=xCAT::Utils->startservice("ldap");
|
||||
}
|
||||
if ($rc != 0)
|
||||
{
|
||||
return 1;
|
||||
@@ -805,16 +840,17 @@ sub setup_NFS
|
||||
my $rc = 0;
|
||||
if (xCAT::Utils->isLinux())
|
||||
{
|
||||
my $os = xCAT::Utils->osver();
|
||||
if ($os =~ /sles.*/)
|
||||
{
|
||||
$rc = xCAT::Utils->startService("nfs");
|
||||
$rc = xCAT::Utils->startService("nfsserver");
|
||||
}
|
||||
else
|
||||
{
|
||||
$rc = xCAT::Utils->startService("nfs");
|
||||
}
|
||||
#my $os = xCAT::Utils->osver();
|
||||
#if ($os =~ /sles.*/)
|
||||
#{
|
||||
# $rc = xCAT::Utils->startService("nfs");
|
||||
# $rc = xCAT::Utils->startService("nfsserver");
|
||||
#}
|
||||
#else
|
||||
#{
|
||||
# $rc = xCAT::Utils->startService("nfs");
|
||||
#}
|
||||
$rc = xCAT::Utils->startservice("nfs");
|
||||
}
|
||||
else
|
||||
{ #AIX
|
||||
@@ -944,7 +980,14 @@ sub setup_NTPmn
|
||||
sub start_NTP
|
||||
{
|
||||
|
||||
my $rc = xCAT::Utils->startService("ntpd");
|
||||
my $rc =0;
|
||||
if (xCAT::Utils->isAIX()){
|
||||
$rc=xCAT::Utils->startService("ntpd");
|
||||
}elsif(xCAT::Utils->isLinux()){
|
||||
#my $rc = xCAT::Utils->startService("conserver");
|
||||
$rc=xCAT::Utils->startservice("ntpd");
|
||||
}
|
||||
|
||||
if ($rc != 0)
|
||||
{
|
||||
return 1;
|
||||
@@ -1271,15 +1314,16 @@ sub setup_HTTP
|
||||
|
||||
if (xCAT::Utils->isLinux())
|
||||
{
|
||||
my $os = xCAT::Utils->osver();
|
||||
if ($os =~ /sles.*/)
|
||||
{
|
||||
$rc = xCAT::Utils->startService("apache2");
|
||||
}
|
||||
else
|
||||
{
|
||||
$rc = xCAT::Utils->startService("httpd");
|
||||
}
|
||||
#my $os = xCAT::Utils->osver();
|
||||
#if ($os =~ /sles.*/)
|
||||
#{
|
||||
# $rc = xCAT::Utils->startService("apache2");
|
||||
#}
|
||||
#else
|
||||
#{
|
||||
# $rc = xCAT::Utils->startService("httpd");
|
||||
#}
|
||||
$rc=xCAT::Utils->startservice("http");
|
||||
}
|
||||
return $rc;
|
||||
}
|
||||
@@ -1385,24 +1429,33 @@ sub enable_TFTPhpa
|
||||
}
|
||||
print FILE @newcfgfile;
|
||||
close (FILE);
|
||||
my @output = xCAT::Utils->runcmd("service xinetd status", -1);
|
||||
if ($::RUNCMD_RC == 0) {
|
||||
if (grep(/running/, @output))
|
||||
{
|
||||
print ' '; # indent service output to separate it from the xcatd service output
|
||||
system "service xinetd stop";
|
||||
if ($? > 0)
|
||||
{ # error
|
||||
#my @output = xCAT::Utils->runcmd("service xinetd status", -1);
|
||||
#if ($::RUNCMD_RC == 0) {}
|
||||
my $retcode=xCAT::Utils->checkservicestatus("xinetd");
|
||||
if($retcode==0){
|
||||
my $retcode=xCAT::Utils->restartservice("xinetd");
|
||||
if($retcode !=0 )
|
||||
{
|
||||
xCAT::MsgUtils->message("S",
|
||||
"Error on command: service xinetd stop\n");
|
||||
"Error on restart xinetd\n");
|
||||
|
||||
}
|
||||
system "service xinetd start";
|
||||
if ($? > 0)
|
||||
{ # error
|
||||
xCAT::MsgUtils->message("S",
|
||||
"Error on command: service xinetd start\n");
|
||||
}
|
||||
}
|
||||
#if (grep(/running/, @output))
|
||||
#{
|
||||
# print ' '; # indent service output to separate it from the xcatd service output
|
||||
# system "service xinetd stop";
|
||||
# if ($? > 0)
|
||||
# { # error
|
||||
# xCAT::MsgUtils->message("S",
|
||||
# "Error on command: service xinetd stop\n");
|
||||
# }
|
||||
# system "service xinetd start";
|
||||
# if ($? > 0)
|
||||
# { # error
|
||||
# xCAT::MsgUtils->message("S",
|
||||
# "Error on command: service xinetd start\n");
|
||||
# }
|
||||
#}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1449,7 +1502,8 @@ sub enable_TFTPhpa
|
||||
sleep 1;
|
||||
my @checkproc=`ps axf|grep -v grep|grep in.tftpd`;
|
||||
if (@checkproc){
|
||||
system("service tftpd-hpa stop");
|
||||
#system("service tftpd-hpa stop");
|
||||
xCAT::Utils->stopservice("tftpd-hpa");
|
||||
}
|
||||
}
|
||||
my @tftpprocs=`ps axf|grep -v grep|grep in.tftpd`;
|
||||
|
||||
@@ -662,7 +662,11 @@ sub mknetboot
|
||||
$kcmdline = "NFSROOT=$nfssrv:$nfsdir STATEMNT=";
|
||||
}
|
||||
} else {
|
||||
$kcmdline = "imgurl=$httpmethod://$imgsrv:$httpport/$rootimgdir/rootimg-statelite.gz STATEMNT=";
|
||||
if (-r "$rootimgdir/rootimg-statelite.gz.metainfo") {
|
||||
$kcmdline = "imgurl=$httpmethod://$imgsrv:$httpport/$rootimgdir/rootimg-statelite.gz.metainfo STATEMNT=";
|
||||
} else {
|
||||
$kcmdline = "imgurl=$httpmethod://$imgsrv:$httpport/$rootimgdir/rootimg-statelite.gz STATEMNT=";
|
||||
}
|
||||
}
|
||||
|
||||
# add support for subVars in the value of "statemnt"
|
||||
@@ -724,8 +728,13 @@ sub mknetboot
|
||||
$kcmdline .= "NODE=$node ";
|
||||
}
|
||||
else {
|
||||
$kcmdline =
|
||||
"imgurl=$httpmethod://$imgsrv:$httpport/$rootimgdir/rootimg.$suffix ";
|
||||
if (-r "$rootimgdir/rootimg.$suffix.metainfo") {
|
||||
$kcmdline =
|
||||
"imgurl=$httpmethod://$imgsrv:$httpport/$rootimgdir/rootimg.$suffix.metainfo ";
|
||||
} else {
|
||||
$kcmdline =
|
||||
"imgurl=$httpmethod://$imgsrv:$httpport/$rootimgdir/rootimg.$suffix ";
|
||||
}
|
||||
$kcmdline .= "XCAT=$xcatmaster:$xcatdport ";
|
||||
$kcmdline .= "NODE=$node ";
|
||||
# add flow control setting
|
||||
@@ -743,15 +752,19 @@ sub mknetboot
|
||||
my $useifname=0;
|
||||
#for rhels5.x-ppc64, if installnic="mac", BOOTIF=<mac> should be appended
|
||||
my $usemac=0;
|
||||
my $nicname="";
|
||||
if ($reshash->{$node}->[0] and $reshash->{$node}->[0]->{installnic} and $reshash->{$node}->[0]->{installnic} ne "mac") {
|
||||
$useifname=1;
|
||||
$kcmdline .= "ifname=".$reshash->{$node}->[0]->{installnic} . ":";
|
||||
#$kcmdline .= "ifname=".$reshash->{$node}->[0]->{installnic} . ":";
|
||||
$nicname=$reshash->{$node}->[0]->{installnic};
|
||||
} elsif ($nodebootif) {
|
||||
$useifname=1;
|
||||
$kcmdline .= "ifname=$nodebootif:";
|
||||
#$kcmdline .= "ifname=$nodebootif:";
|
||||
$nicname=$nodebootif;
|
||||
} elsif ($reshash->{$node}->[0] and $reshash->{$node}->[0]->{primarynic} and $reshash->{$node}->[0]->{primarynic} ne "mac") {
|
||||
$useifname=1;
|
||||
$kcmdline .= "ifname=".$reshash->{$node}->[0]->{primarynic}.":";
|
||||
#$kcmdline .= "ifname=".$reshash->{$node}->[0]->{primarynic}.":";
|
||||
$nicname=$reshash->{$node}->[0]->{primarynic};
|
||||
}else{
|
||||
if($arch=~ /ppc/)
|
||||
{
|
||||
@@ -781,24 +794,32 @@ sub mknetboot
|
||||
# }
|
||||
}
|
||||
|
||||
if ($useifname && $mac) {
|
||||
$kcmdline .= "$mac ";
|
||||
if( ($nicname ne "") and (not xCAT::NetworkUtils->isValidMAC($nicname) )){
|
||||
if ($useifname && $mac) {
|
||||
$kcmdline .= "ifname=$nicname:$mac ";
|
||||
}
|
||||
$kcmdline .= "netdev=$nicname ";
|
||||
}else {
|
||||
if($mac){
|
||||
$kcmdline .= "BOOTIF=$mac ";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# add "netdev=<eth0>" or "BOOTIF=<mac>"
|
||||
# which are used for other scenarios
|
||||
my $netdev = "";
|
||||
if ($reshash->{$node}->[0] and $reshash->{$node}->[0]->{installnic} and $reshash->{$node}->[0]->{installnic} ne "mac") {
|
||||
$kcmdline .= "netdev=" . $reshash->{$node}->[0]->{installnic} . " ";
|
||||
} elsif ($nodebootif) {
|
||||
$kcmdline .= "netdev=" . $nodebootif . " ";
|
||||
} elsif ( $reshash->{$node}->[0] and $reshash->{$node}->[0]->{primarynic} and $reshash->{$node}->[0]->{primarynic} ne "mac") {
|
||||
$kcmdline .= "netdev=" . $reshash->{$node}->[0]->{primarynic} . " ";
|
||||
} else {
|
||||
if ( ($usemac || $useifname) && $mac) {
|
||||
$kcmdline .= "BOOTIF=" . $mac . " ";
|
||||
}
|
||||
}
|
||||
#my $netdev = "";
|
||||
#if ($reshash->{$node}->[0] and $reshash->{$node}->[0]->{installnic} and $reshash->{$node}->[0]->{installnic} ne "mac") {
|
||||
# $kcmdline .= "netdev=" . $reshash->{$node}->[0]->{installnic} . " ";
|
||||
#} elsif ($nodebootif) {
|
||||
# $kcmdline .= "netdev=" . $nodebootif . " ";
|
||||
#} elsif ( $reshash->{$node}->[0] and $reshash->{$node}->[0]->{primarynic} and $reshash->{$node}->[0]->{primarynic} ne "mac") {
|
||||
# $kcmdline .= "netdev=" . $reshash->{$node}->[0]->{primarynic} . " ";
|
||||
#} else {
|
||||
# if ( ($usemac || $useifname) && $mac) {
|
||||
# $kcmdline .= "BOOTIF=" . $mac . " ";
|
||||
# }
|
||||
#}
|
||||
|
||||
my %client_nethash = xCAT::DBobjUtils->getNetwkInfo( [$node] );
|
||||
if ( $client_nethash{$node}{mgtifname} =~ /hf/ )
|
||||
@@ -1650,6 +1671,7 @@ sub mksysclone
|
||||
copy("$installroot/postscripts/$script1","$pspath/15all.$script1");
|
||||
copy("$installroot/postscripts/$script2","$pspath/16all.$script2");
|
||||
copy("$installroot/postscripts/runxcatpost","$pspath/17all.runxcatpost");
|
||||
copy("$installroot/postscripts/makeinitrd","$pspath/20all.makeinitrd");
|
||||
|
||||
unless (-r "$pspath/10all.fix_swap_uuids")
|
||||
{
|
||||
@@ -1969,20 +1991,51 @@ sub mksysclone
|
||||
}
|
||||
|
||||
my $cmd =qq{echo "$node:compute:$imagename:" >> $clusterfile};
|
||||
my $out = xCAT::Utils->runcmd($cmd, -1);
|
||||
my $rc = xCAT::Utils->runcmd($cmd, -1);
|
||||
|
||||
my $imagedir;
|
||||
my $osimagetab = xCAT::Table->new('linuximage');
|
||||
my $osimageentry = $osimagetab->getAttribs({imagename => $imagename}, 'rootimgdir');
|
||||
if($osimageentry){
|
||||
$imagedir = $osimageentry->{rootimgdir};
|
||||
$imagedir =~ s/^(\/.*)\/.+\/?$/$1/;
|
||||
}else{
|
||||
$imagedir = "$installroot/sysclone/images";
|
||||
$cmd = "chdef -t osimage $imagename rootimgdir=$imagedir/$imagename";
|
||||
$rc = `$cmd`;
|
||||
}
|
||||
|
||||
my $cfgimagedir = `cat /etc/systemimager/rsync_stubs/40$imagename|grep path`;
|
||||
chomp($cfgimagedir);
|
||||
$cfgimagedir =~ s/^\s+path=(\/.*)\/.+$/$1/g;
|
||||
|
||||
if($imagedir ne $cfgimagedir){
|
||||
my $oldstr = `cat /etc/systemimager/rsync_stubs/40$imagename|grep path`;
|
||||
chomp($oldstr);
|
||||
$oldstr =~ s/\//\\\\\//g;
|
||||
|
||||
unless (-r "$installroot/sysclone/images/$imagename/opt/xcat/xcatdsklspost")
|
||||
my $targetstr="\tpath=".$imagedir."/".$imagename;
|
||||
$targetstr =~ s/\//\\\\\//g;
|
||||
$cmd= "sed -i \"s/$oldstr/$targetstr/\" /etc/systemimager/rsync_stubs/40$imagename";
|
||||
$rc = `$cmd`;
|
||||
}
|
||||
|
||||
$rc = `export PERL5LIB=/usr/lib/perl5/site_perl/;LANG=C si_mkrsyncd_conf`;
|
||||
|
||||
unless (-r "$imagedir/$imagename/opt/xcat/xcatdsklspost")
|
||||
{
|
||||
mkpath("$installroot/sysclone/images/$imagename/opt/xcat/");
|
||||
copy("$installroot/postscripts/xcatdsklspost","$installroot/sysclone/images/$imagename/opt/xcat/");
|
||||
mkpath("$imagedir/$imagename/opt/xcat/");
|
||||
copy("$installroot/postscripts/xcatdsklspost","$imagedir/$imagename/opt/xcat/");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
# check systemimager-server-rsyncd to make sure it's running.
|
||||
my $out = xCAT::Utils->runcmd("service systemimager-server-rsyncd status", -1);
|
||||
if ($::RUNCMD_RC != 0) { # not running
|
||||
my $rc = xCAT::Utils->startService("systemimager-server-rsyncd");
|
||||
#my $out = xCAT::Utils->runcmd("service systemimager-server-rsyncd status", -1);
|
||||
# if ($::RUNCMD_RC != 0) { # not running
|
||||
my $retcode=xCAT::Utils->checkservicestatus("systemimager-server-rsyncd");
|
||||
if($retcode!=0){
|
||||
my $rc = xCAT::Utils->startservice("systemimager-server-rsyncd");
|
||||
if ($rc != 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ use xCAT::Utils;
|
||||
use xCAT::TableUtils;
|
||||
use Getopt::Long;
|
||||
use Sys::Hostname;
|
||||
use xCAT::SvrUtils;
|
||||
|
||||
use strict;
|
||||
use Data::Dumper;
|
||||
|
||||
@@ -571,7 +571,8 @@ sub process_request {
|
||||
}
|
||||
else
|
||||
{
|
||||
system("service $service stop"); #named may otherwise hold on to stale journal filehandles
|
||||
#system("service $service stop"); #named may otherwise hold on to stale journal filehandles
|
||||
xCAT::Utils->stopservice("named");
|
||||
}
|
||||
my $conf = get_conf();
|
||||
unlink $conf;
|
||||
@@ -614,24 +615,31 @@ sub process_request {
|
||||
}
|
||||
else
|
||||
{
|
||||
my $cmd = "service $service stop";
|
||||
my @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
my $outp = join('', @output);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "Command failed: $cmd. Error message: $outp.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return;
|
||||
}
|
||||
#my $cmd = "service $service stop";
|
||||
#my @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
#my $outp = join('', @output);
|
||||
#if ($::RUNCMD_RC != 0)
|
||||
#{
|
||||
# my $rsp = {};
|
||||
# $rsp->{data}->[0] = "Command failed: $cmd. Error message: $outp.\n";
|
||||
# xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
# return;
|
||||
#}
|
||||
|
||||
$cmd = "service $service start";
|
||||
@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
$outp = join('', @output);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
#$cmd = "service $service start";
|
||||
#@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
#$outp = join('', @output);
|
||||
#if ($::RUNCMD_RC != 0)
|
||||
#{
|
||||
# my $rsp = {};
|
||||
# $rsp->{data}->[0] = "Command failed: $cmd. Error message: $outp.\n";
|
||||
# xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
# return;
|
||||
#}
|
||||
my $retcode=xCAT::Utils->restartservice("named");
|
||||
if($retcode!=0){
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "Command failed: $cmd. Error message: $outp.\n";
|
||||
$rsp->{data}->[0] = "failed to start named.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return;
|
||||
}
|
||||
@@ -673,20 +681,29 @@ sub process_request {
|
||||
}
|
||||
else
|
||||
{
|
||||
my $cmd = "service $service status|grep running";
|
||||
my @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
#my $cmd = "service $service status|grep running";
|
||||
#my @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
#if ($::RUNCMD_RC != 0)
|
||||
#{
|
||||
# $cmd = "service $service start";
|
||||
# @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
# my $outp = join('', @output);
|
||||
# if ($::RUNCMD_RC != 0)
|
||||
# {
|
||||
# my $rsp = {};
|
||||
# $rsp->{data}->[0] = "Command failed: $cmd. Error message: $outp.\n";
|
||||
# xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
# return;
|
||||
# }
|
||||
#}
|
||||
my $retcode=xCAT::Utils->startservice("named");
|
||||
if($retcode!=0)
|
||||
{
|
||||
$cmd = "service $service start";
|
||||
@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
my $outp = join('', @output);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "Command failed: $cmd. Error message: $outp.\n";
|
||||
$rsp->{data}->[0] = "failed to start named.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1009,6 +1026,7 @@ sub update_namedconf {
|
||||
push @newnamed,"options {\n";
|
||||
unless ($slave && xCAT::Utils->isLinux()) {
|
||||
push @newnamed,"\tdirectory \"".$ctx->{zonesdir}."\";\n";
|
||||
push @newnamed, "\tallow-recursion { any; };\n";
|
||||
}
|
||||
push @newnamed,"\t\t//listen-on-v6 { any; };\n";
|
||||
if ($ctx->{forwarders}) {
|
||||
|
||||
@@ -503,7 +503,8 @@ sub setdestiny {
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($provmethod ne 'install') {
|
||||
#don't clean up provmethod if osimage.provmethod is install or sysclone
|
||||
if ($provmethod ne 'install' && $provmethod ne 'sysclone') {
|
||||
push(@nodestoblank, $_);
|
||||
}
|
||||
}
|
||||
@@ -571,6 +572,7 @@ sub nextdestiny {
|
||||
}
|
||||
|
||||
my $node;
|
||||
my $noupdate_flag = 0;
|
||||
$chaintab = xCAT::Table->new('chain');
|
||||
my $chainents = $chaintab->getNodesAttribs(\@nodes,[qw(currstate currchain chain)]);
|
||||
foreach $node (@nodes) {
|
||||
@@ -598,13 +600,28 @@ sub nextdestiny {
|
||||
my %requ;
|
||||
$requ{node}=[$node];
|
||||
$requ{arg}=[$ref->{currstate}];
|
||||
if($ref->{currstate} =~ /noupdateinitrd$/)
|
||||
{
|
||||
my @items = split /[:]/,$ref->{currstate};
|
||||
$requ{arg}= \@items;
|
||||
$noupdate_flag = 1;
|
||||
}
|
||||
setdestiny(\%requ, $flag+1);
|
||||
}
|
||||
|
||||
if ($callnodeset) {
|
||||
my $args;
|
||||
if($noupdate_flag)
|
||||
{
|
||||
$args = ['enact', '--noupdateinitrd'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$args = ['enact'];
|
||||
}
|
||||
$subreq->({command=>['nodeset'],
|
||||
node=> \@nodes,
|
||||
arg=>['enact']});
|
||||
arg=>$args});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -884,15 +884,19 @@ sub check_options
|
||||
# if not help and not -n, dhcpd needs to be running
|
||||
if (!($opt->{h})&& (!($opt->{n}))) {
|
||||
if (xCAT::Utils->isLinux()) {
|
||||
my $DHCPSERVER="dhcpd";
|
||||
if( -e "/etc/init.d/isc-dhcp-server" ){
|
||||
$DHCPSERVER="isc-dhcp-server";
|
||||
}
|
||||
#my $DHCPSERVER="dhcpd";
|
||||
#if( -e "/etc/init.d/isc-dhcp-server" ){
|
||||
# $DHCPSERVER="isc-dhcp-server";
|
||||
#}
|
||||
|
||||
my @output = xCAT::Utils->runcmd("service $DHCPSERVER status", -1);
|
||||
if ($::RUNCMD_RC != 0) { # not running
|
||||
#my @output = xCAT::Utils->runcmd("service $DHCPSERVER status", -1);
|
||||
#if ($::RUNCMD_RC != 0) { # not running
|
||||
my $ret=0;
|
||||
$ret=xCAT::Utils->checkservicestatus("dhcp");
|
||||
if($ret!=0)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "$DHCPSERVER is not running. Run service $DHCPSERVER start and rerun your command.";
|
||||
$rsp->{data}->[0] = "dhcp server is not running. please start the dhcp server.";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback, 1);
|
||||
return 1;
|
||||
}
|
||||
@@ -1840,25 +1844,29 @@ sub process_request
|
||||
{
|
||||
restart_dhcpd_aix();
|
||||
}
|
||||
elsif ( $distro =~ /ubuntu.*/ || $distro =~ /debian.*/i)
|
||||
{
|
||||
if (-e '/etc/dhcp/dhcpd.conf') {
|
||||
system("chmod a+r /etc/dhcp/dhcpd.conf");
|
||||
system("/etc/init.d/isc-dhcp-server restart");
|
||||
}
|
||||
else {
|
||||
#ubuntu config
|
||||
system("chmod a+r /etc/dhcp3/dhcpd.conf");
|
||||
system("/etc/init.d/dhcp3-server restart");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
system("/etc/init.d/dhcpd restart");
|
||||
# should not chkconfig dhcpd on every makedhcp invoation
|
||||
# it is not appropriate and will cause problem for HAMN
|
||||
# do it in xcatconfig instead
|
||||
#system("chkconfig dhcpd on");
|
||||
else {
|
||||
if ( $distro =~ /ubuntu.*/ || $distro =~ /debian.*/i)
|
||||
{
|
||||
if (-e '/etc/dhcp/dhcpd.conf') {
|
||||
system("chmod a+r /etc/dhcp/dhcpd.conf");
|
||||
#system("/etc/init.d/isc-dhcp-server restart");
|
||||
}
|
||||
else {
|
||||
#ubuntu config
|
||||
system("chmod a+r /etc/dhcp3/dhcpd.conf");
|
||||
#system("/etc/init.d/dhcp3-server restart");
|
||||
}
|
||||
}
|
||||
#else
|
||||
#{
|
||||
# system("/etc/init.d/dhcpd restart");
|
||||
# # should not chkconfig dhcpd on every makedhcp invoation
|
||||
# # it is not appropriate and will cause problem for HAMN
|
||||
# # do it in xcatconfig instead
|
||||
# #system("chkconfig dhcpd on");
|
||||
#}
|
||||
xCAT::Utils->restartservice("dhcp");
|
||||
print "xx";
|
||||
}
|
||||
}
|
||||
flock($dhcplockfd,LOCK_UN);
|
||||
|
||||
@@ -130,7 +130,7 @@ sub process_request {
|
||||
my $shortname = xCAT::InstUtils->myxCATname();
|
||||
|
||||
my $rc;
|
||||
$rc = sysclone_configserver($shortname, $callback, $doreq);
|
||||
$rc = sysclone_configserver($shortname, $osimg, $callback, $doreq);
|
||||
if($rc){
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = qq{Can not configure Imager Server on $shortname.};
|
||||
@@ -467,7 +467,7 @@ sub getplatform {
|
||||
}
|
||||
|
||||
sub sysclone_configserver{
|
||||
my ($server, $callback, $subreq) = @_;
|
||||
my ($server, $osimage, $callback, $subreq) = @_;
|
||||
|
||||
# check if systemimager is installed on the imager server
|
||||
my $rsp = {};
|
||||
@@ -514,9 +514,40 @@ sub sysclone_configserver{
|
||||
{
|
||||
mkpath($sysclone_overrides);
|
||||
}
|
||||
|
||||
my $imagedir;
|
||||
my $osimgtab = xCAT::Table->new('osimage');
|
||||
my $entry = ($osimgtab->getAllAttribsWhere("imagename = '$osimage'", 'ALL' ))[0];
|
||||
if(!$entry){
|
||||
$imagedir = $sysclone_home . "/images/" . $osimage;
|
||||
}else{
|
||||
my $osimagetab = xCAT::Table->new('linuximage');
|
||||
my $osimageentry = $osimagetab->getAttribs({imagename => $osimage}, 'rootimgdir');
|
||||
if($osimageentry){
|
||||
$imagedir = $osimageentry->{rootimgdir};
|
||||
if (!(-e $imagedir)){
|
||||
mkpath($imagedir);
|
||||
}
|
||||
}else{
|
||||
$imagedir = $sysclone_home . "/images/" . $osimage;
|
||||
$cmd = "chdef -t osimage $osimage rootimgdir=$imagedir";
|
||||
$rc = `$cmd`;
|
||||
}
|
||||
}
|
||||
|
||||
$imagedir =~ s/^(\/.*)\/.+\/?$/$1/;
|
||||
$imagedir =~ s/\//\\\\\//g;
|
||||
$imagedir = "DEFAULT_IMAGE_DIR = ".$imagedir;
|
||||
|
||||
my $olddir = `more /etc/systemimager/systemimager.conf |grep DEFAULT_IMAGE_DIR`;
|
||||
$olddir =~ s/\//\\\\\//g;
|
||||
chomp($olddir);
|
||||
|
||||
$cmd= "sed -i \"s/$olddir/$imagedir/\" /etc/systemimager/systemimager.conf";
|
||||
$rc = `$cmd`;
|
||||
|
||||
# update /etc/systemimager/rsync_stubs/10header to generate new /etc/systemimager/rsyncd.conf
|
||||
my $rc = `sed -i "s/\\/var\\/lib\\/systemimager/\\/install\\/sysclone/g" /etc/systemimager/rsync_stubs/10header`;
|
||||
$rc = `sed -i "s/\\/var\\/lib\\/systemimager/\\/install\\/sysclone/g" /etc/systemimager/rsync_stubs/10header`;
|
||||
$rc = `export PERL5LIB=/usr/lib/perl5/site_perl/;LANG=C si_mkrsyncd_conf`;
|
||||
|
||||
return 0;
|
||||
@@ -678,6 +709,22 @@ sub sysclone_createosimgdef{
|
||||
$osimgdef{$osimage}{template} = "";
|
||||
$osimgdef{$osimage}{otherpkglist} = "";
|
||||
$osimgdef{$osimage}{pkglist} = "";
|
||||
|
||||
if(!($imagedef{$oldimg}{rootimgdir})){
|
||||
$imagedef{$oldimg}{rootimgdir} = $sysclone_home . "/images/" . $osimage;
|
||||
|
||||
my $imagedir = $imagedef{$oldimg}{rootimgdir};
|
||||
$imagedir =~ s/^(\/.*)\/.+\/?$/$1/;
|
||||
$imagedir =~ s/\//\\\\\//g;
|
||||
$imagedir = "DEFAULT_IMAGE_DIR = ".$imagedir;
|
||||
|
||||
my $olddir = `more /etc/systemimager/systemimager.conf |grep DEFAULT_IMAGE_DIR`;
|
||||
$olddir =~ s/\//\\\\\//g;
|
||||
chomp($olddir);
|
||||
|
||||
my $cmd= "sed -i \"s/$olddir/$imagedir/\" /etc/systemimager/systemimager.conf";
|
||||
my $rc = `$cmd`;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$createnew = 1;
|
||||
@@ -701,6 +748,18 @@ sub sysclone_createosimgdef{
|
||||
$osimgdef{$osimage}{osname} = "Linux";
|
||||
$osimgdef{$osimage}{osvers} = $osver;
|
||||
$osimgdef{$osimage}{osdistroname} = "$osver-$arch";
|
||||
|
||||
$osimgdef{$osimage}{rootimgdir} = $sysclone_home . "/images/" . $osimage;
|
||||
my $imagedir = $osimgdef{$osimage}{rootimgdir};
|
||||
$imagedir =~ s/^(\/.*)\/.+\/?$/$1/;
|
||||
$imagedir =~ s/\//\\\\\//g;
|
||||
$imagedir = "DEFAULT_IMAGE_DIR = ".$imagedir;
|
||||
my $olddir = `more /etc/systemimager/systemimager.conf |grep DEFAULT_IMAGE_DIR`;
|
||||
$olddir =~ s/\//\\\\\//g;
|
||||
chomp($olddir);
|
||||
my $cmd= "sed -i \"s/$olddir/$imagedir/\" /etc/systemimager/systemimager.conf";
|
||||
my $rc = `$cmd`;
|
||||
|
||||
#$osimgdef{$osimage}{pkgdir} = "/install/$osver/$arch";
|
||||
#$osimgdef{$osimage}{otherpkgdir} = "/install/post/otherpkgs/$osver/$arch";
|
||||
}
|
||||
|
||||
@@ -1412,7 +1412,7 @@ sub create_symlink {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$callback->({error => ["osimage table or kitcomponent do not exist"],errorcode=>[1]});
|
||||
$callback->({warning => ["osimage table or kitcomponent do not exist"],errorcode=>[1]});
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -1802,7 +1802,7 @@ sub make_files {
|
||||
}
|
||||
if ( $hasplugin ) {
|
||||
# Issue xcatd reload to load the new plugins
|
||||
system("/etc/init.d/xcatd reload");
|
||||
system("/etc/init.d/xcatd restart");
|
||||
$hasplugin=0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1146,6 +1146,12 @@ sub getrvidparms_imm2 {
|
||||
$response = $browser->request(GET $baseurl."designs/imm/viewer(".$sessdata->{ipmisession}->{bmc}.'@'.$httpport.'@'.$ip6mode.'@'.time().'@1@0@1@jnlp'.'@USERID@0@0@0@0'.')');
|
||||
#arguments are host, then ipv6 or not, then timestamp, then whether to encrypte or not, singleusermode, finally 'notwin32'
|
||||
$jnlp = $response->content;
|
||||
if ($jnlp =~ /Failed to parse ip format for request/) {
|
||||
$response = $browser->request(GET $baseurl."designs/imm/viewer(".$sessdata->{ipmisession}->{bmc}.'@'.$httpport.'@'.$ip6mode.'@'.time().'@1@0@1@jnlp'.'@USERID@0@0@0@0@0'.')');
|
||||
#arguments are host, then ipv6 or not, then timestamp, then whether to encrypte or not, singleusermode, 'notwin32', and one more (unknown)
|
||||
$jnlp = $response->content;
|
||||
}
|
||||
|
||||
}
|
||||
$response = $browser->request(GET $baseurl."data/logout");
|
||||
my $currnode = $sessdata->{node};
|
||||
@@ -1541,6 +1547,7 @@ sub power_with_context {
|
||||
return;
|
||||
} elsif ($subcommand eq "wake") {
|
||||
$sessdata->{ipmisession}->subcmd(netfn=>0x3a,command=>0x1d,data=>[0,0],callback=>\&power_response,callback_args=>$sessdata);
|
||||
return;
|
||||
} elsif (not $argmap{$subcommand}) {
|
||||
xCAT::SvrUtils::sendmsg([1,"unsupported command power $subcommand"],$callback);
|
||||
return;
|
||||
@@ -1956,11 +1963,20 @@ sub got_bios_buildid {
|
||||
my $sessdata = $res{sessdata};
|
||||
if ($res{data}) {
|
||||
$sessdata->{biosbuildid} = $res{data};
|
||||
get_imm_property(property=>"/v2/bios/build_version",callback=>\&got_bios_version,sessdata=>$sessdata);
|
||||
get_imm_property(property=>"/v2/bios/pending_build_version",callback=>\&got_bios_pending_buildid,sessdata=>$sessdata);
|
||||
} else {
|
||||
initfru_with_mprom($sessdata);
|
||||
}
|
||||
}
|
||||
sub got_bios_pending_buildid {
|
||||
my %res = @_;
|
||||
my $sessdata = $res{sessdata};
|
||||
$sessdata->{biosbuildpending} = 0;
|
||||
if ($res{data} and $res{data} ne ' ') {
|
||||
$sessdata->{biosbuildpending} = 1;
|
||||
}
|
||||
get_imm_property(property=>"/v2/bios/build_version",callback=>\&got_bios_version,sessdata=>$sessdata);
|
||||
}
|
||||
sub got_bios_version {
|
||||
my %res = @_;
|
||||
my $sessdata = $res{sessdata};
|
||||
@@ -1979,7 +1995,12 @@ sub got_bios_date {
|
||||
my $fru = FRU->new();
|
||||
$fru->rec_type("bios,uefi,firmware");
|
||||
$fru->desc("UEFI Version");
|
||||
$fru->value($sessdata->{biosbuildversion}." (".$sessdata->{biosbuildid}." ".$sessdata->{biosbuilddate}.")");
|
||||
my $pending = "";
|
||||
if ($sessdata->{biosbuildpending}) {
|
||||
$pending = " [PENDING]";
|
||||
}
|
||||
my $value = $sessdata->{biosbuildversion}." (".$sessdata->{biosbuildid}." ".$sessdata->{biosbuilddate}.")$pending";
|
||||
$fru->value($value);
|
||||
$sessdata->{fru_hash}->{uefi} = $fru;
|
||||
get_imm_property(property=>"/v2/fpga/build_id",callback=>\&got_fpga_buildid,sessdata=>$sessdata);
|
||||
} else {
|
||||
@@ -2204,7 +2225,7 @@ sub initfru_zero {
|
||||
$fru = FRU->new();
|
||||
$fru->rec_type("misc");
|
||||
$fru->desc("System Manufacturer");
|
||||
if ($fruhash->{product}->{product}->{encoding}==3) {
|
||||
if ($fruhash->{product}->{manufacturer}->{encoding}==3) {
|
||||
$fru->value($fruhash->{product}->{manufacturer}->{value});
|
||||
} else {
|
||||
$fru->value(phex($fruhash->{product}->{manufacturer}->{value}));
|
||||
@@ -2767,7 +2788,7 @@ sub readcurrfrudevice {
|
||||
shift @data;
|
||||
push @{$sessdata->{currfrudata}},@data;
|
||||
if ($sessdata->{currfrudone}) {
|
||||
if ($sessdata->{isite}) {
|
||||
if ($sessdata->{isite} and $sessdata->{currfrusdr} and ($sessdata->{currfrusdr}->fru_oem & 0x80)) {
|
||||
#IBM OEM command, d0,51,0 further qualifies the command name, we'll first take a stop at block 0, offset 2, one byte, to get VPD version number
|
||||
#command structured as:
|
||||
#d0,51,0 = command set identifier
|
||||
|
||||
@@ -1411,7 +1411,7 @@ sub addkit
|
||||
|
||||
if ( $hasplugin ) {
|
||||
# Issue xcatd reload to load the new plugins
|
||||
system("/etc/init.d/xcatd reload");
|
||||
system("/etc/init.d/xcatd restart");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1494,6 +1494,7 @@ sub rmkit
|
||||
my %kitnames;
|
||||
my $des = shift @ARGV;
|
||||
my @kits = split ',', $des;
|
||||
my $DBname = xCAT::Utils->get_DBName; # support for DB2
|
||||
foreach my $kit (@kits) {
|
||||
|
||||
# Check if it is a kitname or basename
|
||||
@@ -1508,7 +1509,12 @@ sub rmkit
|
||||
}
|
||||
$kitnames{$kit} = 1;
|
||||
} else {
|
||||
my @entries = $tabs{kit}->getAllAttribsWhere( "basename = '$kit'", 'kitname', 'isinternal');
|
||||
my @entries;
|
||||
if ($DBname =~ /^DB2/) {
|
||||
@entries = $tabs{kit}->getAllAttribsWhere( "\"basename\" = '$kit'", 'kitname', 'isinternal');
|
||||
} else {
|
||||
@entries = $tabs{kit}->getAllAttribsWhere( "basename = '$kit'", 'kitname', 'isinternal');
|
||||
}
|
||||
unless (@entries) {
|
||||
my %rsp;
|
||||
push@{ $rsp{data} }, "Kit $kit could not be found in DB $t";
|
||||
@@ -1545,8 +1551,12 @@ sub rmkit
|
||||
|
||||
# Find all the components in this kit.
|
||||
my $kitcompnames;
|
||||
my @kitcomphash = $tabs{kitcomponent}->getAllAttribsWhere( "kitname = '$kitname'", 'kitcompname', 'postbootscripts', 'genimage_postinstall');
|
||||
|
||||
my @kitcomphash;
|
||||
if ($DBname =~ /^DB2/) {
|
||||
@kitcomphash = $tabs{kitcomponent}->getAllAttribsWhere( "\"kitname\" = '$kitname'", 'kitcompname', 'postbootscripts', 'genimage_postinstall');
|
||||
} else {
|
||||
@kitcomphash = $tabs{kitcomponent}->getAllAttribsWhere( "kitname = '$kitname'", 'kitcompname', 'postbootscripts', 'genimage_postinstall');
|
||||
}
|
||||
if (@entries && (@entries > 0)) {
|
||||
|
||||
if($::VERBOSE and !$test){
|
||||
@@ -1682,7 +1692,12 @@ sub rmkit
|
||||
}
|
||||
|
||||
# Remove kitrepo
|
||||
my @kitrepohash = $tabs{kitrepo}->getAllAttribsWhere( "kitname = '$kitname'", 'kitreponame');
|
||||
my @kitrepohash;
|
||||
if ($DBname =~ /^DB2/) {
|
||||
@kitrepohash = $tabs{kitrepo}->getAllAttribsWhere( "\"kitname\" = '$kitname'", 'kitreponame');
|
||||
} else {
|
||||
@kitrepohash = $tabs{kitrepo}->getAllAttribsWhere( "kitname = '$kitname'", 'kitreponame');
|
||||
}
|
||||
foreach my $kitrepo ( @kitrepohash ) {
|
||||
my $kitreponame = $kitrepo->{kitreponame};
|
||||
$tabs{kitrepo}->delEntries({kitreponame => $kitreponame});
|
||||
@@ -1716,7 +1731,7 @@ sub rmkit
|
||||
|
||||
if ( $hasplugin ) {
|
||||
# Issue xcatd reload to load the new plugins
|
||||
system("/etc/init.d/xcatd reload");
|
||||
system("/etc/init.d/xcatd restart");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1878,7 +1893,7 @@ sub addkitcomp
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
my $DBname = xCAT::Utils->get_DBName; # support for DB2
|
||||
my %tabs = ();
|
||||
my @tables = qw(kit kitrepo kitcomponent osimage osdistro linuximage);
|
||||
foreach my $t ( @tables ) {
|
||||
@@ -1911,7 +1926,12 @@ sub addkitcomp
|
||||
$kitcomps{$kitcomponent}{name} = $kitcomponent;
|
||||
$kitcomps{$kitcomponent}{basename} = $kitcomptable->{'basename'};
|
||||
} else {
|
||||
my @entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcomponent'", 'kitcompname' , 'version', 'release');
|
||||
my @entries;
|
||||
if ($DBname =~ /^DB2/) {
|
||||
@entries = $tabs{kitcomponent}->getAllAttribsWhere( "\"basename\" = '$kitcomponent'", 'kitcompname' , 'version', 'release');
|
||||
} else {
|
||||
@entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcomponent'", 'kitcompname' , 'version', 'release');
|
||||
}
|
||||
unless (@entries) {
|
||||
my %rsp;
|
||||
push@{ $rsp{data} }, "$kitcomponent kitcomponent does not exist";
|
||||
@@ -2101,7 +2121,12 @@ sub addkitcomp
|
||||
my @kitcompdeps = split ',', $kitcomptable->{'kitcompdeps'};
|
||||
foreach my $kitcompdependency ( @kitcompdeps ) {
|
||||
my ($kitcompdep, $vers) = split /<=|>=|=|<|>/, $kitcompdependency;
|
||||
my @entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcompdep'", 'kitreponame', 'kitname', 'kitcompname' , 'serverroles', 'kitcompdeps', 'version', 'prerequisite', 'release');
|
||||
my @entries;
|
||||
if ($DBname =~ /^DB2/) {
|
||||
@entries = $tabs{kitcomponent}->getAllAttribsWhere( "\"basename\" = '$kitcompdep'", 'kitreponame', 'kitname', 'kitcompname' , 'serverroles', 'kitcompdeps', 'version', 'prerequisite', 'release');
|
||||
} else {
|
||||
@entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcompdep'", 'kitreponame', 'kitname', 'kitcompname' , 'serverroles', 'kitcompdeps', 'version', 'prerequisite', 'release');
|
||||
}
|
||||
unless (@entries) {
|
||||
my %rsp;
|
||||
push@{ $rsp{data} }, "Cannot find any matched kit component for kit component $kitcomp dependency $kitcompdep";
|
||||
@@ -2413,7 +2438,7 @@ sub rmkitcomp
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
my $DBname = xCAT::Utils->get_DBName; # support for DB2
|
||||
my %tabs = ();
|
||||
my @tables = qw(kit kitrepo kitcomponent osimage osdistro linuximage);
|
||||
foreach my $t ( @tables ) {
|
||||
@@ -2456,7 +2481,12 @@ sub rmkitcomp
|
||||
$kitcomps{$kitcomponent}{driverpacks} = $kitcomptable->{driverpacks};
|
||||
$kitcomps{$kitcomponent}{genimage_postinstall} = $kitcomptable->{genimage_postinstall};
|
||||
} else {
|
||||
my @entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcomponent'", 'kitcompname' , 'version', 'release');
|
||||
my @entries;
|
||||
if ($DBname =~ /^DB2/) {
|
||||
@entries = $tabs{kitcomponent}->getAllAttribsWhere( "\"basename\" = '$kitcomponent'", 'kitcompname' , 'version', 'release');
|
||||
} else {
|
||||
@entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcomponent'", 'kitcompname' , 'version', 'release');
|
||||
}
|
||||
unless (@entries) {
|
||||
my %rsp;
|
||||
push@{ $rsp{data} }, "$kitcomponent kitcomponent does not exist";
|
||||
@@ -2530,7 +2560,12 @@ sub rmkitcomp
|
||||
|
||||
my ($kitcompdep, $vers) = split /<=|>=|=|<|>/, $kitcompdependency;
|
||||
# Get the kit component full name from basename.
|
||||
my @entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcompdep'", 'kitcompname' , 'version', 'release');
|
||||
my @entries;
|
||||
if ($DBname =~ /^DB2/) {
|
||||
@entries = $tabs{kitcomponent}->getAllAttribsWhere( "\"basename\" = '$kitcompdep'", 'kitcompname' , 'version', 'release');
|
||||
} else {
|
||||
@entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcompdep'", 'kitcompname' , 'version', 'release');
|
||||
}
|
||||
unless (@entries) {
|
||||
my %rsp;
|
||||
push@{ $rsp{data} }, "kitcomponent $kitcompdep basename does not exist";
|
||||
@@ -3214,7 +3249,7 @@ sub chkkitcomp
|
||||
create_version_response('chkkitcomp');
|
||||
return 1; # no usage - just exit
|
||||
}
|
||||
|
||||
my $DBname = xCAT::Utils->get_DBName; # support for DB2
|
||||
my %tabs = ();
|
||||
my @tables = qw(kit kitrepo kitcomponent osimage osdistro linuximage);
|
||||
foreach my $t ( @tables ) {
|
||||
@@ -3248,7 +3283,12 @@ sub chkkitcomp
|
||||
$kitcomps{$kitcomponent}{serverroles} = $kitcomptable->{serverroles};
|
||||
$kitcompbasename{$kitcomptable->{basename}} = 1;
|
||||
} else {
|
||||
my @entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcomponent'", 'kitcompname' , 'version', 'release');
|
||||
my @entries;
|
||||
if ($DBname =~ /^DB2/) {
|
||||
@entries = $tabs{kitcomponent}->getAllAttribsWhere( "\"basename\" = '$kitcomponent'", 'kitcompname' , 'version', 'release');
|
||||
} else {
|
||||
@entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcomponent'", 'kitcompname' , 'version', 'release');
|
||||
}
|
||||
unless (@entries) {
|
||||
my %rsp;
|
||||
push@{ $rsp{data} }, "$kitcomponent kitcomponent does not exist";
|
||||
@@ -4660,6 +4700,7 @@ sub db_get_table_rows {
|
||||
|
||||
my $table = xCAT::Table->new($tablename);
|
||||
my @table_rows = ();
|
||||
# todo fix for DB2 support
|
||||
if (defined($filter_stmt)) {
|
||||
if (length($filter_stmt) > 0) {
|
||||
@table_rows = $table->getAllAttribsWhere($filter_stmt, @{$attrs});
|
||||
|
||||
@@ -4,11 +4,13 @@
|
||||
# This plugin is used to handle the command requests for Xeon Phi (mic) support
|
||||
#
|
||||
|
||||
|
||||
package xCAT_plugin::mic;
|
||||
BEGIN
|
||||
{
|
||||
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
|
||||
}
|
||||
use lib "$::XCATROOT/lib/perl";
|
||||
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
@@ -613,6 +615,28 @@ sub rflash {
|
||||
my @args = ("-s", "-v", "-e");
|
||||
push @args, "$::XCATROOT/sbin/flashmic";
|
||||
my $master = $request->{'_xcatdest'};
|
||||
# in case there are multiple servicenode entries, assume the first entry
|
||||
# is the master
|
||||
($master) = split (/,/,$master);
|
||||
|
||||
# assume that all hosts are on the same network connected to this master
|
||||
# (otherwise, will need to move this call into loop above for each host
|
||||
# and build separate miccfg calls for each unique returned value from
|
||||
# my_ip_facing)
|
||||
my $ipfn = xCAT::NetworkUtils->my_ip_facing(@hosts[0]);
|
||||
if ($ipfn) {
|
||||
$master = $ipfn;
|
||||
} else {
|
||||
my $hostname = "";
|
||||
my $hostnamecmd = "/bin/hostname";
|
||||
my @thostname = xCAT::Utils->runcmd($hostnamecmd, 0);
|
||||
if ($::RUNCMD_RC = 0) {
|
||||
$hostname = "from server $thostname[0]";
|
||||
}
|
||||
xCAT::MsgUtils->message("E", {error=>["Cannot detect an active network interface $hostname to @hosts[0]."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
|
||||
push @args, ("-m", "$master");
|
||||
push @args, ("-p", "$tftpdir/xcat/miccfg");
|
||||
|
||||
@@ -913,6 +937,27 @@ sub nodeset {
|
||||
my @args = ("-s", "-v", "-e");
|
||||
push @args, "$::XCATROOT/sbin/configmic";
|
||||
my $master = $request->{'_xcatdest'};
|
||||
# in case there are multiple servicenode entries, assume the first entry
|
||||
# is the master
|
||||
($master) = split (/,/,$master);
|
||||
|
||||
# assume that all hosts are on the same network connected to this master
|
||||
# (otherwise, will need to move this call into loop above for each host
|
||||
# and build separate miccfg calls for each unique returned value from
|
||||
# my_ip_facing)
|
||||
my $ipfn = xCAT::NetworkUtils->my_ip_facing(@hosts[0]);
|
||||
if ($ipfn) {
|
||||
$master = $ipfn;
|
||||
} else {
|
||||
my $hostname = "";
|
||||
my $hostnamecmd = "/bin/hostname";
|
||||
my @thostname = xCAT::Utils->runcmd($hostnamecmd, 0);
|
||||
if ($::RUNCMD_RC = 0) {
|
||||
$hostname = "from server $thostname[0]";
|
||||
}
|
||||
xCAT::MsgUtils->message("E", {error=>["Cannot detect an active network interface $hostname to @hosts[0]."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
push @args, ("-m", "$master");
|
||||
push @args, ("-p", "$tftpdir/xcat/miccfg");
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ Getopt::Long::Configure("pass_through");
|
||||
use xCAT::Table;
|
||||
use xCAT::MsgUtils;
|
||||
use xCAT::DBobjUtils;
|
||||
use xCAT::Utils;
|
||||
|
||||
sub handled_commands {
|
||||
return {
|
||||
@@ -376,7 +377,9 @@ sub update_export {
|
||||
for my $l (@new_export) { print $new_export_fd $l; }
|
||||
flock($new_export_fd,LOCK_UN);
|
||||
close($new_export_fd);
|
||||
system("service nfs restart");
|
||||
#system("service nfs restart");
|
||||
my $retcode=xCAT::Utils->restartservice("nfs");
|
||||
return $retcode;
|
||||
}
|
||||
|
||||
sub update_syslog {
|
||||
@@ -391,7 +394,9 @@ sub update_syslog {
|
||||
open($new_syslog_fd, ">>", "/etc/exports");
|
||||
print $new_syslog_fd "local2.* /var/log/nimol.log\n";
|
||||
close($new_syslog_fd);
|
||||
system("service rsyslog restart");
|
||||
#system("service rsyslog restart");
|
||||
my $retcode=xCAT::Utils->restartservice("rsyslog");
|
||||
return $retcode;
|
||||
} else {
|
||||
print "Don't need to update syslog configure file.\n";
|
||||
}
|
||||
|
||||
@@ -51,12 +51,14 @@ sub process_request {
|
||||
my $rootimg_dir;
|
||||
my $destdir;
|
||||
my $imagename;
|
||||
my $dotorrent;
|
||||
|
||||
GetOptions(
|
||||
"profile|p=s" => \$profile,
|
||||
"arch|a=s" => \$arch,
|
||||
"osver|o=s" => \$osver,
|
||||
"method|m=s" => \$method,
|
||||
"tracker=s" => \$dotorrent,
|
||||
"help|h" => \$help,
|
||||
"version|v" => \$version
|
||||
);
|
||||
@@ -386,6 +388,14 @@ sub process_request {
|
||||
`$excludestr`;
|
||||
if ($method =~ /cpio/) {
|
||||
chmod 0644,"$destdir/rootimg.gz";
|
||||
if ($dotorrent) {
|
||||
my $currdir = getcwd;
|
||||
chdir($destdir);
|
||||
unlink("rootimg.gz.metainfo");
|
||||
system("ctorrent -t -u $dotorrent -l 1048576 -s rootimg.gz.metainfo rootimg.gz");
|
||||
chmod 0644, "rootimg.gz.metainfo";
|
||||
chdir($currdir);
|
||||
}
|
||||
umask $oldmask;
|
||||
} elsif ($method =~ /squashfs/) {
|
||||
my $flags;
|
||||
|
||||
@@ -46,8 +46,39 @@ sub preprocess_request
|
||||
#if already preprocessed, go straight to request
|
||||
if ($req->{_xcatpreprocessed}->[0] == 1) { return [$req]; }
|
||||
|
||||
my $nodes = $req->{node};
|
||||
if (!$nodes) { return;}
|
||||
my $req_nodes = $req->{node};
|
||||
if (!$req_nodes) { return;}
|
||||
|
||||
my @nodes;
|
||||
my $command = $req->{command}->[0];
|
||||
my $column;
|
||||
if ($command eq 'runbeginpre') { $column = 'begin'; }
|
||||
elsif ($command eq 'runendpre') { $column = 'end'; }
|
||||
else { $column = ''; }
|
||||
|
||||
# See if anything in the prescripts table for the nodes. If not, skip.
|
||||
# Nothing to do.
|
||||
my $tab = xCAT::Table->new('prescripts');
|
||||
#first check if xcatdefaults entry
|
||||
if ( $tab->getAttribs({node=>"xcatdefaults"},$column) ) {
|
||||
# yes - process all nodes
|
||||
@nodes = @$req_nodes;
|
||||
} else {
|
||||
# no xcatdefaults, check for node entries
|
||||
my $tabdata=$tab->getNodesAttribs($req_nodes,['node', $column]);
|
||||
if ($tabdata) {
|
||||
foreach my $node (@$req_nodes) {
|
||||
if (($tabdata->{$node}) &&
|
||||
($tabdata->{$node}->[0]) &&
|
||||
($tabdata->{$node}->[0]->{$column}) ) {
|
||||
push (@nodes,$node);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# if no nodes left to process, we are done
|
||||
if (! @nodes) { return; }
|
||||
|
||||
my $service = "xcat";
|
||||
my @args=();
|
||||
@@ -64,7 +95,7 @@ sub preprocess_request
|
||||
Getopt::Long::Configure("bundling");
|
||||
Getopt::Long::Configure("pass_through");
|
||||
GetOptions('l' => \$::LOCAL);
|
||||
my $sn = xCAT::ServiceNodeUtils->getSNformattedhash($nodes, $service, "MN");
|
||||
my $sn = xCAT::ServiceNodeUtils->getSNformattedhash(\@nodes, $service, "MN");
|
||||
my @requests;
|
||||
if ($::LOCAL) { #only handle the local nodes
|
||||
#print "process local nodes: @$nodes\n";
|
||||
|
||||
@@ -42,6 +42,8 @@ my %allchassis;
|
||||
my %allswitches;
|
||||
my %all_switchports;
|
||||
|
||||
my @switch_records;
|
||||
|
||||
# The array of all chassis which is special CMM
|
||||
my %allcmmchassis;
|
||||
my %allothernics;
|
||||
@@ -116,8 +118,10 @@ sub process_request {
|
||||
}
|
||||
|
||||
my $non_block = 1;
|
||||
if ( $general_arg{'blockmode'} == 1) {
|
||||
$non_block = 0;
|
||||
if (defined $general_arg{'blockmode'}){
|
||||
if ( $general_arg{'blockmode'} == 1) {
|
||||
$non_block = 0;
|
||||
}
|
||||
}
|
||||
my $lock = xCAT::Utils->acquire_lock("nodemgmt", $non_block);
|
||||
if (! $lock){
|
||||
@@ -234,18 +238,20 @@ sub validate_args{
|
||||
my $enabledparamsref = shift;
|
||||
my $mandatoryparamsref = shift;
|
||||
|
||||
if ($general_arg{'help'} == 1){
|
||||
my %process_help_commands = (
|
||||
'nodediscoverstart' => 1,
|
||||
'nodediscoverstop' => 1,
|
||||
'nodediscoverls' => 1,
|
||||
'nodediscoverstatus' => 1,
|
||||
);
|
||||
if (defined $general_arg{'help'}){
|
||||
if($general_arg{'help'} == 1){
|
||||
my %process_help_commands = (
|
||||
'nodediscoverstart' => 1,
|
||||
'nodediscoverstop' => 1,
|
||||
'nodediscoverls' => 1,
|
||||
'nodediscoverstatus' => 1,
|
||||
);
|
||||
|
||||
# do not process help message for these noddiscover* commands, cover them in seqdiscovery.pm
|
||||
unless ($process_help_commands{$command} == 1) {
|
||||
setrsp_infostr($helpmsg);
|
||||
return 0;
|
||||
# do not process help message for these noddiscover* commands, cover them in seqdiscovery.pm
|
||||
unless ($process_help_commands{$command} == 1) {
|
||||
setrsp_infostr($helpmsg);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -428,6 +434,8 @@ Usage:
|
||||
$recordsref = xCAT::ProfiledNodeUtils->get_all_chassis(1,'cmm');
|
||||
%allcmmchassis = %$recordsref;
|
||||
|
||||
@switch_records = ();
|
||||
|
||||
# Generate temporary hostnames for hosts entries in hostfile.
|
||||
xCAT::MsgUtils->message('S', "Generate temporary hostnames.");
|
||||
my ($retcode_read, $retstr_read) = read_and_generate_hostnames($args_dict{'file'});
|
||||
@@ -469,17 +477,18 @@ Usage:
|
||||
{
|
||||
$mac_addr_mode = 1;
|
||||
}
|
||||
if(defined($hostinfo_dict{$mynode}{'switch'}))
|
||||
if(defined($hostinfo_dict{$mynode}{'switches'}))
|
||||
{
|
||||
$switch_mode = 1;
|
||||
}
|
||||
# cannot mix switch discovery with mac import
|
||||
if(($mac_addr_mode == 1) && ($switch_mode == 1))
|
||||
{
|
||||
setrsp_progress("Failed to validate node information file.");
|
||||
setrsp_errormsg("Cannot define mac import node in switch discovery hostinfo file.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
# cannot mix switch discovery with mac import
|
||||
if(($mac_addr_mode == 1) && ($switch_mode == 1))
|
||||
{
|
||||
setrsp_progress("Failed to validate node information file.");
|
||||
setrsp_errormsg("Cannot define mac import node in switch discovery hostinfo file.");
|
||||
return;
|
||||
}
|
||||
|
||||
# Create the full hostinfo dict.
|
||||
@@ -498,6 +507,21 @@ Usage:
|
||||
$warnstr = "Warning: failed to import some nodes.";
|
||||
setrsp_progress($warnstr);
|
||||
}
|
||||
# create switch, port, interface relationship.
|
||||
if($switch_mode){
|
||||
#debug message.
|
||||
my $swstr = Dumper(@switch_records);
|
||||
xCAT::MsgUtils->message('S',"node-switch-port-interface relationship: @switch_records");
|
||||
|
||||
my $swtab1 = xCAT::Table->new( 'switch', -create=>1, -autocommit=>0 );
|
||||
for my $key_n_value (@switch_records){
|
||||
my $keyref = (@$key_n_value)[0];
|
||||
my $valueref = (@$key_n_value)[1];
|
||||
$swtab1->setAttribs($keyref, $valueref);
|
||||
}
|
||||
$swtab1->commit;
|
||||
}
|
||||
|
||||
# setup node provisioning status.
|
||||
xCAT::Utils->runxcmd({command=>["updatenodestat"], node=>\@nodelist, arg=>['defined']}, $request_command, -1, 2);
|
||||
|
||||
@@ -737,7 +761,7 @@ Usage:
|
||||
}
|
||||
# make sure there are something changed, otherwise we should quit without any changes.
|
||||
unless ($changeflag){
|
||||
setrsp_errormsg("No profile changes detect.");
|
||||
setrsp_infostr("Warning: no profile changes detect.");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -771,10 +795,30 @@ Usage:
|
||||
}
|
||||
|
||||
# If network profile specified. Need re-generate IPs for all nodess again.
|
||||
# As new design, ignore BMC/FSP NIC while reinstall nodes
|
||||
if(exists $args_dict{'networkprofile'}){
|
||||
my $newNetProfileName = $args_dict{'networkprofile'};
|
||||
my $oldNetProfileName = $nodeoldprofiles{'networkprofile'};
|
||||
|
||||
my $newNicsRef = xCAT::ProfiledNodeUtils->get_nodes_nic_attrs([$newNetProfileName])->{$newNetProfileName};
|
||||
my $oldNicsRef = xCAT::ProfiledNodeUtils->get_nodes_nic_attrs([$oldNetProfileName])->{$oldNetProfileName};
|
||||
|
||||
my %updateNicsHash = ();
|
||||
foreach my $newNic (keys %$newNicsRef) {
|
||||
if ($newNicsRef->{$newNic}->{'type'} ne 'BMC' and $newNicsRef->{$newNic}->{'type'} ne 'FSP'){
|
||||
$updateNicsHash{$newNic} = 1;
|
||||
}
|
||||
}
|
||||
foreach my $oldNic (keys %$oldNicsRef) {
|
||||
if ($oldNicsRef->{$oldNic}->{'type'} ne 'BMC' and $oldNicsRef->{$oldNic}->{'type'} ne 'FSP'){
|
||||
$updateNicsHash{$oldNic} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
my $updateNics = join(",", keys %updateNicsHash);
|
||||
setrsp_progress("Regenerate IP addresses for nodes...");
|
||||
$retref = "";
|
||||
$retref = xCAT::Utils->runxcmd({command=>["noderegenips"], node=>$nodes, sequential=>[1]}, $request_command, 0, 2);
|
||||
$retref = xCAT::Utils->runxcmd({command=>["noderegenips"], node=>$nodes, arg=>["nics=$updateNics"], sequential=>[1]}, $request_command, 0, 2);
|
||||
$retstrref = parse_runxcmd_ret($retref);
|
||||
if ($::RUNCMD_RC != 0){
|
||||
setrsp_progress("Warning: failed to generate IPs for nodes.");
|
||||
@@ -843,6 +887,7 @@ Usage:
|
||||
$netProfileNicsRef = xCAT::ProfiledNodeUtils->get_nodes_nic_attrs([$netProfileName]);
|
||||
my $nicsref = $netProfileNicsRef->{$netProfileName};
|
||||
my @nicslist = keys %$nicsref;
|
||||
|
||||
#3. validate specified nics
|
||||
if(exists $args_dict{'nics'}){
|
||||
@updateNics = split(",", $args_dict{'nics'});
|
||||
@@ -886,11 +931,15 @@ Usage:
|
||||
|
||||
#6. Generate new free IPs for each network.
|
||||
my @allknownips = keys %allips;
|
||||
my %netFreeIPsHash = ();
|
||||
foreach my $updnic (@updateNics){
|
||||
#No need generate for removed nics.
|
||||
unless (grep {$_ eq $updnic} @removedNics){
|
||||
my $netname = $netProfileNicsRef->{$netProfileName}->{$updnic}->{"network"};
|
||||
$freeIPsHash{$updnic} = xCAT::ProfiledNodeUtils->get_allocable_staticips_innet($netname, \@allknownips);
|
||||
if ( not exists $netFreeIPsHash{$netname} ){
|
||||
$netFreeIPsHash{$netname} = xCAT::ProfiledNodeUtils->get_allocable_staticips_innet($netname, \@allknownips);
|
||||
}
|
||||
$freeIPsHash{$updnic} = $netFreeIPsHash{$netname};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -910,7 +959,9 @@ Usage:
|
||||
unless (grep {$_ eq $nicname} @updateNics){
|
||||
# if the nic not specified, just keep the old IP&NIC record in nics table.
|
||||
my $oldip = $nodesNicsRef->{$node}->{$nicname}->{"ip"};
|
||||
$nicipsAttr{$node}{nicips} .= $nicname."!".$oldip.",";
|
||||
if ($oldip) {
|
||||
$nicipsAttr{$node}{nicips} .= $nicname."!".$oldip.",";
|
||||
}
|
||||
}else{
|
||||
my $ipsref = $freeIPsHash{$nicname};
|
||||
my $nextip = shift @$ipsref;
|
||||
@@ -932,7 +983,7 @@ Usage:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#8. Update database.
|
||||
setrsp_progress("Updating database records...");
|
||||
my $nicstab = xCAT::Table->new('nics',-create=>1);
|
||||
@@ -1000,11 +1051,10 @@ Usage:
|
||||
foreach my $command (@kitcommands) {
|
||||
my $retref;
|
||||
if ($command eq 'removenodes'){
|
||||
# Not run makedns -d as it costs too much time
|
||||
#setrsp_progress("Updating DNS entries");
|
||||
#$retref = xCAT::Utils->runxcmd({command=>["makedns"], node=>$nodes, arg=>['-d']}, $request_command, 0, 2);
|
||||
setrsp_progress("Updating DNS entries");
|
||||
$retref = xCAT::Utils->runxcmd({command=>["makedns"], node=>$nodes, arg=>['-d']}, $request_command, 0, 2);
|
||||
|
||||
#setrsp_progress("Updating hosts entries");
|
||||
setrsp_progress("Updating hosts entries");
|
||||
$retref = "";
|
||||
$retref = xCAT::Utils->runxcmd({command=>["makehosts"], node=>$nodes, arg=>['-d']}, $request_command, 0, 2);
|
||||
next;
|
||||
@@ -1720,6 +1770,27 @@ sub gen_new_hostinfo_dict{
|
||||
foreach my $item (sort(keys %hostinfo_dict)){
|
||||
# Set Nodes's type:
|
||||
$hostinfo_dict{$item}{"objtype"} = 'node';
|
||||
|
||||
# Setup switches hash as switch table is a special one:
|
||||
# We can not set values in table switch through hostinfo_dict,
|
||||
# but must do that through $swtab1->setAttribs.
|
||||
if (defined $hostinfo_dict{$item}{switches}){
|
||||
my @switchlist = split(/,/, $hostinfo_dict{$item}{switches});
|
||||
foreach my $spi (@switchlist){
|
||||
if($spi){
|
||||
my @spilist = split(/!/, $spi);
|
||||
my %keyshash = ();
|
||||
my %valueshash = ();
|
||||
$keyshash{'node'} = $item;
|
||||
$valueshash{'interface'} = $spilist[0];
|
||||
$keyshash{'switch'}= $spilist[1];
|
||||
$keyshash{'port'} = $spilist[2];
|
||||
push @switch_records, [\%keyshash, \%valueshash];
|
||||
}
|
||||
}
|
||||
delete ($hostinfo_dict{$item}{switches});
|
||||
}
|
||||
|
||||
# Generate IPs for other interfaces defined in MAC file.
|
||||
my %ipshash;
|
||||
foreach (keys %netprofileattr){
|
||||
@@ -2097,9 +2168,9 @@ sub validate_node_entry{
|
||||
}
|
||||
# Must specify either MAC or switch + port.
|
||||
if (exists $node_entry{"mac"} ||
|
||||
exists $node_entry{"switch"} && exists $node_entry{"switchport"}){
|
||||
exists $node_entry{"switches"} ){
|
||||
} else{
|
||||
$errmsg .= "MAC address, switch and port is not specified. You must specify the MAC address or switch and port.\n";
|
||||
$errmsg .= "MAC address or switches is not specified. You must specify the MAC address or switches.\n";
|
||||
}
|
||||
|
||||
if (! xCAT::NetworkUtils->isValidHostname($node_name)){
|
||||
@@ -2120,6 +2191,7 @@ sub validate_node_entry{
|
||||
$errmsg .= "MAC address $node_entry{$_} is invalid. You must use a valid MAC address.\n";
|
||||
}else{
|
||||
$allmacs{$node_entry{$_}} = 0;
|
||||
$allmacsupper{uc($node_entry{$_})} = 0;
|
||||
}
|
||||
}elsif ($_ eq "ip"){
|
||||
if (exists $allips{$node_entry{$_}}){
|
||||
@@ -2144,26 +2216,34 @@ sub validate_node_entry{
|
||||
}
|
||||
#Transfer to capital
|
||||
$node_entry{$_} = uc $node_entry{$_};
|
||||
}elsif ($_ eq "switch"){
|
||||
#TODO: xCAT switch discovery enhance: verify whether switch exists.
|
||||
if (! exists $allswitches{$node_entry{$_}}){
|
||||
$errmsg .= "Specified switch $node_entry{$_} is not defined\n";
|
||||
}
|
||||
}elsif ($_ eq "switchport"){
|
||||
if (! exists $node_entry{"switchport"}){
|
||||
$errmsg .= "Specified switch must be used with port.\n";
|
||||
}
|
||||
# Not a valid number.
|
||||
if (!($node_entry{$_} =~ /^\d+$/)){
|
||||
$errmsg .= "Specified port $node_entry{$_} is invalid\n";
|
||||
}
|
||||
# now, we need to check "swith_switchport" string list to avoid duplicate config
|
||||
my $switch_port = $node_entry{'switch'} . "_" . $node_entry{$_};
|
||||
if (exists $all_switchports{$switch_port}){
|
||||
$errmsg .= "Specified switch port $node_entry{$_} already exists in the database or in the nodeinfo file. You must use a new switch port.\n";
|
||||
}else{
|
||||
# after checking, add this one into all_switchports
|
||||
$all_switchports{$switch_port} = 0;
|
||||
}elsif ($_ eq "switches"){
|
||||
# switches=switch1!1!eth0,switch2!2!eth1
|
||||
my @interfaceslist = ();
|
||||
my @switchlist = split(/,/, $node_entry{$_});
|
||||
foreach my $spi (@switchlist){
|
||||
if($spi){
|
||||
my @spilist = split(/!/, $spi);
|
||||
if(@spilist != 3) {
|
||||
$errmsg .= "Invalid 'switches' value $node_entry{$_} specified.\n";
|
||||
next;
|
||||
}
|
||||
|
||||
if (! exists $allswitches{$spilist[1]}){
|
||||
$errmsg .= "Specified switch $spilist[1] is not defined\n";
|
||||
}
|
||||
# Not a valid number.
|
||||
if (!($spilist[2] =~ /^\d+$/)){
|
||||
$errmsg .= "Specified port $spilist[2] is invalid\n";
|
||||
}
|
||||
# now, we need to check "swith_switchport" string list to avoid duplicate config
|
||||
my $switch_port = $spilist[1] . "_" . $spilist[2];
|
||||
if (exists $all_switchports{$switch_port}){
|
||||
$errmsg .= "Specified switch $spilist[1] and port $spilist[2] already exists in the database or in the nodeinfo file. You must use a new switch port.\n";
|
||||
}else{
|
||||
# after checking, add this one into all_switchports
|
||||
$all_switchports{$switch_port} = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}elsif ($_ eq "rack"){
|
||||
if (! exists $allracks{$node_entry{$_}}){
|
||||
|
||||
@@ -414,9 +414,8 @@ sub process_request {
|
||||
if ($errored) {
|
||||
my $rsp;
|
||||
$rsp->{errorcode}->[0]=1;
|
||||
$rsp->{error}->[0]="Failed in running begin prescripts\n";
|
||||
$rsp->{error}->[0]="Failed in running begin prescripts. Processing will still continue.\n";
|
||||
$::PXE_callback->($rsp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -577,9 +576,8 @@ sub process_request {
|
||||
if ($errored) {
|
||||
my $rsp;
|
||||
$rsp->{errorcode}->[0]=1;
|
||||
$rsp->{error}->[0]="Failed in running end prescripts\n";
|
||||
$rsp->{error}->[0]="Failed in running end prescripts. Processing will still continue.\n";
|
||||
$::PXE_callback->($rsp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,481 @@
|
||||
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head1
|
||||
xCAT plugin package to handle rinstall and winstall
|
||||
|
||||
Supported command:
|
||||
rinstall - runs nodeset, rsetboot,rpower commands
|
||||
winstall - also opens the console
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
package xCAT_plugin::rinstall;
|
||||
use strict;
|
||||
|
||||
require xCAT::Utils;
|
||||
require xCAT::MsgUtils;
|
||||
use xCAT::NodeRange;
|
||||
use xCAT::Table;
|
||||
|
||||
use Data::Dumper;
|
||||
use Getopt::Long;
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 handled_commands
|
||||
|
||||
Return list of commands handled by this plugin
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
sub handled_commands
|
||||
{
|
||||
return {
|
||||
rinstall => "rinstall",
|
||||
winstall => "rinstall",
|
||||
};
|
||||
}
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 Process the command
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
sub process_request
|
||||
{
|
||||
|
||||
my $request = shift;
|
||||
my $callback = shift;
|
||||
my $subreq = shift;
|
||||
|
||||
rinstall($request, $callback, $subreq);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 rinstall
|
||||
|
||||
Wrapper around nodeset, rsetboot, rpower for the admin convenience
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
sub rinstall
|
||||
{
|
||||
my ($req, $callback, $subreq) = @_;
|
||||
$::CALLBACK=$callback;
|
||||
my $OSVER;
|
||||
my $PROFILE;
|
||||
my $ARCH;
|
||||
my $CONSOLE;
|
||||
my $OSIMAGE;
|
||||
my $HELP;
|
||||
my $VERSION;
|
||||
my $command = $req->{command}->[0]; # could be rinstall on winstall
|
||||
my $args;
|
||||
if (defined($req->{arg}) ) { # there are arguments
|
||||
$args=$req->{arg}; # argument
|
||||
@ARGV = @{$args};
|
||||
}
|
||||
my $nodes;
|
||||
my @nodes;
|
||||
if (defined ($req->{node})) { # there are nodes
|
||||
$nodes = $req->{node};
|
||||
@nodes=@$nodes;
|
||||
}
|
||||
# no arguments, no nodes then input wrong
|
||||
if ((scalar(@nodes) == 0) && (scalar(@ARGV) == 0)){
|
||||
&usage($command,$callback);
|
||||
return 1;
|
||||
}
|
||||
#print Dumper($req);
|
||||
Getopt::Long::Configure("bundling");
|
||||
|
||||
unless (
|
||||
GetOptions(
|
||||
'o|osver=s' => \$OSVER,
|
||||
'p|profile=s' => \$PROFILE,
|
||||
'a|arch=s' => \$ARCH,
|
||||
'O|osimage=s' => \$OSIMAGE,
|
||||
'h|help' => \$HELP,
|
||||
'v|version' => \$VERSION,
|
||||
'c|console' => \$CONSOLE
|
||||
)
|
||||
)
|
||||
{
|
||||
&usage($command,$callback);
|
||||
return 1;
|
||||
}
|
||||
if ($HELP)
|
||||
{
|
||||
&usage($command,$callback);
|
||||
return 0;
|
||||
}
|
||||
if ($VERSION)
|
||||
{
|
||||
my $version = xCAT::Utils->Version();
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "$version";
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (scalar @$nodes eq 0)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{error}->[0] ="noderange not supplied";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return 1;
|
||||
}
|
||||
|
||||
my $rc = 0;
|
||||
my %pnhash;
|
||||
|
||||
|
||||
if ($OSIMAGE)
|
||||
{
|
||||
|
||||
# -O|--osimage is specified, ignore any -a,-p,-o options,
|
||||
# call "nodeset ... osimage= ..." to set the boot state of the noderange to the specified osimage,
|
||||
# "nodeset" will handle the updating of node attributes such as os,arch,profile,provmethod
|
||||
# verify input
|
||||
&checkoption("[-O|--osimage] $OSIMAGE",$OSVER,$PROFILE,$ARCH,$callback);
|
||||
|
||||
# run nodeset $noderange osimage=$OSIMAGE
|
||||
my @osimageargs;
|
||||
push @osimageargs,"osimage=$OSIMAGE" ;
|
||||
my $res =
|
||||
xCAT::Utils->runxcmd(
|
||||
{
|
||||
command => ["nodeset"],
|
||||
node => \@nodes,
|
||||
arg => \@osimageargs
|
||||
},
|
||||
$subreq, -1, 1);
|
||||
|
||||
my $rsp = {};
|
||||
if ($::RUNCMD_RC ==0 ) {
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{data} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
} else {
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{error} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
# no osimage specified, update the node attributes specified by -a,-p,-o options thru "nodech",
|
||||
# then set the boot state of each node based on the nodetype.provmethod:
|
||||
# 1) if nodetype.provmethod = <osimage>, ignore any -p,-o,-a option,
|
||||
# then call "nodeset ... osimage"
|
||||
# 2) if nodetype.provmethod = [install/netboot/statelite],
|
||||
# update the node attributes specified by -a,-p,-o options thru "nodech",
|
||||
# call "nodeset ... [install/netboot/statelite]"
|
||||
# 3) if nodetype.provmethod is not set, use 'install' as the default value
|
||||
|
||||
# group the nodes according to the nodetype.provmethod
|
||||
|
||||
foreach (@$nodes)
|
||||
{
|
||||
my $tab = xCAT::Table->new("nodetype");
|
||||
my $nthash = $tab->getNodeAttribs($_, ['provmethod']);
|
||||
$tab->close();
|
||||
if (defined($nthash) and defined($nthash->{'provmethod'}))
|
||||
{
|
||||
push(@{$pnhash{$nthash->{'provmethod'}}}, $_);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
#if nodetype.provmethod is not specified,
|
||||
push(@{$pnhash{'install'}}, $_);
|
||||
}
|
||||
}
|
||||
# Now for each group based on provmethod
|
||||
foreach my $key (keys %pnhash)
|
||||
{
|
||||
$::RUNCMD_RC =0;
|
||||
my $nodes = join(',', @{$pnhash{$key}});
|
||||
if ($key =~ /^(install|netboot|statelite)$/)
|
||||
{
|
||||
|
||||
# nodetype.provmethod = [install|netboot|statelite]
|
||||
my @nodechline;
|
||||
if ($OSVER)
|
||||
{
|
||||
push @nodechline, "nodetype.os=$OSVER";
|
||||
}
|
||||
if ($PROFILE)
|
||||
{
|
||||
push @nodechline, "nodetype.profile=$PROFILE";
|
||||
}
|
||||
if ($ARCH)
|
||||
{
|
||||
push @nodechline, "nodetype.arch=$ARCH";
|
||||
}
|
||||
if (@nodechline)
|
||||
{
|
||||
# run nodech $nodes $nodechline
|
||||
my $res =
|
||||
xCAT::Utils->runxcmd(
|
||||
{
|
||||
command => ["nodech"],
|
||||
node => \@nodes,
|
||||
arg => \@nodechline
|
||||
},
|
||||
$subreq, -1, 1);
|
||||
|
||||
my $rsp = {};
|
||||
$rc=$::RUNCMD_RC;
|
||||
if ($rc == 0 ) {
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{data} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
} else { # error
|
||||
$rsp->{error} ->[0] = "nodech error";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{error} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
}
|
||||
}
|
||||
} # end nodechline
|
||||
|
||||
if ($rc == 0) # if no error from nodech then run nodeset
|
||||
{
|
||||
# run nodeset $nodes $key ( where key is install/netboot/statelite)
|
||||
my @nodesetarg;
|
||||
push @nodesetarg, "$key";
|
||||
my $res =
|
||||
xCAT::Utils->runxcmd(
|
||||
{
|
||||
command => ["nodeset"],
|
||||
node => \@nodes,
|
||||
arg => \@nodesetarg
|
||||
},
|
||||
$subreq, -1, 1);
|
||||
|
||||
my $rsp = {};
|
||||
$rc=$::RUNCMD_RC;
|
||||
if ($rc ==0 ) {
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{data} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
} else { # error
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{error} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else # if not install/netboot/statelite
|
||||
{
|
||||
|
||||
# nodetype.provmethod = <osimage>
|
||||
&checkoption("nodetype.provmethod=$key",$OSVER,$PROFILE,$ARCH,$callback);
|
||||
# run nodeset $nodes osimage
|
||||
my @nodesetarg;
|
||||
push @nodesetarg, "osimage";
|
||||
my $res =
|
||||
xCAT::Utils->runxcmd(
|
||||
{
|
||||
command => ["nodeset"],
|
||||
node => \@nodes,
|
||||
arg => \@nodesetarg
|
||||
},
|
||||
$subreq, -1, 1);
|
||||
|
||||
my $rsp = {};
|
||||
$rc=$::RUNCMD_RC;
|
||||
if ($rc ==0 ) {
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{data} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
} else { # error
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{error} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
} # end nodech/nodeset for each group
|
||||
|
||||
if ($rc != 0) # we got an error with the nodeset
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{error}->[0] = "nodeset failure will not continue ";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return 1;
|
||||
}
|
||||
|
||||
# call "rsetboot" to set the boot order of the nodehm.mgt=ipmi nodes,for others,
|
||||
# assume user has set the correct boot order before "rinstall"
|
||||
|
||||
# run rsetboot $noderange net
|
||||
|
||||
my @rsetbootarg;
|
||||
push @rsetbootarg, "net";
|
||||
my $res =
|
||||
xCAT::Utils->runxcmd(
|
||||
{
|
||||
command => ["rsetboot"],
|
||||
node => \@nodes,
|
||||
arg => \@rsetbootarg
|
||||
},
|
||||
$subreq, -1, 1);
|
||||
# fix output it is a hash and you must get error out of the hash.
|
||||
my $rsp = {};
|
||||
$rc=$::RUNCMD_RC;
|
||||
if ($rc ==0 ) {
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{data} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
} else { # error
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{error} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
}
|
||||
}
|
||||
if ($rc != 0) # we got an error with the rsetboot
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{error}->[0] = "rsetboot failure will not continue ";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return 1;
|
||||
}
|
||||
|
||||
# call "rpower" to start the node provision process
|
||||
|
||||
#run rpower $noderange boot
|
||||
my @rpowerarg;
|
||||
push @rpowerarg, "boot";
|
||||
my $res =
|
||||
xCAT::Utils->runxcmd(
|
||||
{
|
||||
command => ["rpower"],
|
||||
node => \@nodes,
|
||||
arg => \@rpowerarg
|
||||
},
|
||||
$subreq, -1, 1);
|
||||
|
||||
my $rsp = {};
|
||||
$rc=$::RUNCMD_RC;
|
||||
if ($rc ==0 ) {
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{data} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
} else { # error
|
||||
foreach my $line (@$res) {
|
||||
$rsp->{error} ->[0] = $line;
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
}
|
||||
}
|
||||
# Check if they asked to bring up a console ( -c) from rinstall always for winstall
|
||||
$req->{startconsole}->[0] =0;
|
||||
if ($command =~ /rinstall/)
|
||||
{
|
||||
|
||||
# for rinstall, the -c|--console option can provide the remote console for only 1 node
|
||||
if ($CONSOLE)
|
||||
{
|
||||
if (scalar @$nodes ne 1)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{error}->[0] = "rinstall -c only accepts one node in the noderange. See winstall for support for support of consoles on multiple nodes.";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
return 1;
|
||||
} else { # tell rinstall client ok to start rcons
|
||||
$req->{startconsole}->[0] =1;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
elsif ($command =~ /winstall/)
|
||||
{
|
||||
|
||||
# winstall can start a wcons command to multiple nodes for monitoring the provision cycle
|
||||
$req->{startconsole}->[0] =1;
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 Usage
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
sub usage
|
||||
{
|
||||
my $command = shift;
|
||||
my $callback = shift;
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "$command usage:";
|
||||
if ($command =~ /rinstall/) {
|
||||
$rsp->{data}->[1] = " [-o|--osver] [-p|--profile] [-a|--arch] [-c|--console] <noderange>";
|
||||
} else { # winstall
|
||||
$rsp->{data}->[1] = " [-o|--osver] [-p|--profile] [-a|--arch] <noderange>";
|
||||
}
|
||||
if ($command =~ /rinstall/) {
|
||||
$rsp->{data}->[2] = " [-O|--osimage] [-c|--console] <noderange>";
|
||||
} else { # wininstall
|
||||
$rsp->{data}->[2] = " [-O|--osimage] <noderange>";
|
||||
}
|
||||
|
||||
$rsp->{data}->[3] = " [-h|--help]";
|
||||
$rsp->{data}->[4] = " [-v|--version]";
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
|
||||
# check and complain about the invalid combination of the options,
|
||||
# ignore -o,-p and -a options and prompt a warning message when provmethod=osimagename
|
||||
sub checkoption{
|
||||
my $optstring=shift;
|
||||
my $OSVER=shift;
|
||||
my $PROFILE=shift;
|
||||
my $ARCH=shift;
|
||||
my $callback=shift;
|
||||
my $rsp = {};
|
||||
if($OSVER) {
|
||||
$rsp->{data}->[0] = "-o option not valid with $optstring. It is ignored.";
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
if($PROFILE) {
|
||||
$rsp->{data}->[0] = "-p option not valid with $optstring. It is ignored.";
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
if($ARCH) {
|
||||
$rsp->{data}->[0] = "-a option not valid with $optstring. It is ignored.";
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
1;
|
||||
@@ -1191,6 +1191,7 @@ sub mkinstall
|
||||
my $domain=$nodedomains{$node};
|
||||
|
||||
$kcmdline .=" Domain=$domain ";
|
||||
$kcmdline .=" netwait=10 ";
|
||||
}
|
||||
|
||||
|
||||
@@ -1352,6 +1353,7 @@ sub mksysclone
|
||||
copy("$installroot/postscripts/configefi","$pspath/15all.configefi");
|
||||
copy("$installroot/postscripts/updatenetwork","$pspath/16all.updatenetwork");
|
||||
copy("$installroot/postscripts/runxcatpost","$pspath/17all.runxcatpost");
|
||||
copy("$installroot/postscripts/makeinitrd","$pspath/20all.makeinitrd");
|
||||
copy("$installroot/postscripts/killsyslog","$pspath/99all.killsyslog");
|
||||
|
||||
unless (-r "$pspath/10all.fix_swap_uuids")
|
||||
@@ -1511,19 +1513,50 @@ sub mksysclone
|
||||
}
|
||||
|
||||
my $cmd =qq{echo "$node:compute:$imagename:" >> $clusterfile};
|
||||
my $out = xCAT::Utils->runcmd($cmd, -1);
|
||||
my $rc = xCAT::Utils->runcmd($cmd, -1);
|
||||
|
||||
unless (-r "$installroot/sysclone/images/$imagename/opt/xcat/xcatdsklspost")
|
||||
my $imagedir;
|
||||
my $osimagetab = xCAT::Table->new('linuximage');
|
||||
my $osimageentry = $osimagetab->getAttribs({imagename => $imagename}, 'rootimgdir');
|
||||
if($osimageentry){
|
||||
$imagedir = $osimageentry->{rootimgdir};
|
||||
$imagedir =~ s/^(\/.*)\/.+\/?$/$1/;
|
||||
}else{
|
||||
$imagedir = "$installroot/sysclone/images";
|
||||
$cmd = "chdef -t osimage $imagename rootimgdir=$imagedir/$imagename";
|
||||
$rc = `$cmd`;
|
||||
}
|
||||
|
||||
my $cfgimagedir = `cat /etc/systemimager/rsync_stubs/40$imagename|grep path`;
|
||||
chomp($cfgimagedir);
|
||||
$cfgimagedir =~ s/^\s+path=(\/.*)\/.+$/$1/g;
|
||||
|
||||
if($imagedir ne $cfgimagedir){
|
||||
my $oldstr = `cat /etc/systemimager/rsync_stubs/40$imagename|grep path`;
|
||||
chomp($oldstr);
|
||||
$oldstr =~ s/\//\\\\\//g;
|
||||
|
||||
my $targetstr="\tpath=".$imagedir."/".$imagename;
|
||||
$targetstr =~ s/\//\\\\\//g;
|
||||
$cmd= "sed -i \"s/$oldstr/$targetstr/\" /etc/systemimager/rsync_stubs/40$imagename";
|
||||
$rc = `$cmd`;
|
||||
}
|
||||
|
||||
$rc = `export PERL5LIB=/usr/lib/perl5/site_perl/;LANG=C si_mkrsyncd_conf`;
|
||||
|
||||
unless (-r "$imagedir/$imagename/opt/xcat/xcatdsklspost")
|
||||
{
|
||||
mkpath("$installroot/sysclone/images/$imagename/opt/xcat/");
|
||||
copy("$installroot/postscripts/xcatdsklspost","$installroot/sysclone/images/$imagename/opt/xcat/");
|
||||
mkpath("$imagedir/$imagename/opt/xcat/");
|
||||
copy("$installroot/postscripts/xcatdsklspost","$imagedir/$imagename/opt/xcat/");
|
||||
}
|
||||
}
|
||||
|
||||
# check systemimager-server-rsyncd to make sure it's running.
|
||||
my $out = xCAT::Utils->runcmd("service systemimager-server-rsyncd status", -1);
|
||||
if ($::RUNCMD_RC != 0) { # not running
|
||||
my $rc = xCAT::Utils->startService("systemimager-server-rsyncd");
|
||||
#my $out = xCAT::Utils->runcmd("service systemimager-server-rsyncd status", -1);
|
||||
#if ($::RUNCMD_RC != 0) { # not running
|
||||
my $retcode=xCAT::Utils->checkservicestatus("systemimager-server-rsyncd");
|
||||
if($retcode !=0){
|
||||
my $rc = xCAT::Utils->startservice("systemimager-server-rsyncd");
|
||||
if ($rc != 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -416,13 +416,8 @@ sub process_request
|
||||
)
|
||||
)
|
||||
{
|
||||
|
||||
# get the short hostname
|
||||
my $xcatmaster = xCAT::NetworkUtils->gethostname($IP);
|
||||
$xcatmaster =~ s/\..*//;
|
||||
|
||||
# add the value to the hash
|
||||
$newxcatmaster{$node} = $xcatmaster;
|
||||
$newxcatmaster{$node} = $IP;
|
||||
last;
|
||||
}
|
||||
}
|
||||
@@ -1342,9 +1337,11 @@ sub process_request
|
||||
$sub_req, -1, 1
|
||||
);
|
||||
|
||||
if ($::RUNCMD_RC != 0)
|
||||
if (($::RUNCMD_RC != 0) &&
|
||||
!grep(/ File exists/,@$ret) ) # ignore already set error
|
||||
{
|
||||
my $rsp;
|
||||
$rsp->{data} = $ret;
|
||||
push @{$rsp->{data}}, $ret;
|
||||
push @{$rsp->{data}}, "Could not set default route.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
@@ -1559,27 +1556,42 @@ sub process_request
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
foreach my $scripts (keys(%$pos_hash))
|
||||
{
|
||||
|
||||
my $pos_nodes = $pos_hash->{$scripts};
|
||||
|
||||
# need to run updatenode -s first as a separate call
|
||||
# before running updatenode -P. The flags cannot be run together.
|
||||
my $ret =
|
||||
xCAT::Utils->runxcmd(
|
||||
{
|
||||
command => ['updatenode'],
|
||||
node => $pos_nodes,
|
||||
arg => ["-P", "$scripts", "-s"],
|
||||
arg => ["-s"],
|
||||
},
|
||||
$sub_req, -1, 1
|
||||
);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
$error++;
|
||||
|
||||
}
|
||||
|
||||
my $rsp;
|
||||
$rsp->{data} = $ret;
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
|
||||
$ret =
|
||||
xCAT::Utils->runxcmd(
|
||||
{
|
||||
command => ['updatenode'],
|
||||
node => $pos_nodes,
|
||||
arg => ["-P", "$scripts"],
|
||||
},
|
||||
$sub_req, -1, 1
|
||||
);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
$error++;
|
||||
}
|
||||
$rsp->{data} = $ret;
|
||||
xCAT::MsgUtils->message("I", $rsp, $callback);
|
||||
}
|
||||
} # end -for both AIX and Linux systems
|
||||
|
||||
|
||||
@@ -67,6 +67,7 @@ sub process_request {
|
||||
my $exlist; # it is used when rootfstype = ramdisk
|
||||
my $destdir;
|
||||
my $imagename;
|
||||
my $dotorrent;
|
||||
|
||||
GetOptions(
|
||||
"rootfstype|t=s" => \$rootfstype,
|
||||
@@ -74,6 +75,7 @@ sub process_request {
|
||||
"arch|a=s" => \$arch,
|
||||
"osver|o=s" => \$osver,
|
||||
"help|h" => \$help,
|
||||
"tracker" => \$dotorrent,
|
||||
"version|v" => \$version,
|
||||
"verbose|V" => \$verbose
|
||||
);
|
||||
@@ -534,6 +536,14 @@ sub process_request {
|
||||
chdir("$rootimg_dir");
|
||||
xCAT::Utils->runcmd("$excludestr");
|
||||
chmod 0644, "$destdir/rootimg-statelite.gz";
|
||||
if ($dotorrent) {
|
||||
my $currdir = getcwd;
|
||||
chdir($destdir);
|
||||
unlink("rootimg-statelite.gz.metainfo");
|
||||
system("ctorrent -t -u $dotorrent -l 1048576 -s rootimg-statelite.gz.metainfo rootimg.gz");
|
||||
chmod 0644, "rootimg-statelite.gz.metainfo";
|
||||
chdir($currdir);
|
||||
}
|
||||
umask $oldmask;
|
||||
|
||||
system("rm -f $xcat_packimg_tmpfile");
|
||||
|
||||
@@ -209,27 +209,28 @@ sub preprocess_updatenode
|
||||
}
|
||||
|
||||
# parse the options
|
||||
my ($ALLSW,$CMDLINE,$ALTSRC,$HELP,$VERSION,$VERBOSE,$FILESYNC,$GENMYPOST,$USER,$SNFILESYNC,$SWMAINTENANCE,$SETSERVER,$RERUNPS,$SECURITY,$OS,$fanout,$timeout);
|
||||
Getopt::Long::Configure("bundling");
|
||||
Getopt::Long::Configure("no_pass_through");
|
||||
if (
|
||||
!GetOptions(
|
||||
'A|updateallsw' => \$::ALLSW,
|
||||
'c|cmdlineonly' => \$::CMDLINE,
|
||||
'd=s' => \$::ALTSRC,
|
||||
'h|help' => \$::HELP,
|
||||
'v|version' => \$::VERSION,
|
||||
'V|verbose' => \$::VERBOSE,
|
||||
'F|sync' => \$::FILESYNC,
|
||||
'g|genmypost' => \$::GENMYPOST,
|
||||
'l|user:s' => \$::USER,
|
||||
'f|snsync' => \$::SNFILESYNC,
|
||||
'S|sw' => \$::SWMAINTENANCE,
|
||||
's|sn' => \$::SETSERVER,
|
||||
'P|scripts:s' => \$::RERUNPS,
|
||||
'k|security' => \$::SECURITY,
|
||||
'o|os:s' => \$::OS,
|
||||
'fanout=i' => \$::fanout,
|
||||
't|timetout=i' => \$::timeout,
|
||||
'A|updateallsw' => \$ALLSW,
|
||||
'c|cmdlineonly' => \$CMDLINE,
|
||||
'd=s' => \$ALTSRC,
|
||||
'h|help' => \$HELP,
|
||||
'v|version' => \$VERSION,
|
||||
'V|verbose' => \$VERBOSE,
|
||||
'F|sync' => \$FILESYNC,
|
||||
'g|genmypost' => \$GENMYPOST,
|
||||
'l|user:s' => \$USER,
|
||||
'f|snsync' => \$SNFILESYNC,
|
||||
'S|sw' => \$SWMAINTENANCE,
|
||||
's|sn' => \$SETSERVER,
|
||||
'P|scripts:s' => \$RERUNPS,
|
||||
'k|security' => \$SECURITY,
|
||||
'o|os:s' => \$OS,
|
||||
'fanout=i' => \$fanout,
|
||||
't|timetout=i' => \$timeout,
|
||||
|
||||
)
|
||||
)
|
||||
@@ -237,16 +238,55 @@ sub preprocess_updatenode
|
||||
&updatenode_usage($callback);
|
||||
return;
|
||||
}
|
||||
# These globals are used in the updatenode subroutines,
|
||||
# need to undefine them if not defined in GetOpts
|
||||
# to make updatenode be able to be called multiple times in one process.
|
||||
# $RERUNPS can be set later in the logic based on other input
|
||||
if (defined($VERBOSE)) {
|
||||
$::VERBOSE=$VERBOSE;
|
||||
} else {
|
||||
undef $::VERBOSE;
|
||||
}
|
||||
if (defined($timeout)) {
|
||||
$::timeout=$timeout;
|
||||
} else {
|
||||
undef $::timeout;
|
||||
}
|
||||
if (defined($fanout)) {
|
||||
$::fanout=$fanout;
|
||||
} else {
|
||||
undef $::fanout;
|
||||
}
|
||||
if (defined($USER)) {
|
||||
$::USER=$USER;
|
||||
} else {
|
||||
undef $::USER;
|
||||
}
|
||||
if (defined($ALTSRC)) {
|
||||
$::ALTSRC=$ALTSRC;
|
||||
} else {
|
||||
undef $::ALTSRC;
|
||||
}
|
||||
if (defined($ALLSW)) {
|
||||
$::ALLSW=$ALLSW;
|
||||
} else {
|
||||
undef $::ALLSW;
|
||||
}
|
||||
if (defined($SETSERVER)) {
|
||||
$::SETSERVER=$SETSERVER;
|
||||
} else {
|
||||
undef $::SETSERVER;
|
||||
}
|
||||
|
||||
# display the usage if -h or --help is specified
|
||||
if ($::HELP)
|
||||
if ($HELP)
|
||||
{
|
||||
&updatenode_usage($callback);
|
||||
return;
|
||||
}
|
||||
|
||||
# display the version statement if -v or --verison is specified
|
||||
if ($::VERSION)
|
||||
if ($VERSION)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = xCAT::Utils->Version();
|
||||
@@ -258,7 +298,7 @@ sub preprocess_updatenode
|
||||
# if no sharedtftp then we need to broadcast this updatenode -g to all service nodes inorder
|
||||
# to be able to support service node pools
|
||||
#
|
||||
if ($::GENMYPOST)
|
||||
if ($GENMYPOST)
|
||||
{
|
||||
# precreatemypostscript has to be yes/1 or do nothing
|
||||
my @entries = xCAT::TableUtils->get_site_attribute("precreatemypostscripts");
|
||||
@@ -308,7 +348,7 @@ sub preprocess_updatenode
|
||||
|
||||
|
||||
# -c must work with -S for AIX node
|
||||
if ($::CMDLINE && !$::SWMAINTENANCE)
|
||||
if ($CMDLINE && !$SWMAINTENANCE)
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] =
|
||||
@@ -318,7 +358,7 @@ sub preprocess_updatenode
|
||||
}
|
||||
|
||||
# -s must not be with any other flag, this updates xcatinfo and run setuppostbootscripts
|
||||
if ($::SETSERVER && ($::SWMAINTENANCE || $::RERUNPS || $::SECURITY))
|
||||
if ($SETSERVER && ($SWMAINTENANCE || $RERUNPS || $SECURITY))
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] =
|
||||
@@ -328,11 +368,11 @@ sub preprocess_updatenode
|
||||
return;
|
||||
}
|
||||
# For -s flag just run this one script
|
||||
if ($::SETSERVER) {
|
||||
$::RERUNPS = "setuppostbootscripts";
|
||||
if ($SETSERVER) {
|
||||
$RERUNPS = "setuppostbootscripts";
|
||||
}
|
||||
# -f or -F not both
|
||||
if (($::FILESYNC) && ($::SNFILESYNC))
|
||||
if (($FILESYNC) && ($SNFILESYNC))
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "You can not specify both the -f and -F flags.";
|
||||
@@ -340,7 +380,7 @@ sub preprocess_updatenode
|
||||
return;
|
||||
}
|
||||
# -f must not be with any other flag, this updates service nodes syncfiles
|
||||
if ($::SNFILESYNC && ($::SWMAINTENANCE || $::RERUNPS || defined($::RERUNPS) || $::SECURITY || $::FILESYNC))
|
||||
if ($SNFILESYNC && ($SWMAINTENANCE || $RERUNPS || defined($RERUNPS) || $SECURITY || $FILESYNC))
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] =
|
||||
@@ -351,8 +391,8 @@ sub preprocess_updatenode
|
||||
}
|
||||
|
||||
# --security cannot work with -S -P -F -f
|
||||
if ($::SECURITY
|
||||
&& ($::SWMAINTENANCE || $::RERUNPS || defined($::RERUNPS) || $::FILESYNC || $::SNFILESYNC))
|
||||
if ($SECURITY
|
||||
&& ($SWMAINTENANCE || $RERUNPS || defined($RERUNPS) || $FILESYNC || $SNFILESYNC))
|
||||
{
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] =
|
||||
@@ -371,11 +411,11 @@ sub preprocess_updatenode
|
||||
if (
|
||||
$#ARGV == 0
|
||||
&& !(
|
||||
$::FILESYNC
|
||||
|| $::SNFILESYNC
|
||||
|| $::SWMAINTENANCE
|
||||
|| defined($::RERUNPS)
|
||||
|| $::SECURITY
|
||||
$FILESYNC
|
||||
|| $SNFILESYNC
|
||||
|| $SWMAINTENANCE
|
||||
|| defined($RERUNPS)
|
||||
|| $SECURITY
|
||||
)
|
||||
)
|
||||
{
|
||||
@@ -384,7 +424,7 @@ sub preprocess_updatenode
|
||||
# if it doesn't contain an = sign then it must be postscripts
|
||||
if (!($ARGV[0] =~ /=/))
|
||||
{
|
||||
$::RERUNPS = $ARGV[0];
|
||||
$RERUNPS = $ARGV[0];
|
||||
$ARGV[0] = "";
|
||||
}
|
||||
|
||||
@@ -394,22 +434,22 @@ sub preprocess_updatenode
|
||||
{
|
||||
|
||||
# if not syncing Service Node
|
||||
if (!($::SNFILESYNC))
|
||||
if (!($SNFILESYNC))
|
||||
{
|
||||
|
||||
# no flags and no operands, set defaults
|
||||
if (
|
||||
!(
|
||||
$::FILESYNC
|
||||
|| $::SWMAINTENANCE
|
||||
|| defined($::RERUNPS)
|
||||
|| $::SECURITY
|
||||
$FILESYNC
|
||||
|| $SWMAINTENANCE
|
||||
|| defined($RERUNPS)
|
||||
|| $SECURITY
|
||||
)
|
||||
)
|
||||
{
|
||||
$::FILESYNC = 1;
|
||||
$::SWMAINTENANCE = 1;
|
||||
$::RERUNPS = "";
|
||||
$FILESYNC = 1; # these are the defaults when no flags input to updatenode
|
||||
$SWMAINTENANCE = 1;
|
||||
$RERUNPS = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -424,7 +464,7 @@ sub preprocess_updatenode
|
||||
$callback->($rsp);
|
||||
return;
|
||||
}
|
||||
if ($::SECURITY)
|
||||
if ($SECURITY)
|
||||
{
|
||||
|
||||
# check to see if the Management Node is in the noderange and
|
||||
@@ -456,7 +496,7 @@ sub preprocess_updatenode
|
||||
{
|
||||
$request->{node} = \@CN;
|
||||
$request->{noderange} = \@CN;
|
||||
$::RERUNPS = "remoteshell";
|
||||
$RERUNPS = "remoteshell";
|
||||
}
|
||||
else
|
||||
{ # no more nodes
|
||||
@@ -473,7 +513,7 @@ sub preprocess_updatenode
|
||||
# - put attr=val operands in %attrvals hash
|
||||
|
||||
my %attrvals;
|
||||
if ($::SWMAINTENANCE)
|
||||
if ($SWMAINTENANCE)
|
||||
{
|
||||
while (my $a = shift(@ARGV))
|
||||
{
|
||||
@@ -501,7 +541,7 @@ sub preprocess_updatenode
|
||||
my $postscripts;
|
||||
|
||||
# Handle updating operating system
|
||||
if (defined($::OS))
|
||||
if (defined($OS))
|
||||
{
|
||||
my $reqcopy = {%$request};
|
||||
$reqcopy->{os}->[0] = "yes";
|
||||
@@ -515,15 +555,15 @@ sub preprocess_updatenode
|
||||
# postscripts-start-here,postbootscripts-start-here,
|
||||
# defaults-postbootscripts-start-here, osimage-postbootscripts-start-here,
|
||||
# etc
|
||||
if (defined($::RERUNPS))
|
||||
if (defined($RERUNPS))
|
||||
{
|
||||
if ($::RERUNPS eq "")
|
||||
if ($RERUNPS eq "")
|
||||
{
|
||||
$postscripts = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
$postscripts = $::RERUNPS;
|
||||
$postscripts = $RERUNPS;
|
||||
my @posts = split(',', $postscripts);
|
||||
if (!grep(/start-here/, @posts))
|
||||
{
|
||||
@@ -560,11 +600,11 @@ sub preprocess_updatenode
|
||||
|
||||
# If -F or -f option specified, sync files to the noderange and their
|
||||
# service nodes.
|
||||
if ($::FILESYNC)
|
||||
if ($FILESYNC)
|
||||
{
|
||||
$request->{FileSyncing}->[0] = "yes";
|
||||
}
|
||||
if ($::SNFILESYNC) # either sync service node
|
||||
if ($SNFILESYNC) # either sync service node
|
||||
{
|
||||
$request->{SNFileSyncing}->[0] = "yes";
|
||||
}
|
||||
@@ -572,7 +612,7 @@ sub preprocess_updatenode
|
||||
# If -F or -f then, call CFMUtils to check if any PCM CFM data is to be
|
||||
# built for the node. This will also create the synclists attribute in
|
||||
# the osimage for each node in the noderange
|
||||
if (($::FILESYNC) || ($::SNFILESYNC))
|
||||
if (($FILESYNC) || ($SNFILESYNC))
|
||||
{
|
||||
|
||||
# determine the list of osimages names in the noderange to pass into
|
||||
@@ -602,7 +642,7 @@ sub preprocess_updatenode
|
||||
|
||||
# for AIX nodes we need to copy software to SNs first - if needed
|
||||
my ($imagedef, $updateinfo);
|
||||
if (defined($::SWMAINTENANCE) && scalar(@aixnodes))
|
||||
if (defined($SWMAINTENANCE) && scalar(@aixnodes))
|
||||
{
|
||||
($rc, $imagedef, $updateinfo) =
|
||||
&doAIXcopy($callback, \%attrvals, $AIXnodes, $subreq);
|
||||
@@ -649,7 +689,7 @@ sub preprocess_updatenode
|
||||
}
|
||||
}
|
||||
# check if no servicenodes for noderange and using the -f flag
|
||||
if ($::SNFILESYNC) {
|
||||
if ($SNFILESYNC) {
|
||||
if (!(scalar(@sns))) {
|
||||
my $rsp;
|
||||
$rsp->{data}->[0] =
|
||||
@@ -659,12 +699,12 @@ sub preprocess_updatenode
|
||||
}
|
||||
}
|
||||
# process the -F or -f flags
|
||||
if (($::FILESYNC) || ($::SNFILESYNC))
|
||||
if (($FILESYNC) || ($SNFILESYNC))
|
||||
{
|
||||
# If it is only -F or -f in the command, which are always run on the MN,
|
||||
# then run it now and you are
|
||||
# finished.
|
||||
if ((!defined($::SWMAINTENANCE)) && (!defined($::RERUNPS))) {
|
||||
if ((!defined($SWMAINTENANCE)) && (!defined($RERUNPS))) {
|
||||
$request->{_xcatpreprocessed}->[0] = 1;
|
||||
&updatenode($request, $callback, $subreq);
|
||||
return;
|
||||
@@ -690,7 +730,7 @@ sub preprocess_updatenode
|
||||
}
|
||||
|
||||
|
||||
if (defined($::SWMAINTENANCE))
|
||||
if (defined($SWMAINTENANCE))
|
||||
{
|
||||
$request->{swmaintenance}->[0] = "yes";
|
||||
|
||||
@@ -706,7 +746,7 @@ sub preprocess_updatenode
|
||||
$request->{updateinfo} = [$updateinfo];
|
||||
}
|
||||
}
|
||||
if (defined($::RERUNPS))
|
||||
if (defined($RERUNPS))
|
||||
{
|
||||
$request->{rerunps}->[0] = "yes";
|
||||
$request->{postscripts} = [$postscripts];
|
||||
@@ -716,7 +756,7 @@ sub preprocess_updatenode
|
||||
}
|
||||
}
|
||||
|
||||
if (defined($::SECURITY))
|
||||
if (defined($SECURITY))
|
||||
{
|
||||
$request->{security}->[0] = "yes";
|
||||
}
|
||||
@@ -724,7 +764,7 @@ sub preprocess_updatenode
|
||||
#
|
||||
# Handle updating OS
|
||||
#
|
||||
if (defined($::OS))
|
||||
if (defined($OS))
|
||||
{
|
||||
$request->{os}->[0] = "yes";
|
||||
}
|
||||
@@ -821,11 +861,11 @@ sub update_SN_security
|
||||
# setup the ssh keys on the service nodes
|
||||
# run the postscripts: remoteshell, servicenode
|
||||
# These are all servicenodes
|
||||
$::RERUNPS = "remoteshell,servicenode";
|
||||
my $RERUNPS = "remoteshell,servicenode";
|
||||
|
||||
my $req_rs = {%$request};
|
||||
my $ps;
|
||||
$ps = $::RERUNPS;
|
||||
$ps = $RERUNPS;
|
||||
$req_rs->{rerunps}->[0] = "yes";
|
||||
$req_rs->{security}->[0] = "yes";
|
||||
$req_rs->{rerunps4security}->[0] = "yes";
|
||||
@@ -1038,31 +1078,70 @@ sub updatenode
|
||||
chomp $nimprime;
|
||||
|
||||
# parse the options
|
||||
my ($ALLSW,$CMDLINE,$ALTSRC,$HELP,$VERSION,$VERBOSE,$FILESYNC,$GENMYPOST,$USER,$SNFILESYNC,$SWMAINTENANCE,$SETSERVER,$RERUNPS,$SECURITY,$OS,$fanout,$timeout);
|
||||
Getopt::Long::Configure("bundling");
|
||||
Getopt::Long::Configure("no_pass_through");
|
||||
if (
|
||||
!GetOptions(
|
||||
'A|updateallsw' => \$::ALLSW,
|
||||
'c|cmdlineonly' => \$::CMDLINE,
|
||||
'd=s' => \$::ALTSRC,
|
||||
'g|genmypost' => \$::GENMYPOST,
|
||||
'h|help' => \$::HELP,
|
||||
'v|version' => \$::VERSION,
|
||||
'V|verbose' => \$::VERBOSE,
|
||||
'F|sync' => \$::FILESYNC,
|
||||
'l|user:s' => \$::USER,
|
||||
'f|snsync' => \$::SNFILESYNC,
|
||||
'S|sw' => \$::SWMAINTENANCE,
|
||||
's|sn' => \$::SETSERVER,
|
||||
'P|scripts:s' => \$::RERUNPS,
|
||||
'k|security' => \$::SECURITY,
|
||||
'o|os:s' => \$::OS,
|
||||
'fanout=i' => \$::fanout,
|
||||
't|timetout=i' => \$::timeout,
|
||||
'A|updateallsw' => \$ALLSW,
|
||||
'c|cmdlineonly' => \$CMDLINE,
|
||||
'd=s' => \$ALTSRC,
|
||||
'g|genmypost' => \$GENMYPOST,
|
||||
'h|help' => \$HELP,
|
||||
'v|version' => \$VERSION,
|
||||
'V|verbose' => \$VERBOSE,
|
||||
'F|sync' => \$FILESYNC,
|
||||
'l|user:s' => \$USER,
|
||||
'f|snsync' => \$SNFILESYNC,
|
||||
'S|sw' => \$SWMAINTENANCE,
|
||||
's|sn' => \$SETSERVER,
|
||||
'P|scripts:s' => \$RERUNPS,
|
||||
'k|security' => \$SECURITY,
|
||||
'o|os:s' => \$OS,
|
||||
'fanout=i' => \$fanout,
|
||||
't|timetout=i' => \$timeout,
|
||||
)
|
||||
)
|
||||
{
|
||||
}
|
||||
# These globals are used in the updatenode subroutines,
|
||||
# need to undefine them if not defined in GetOpts
|
||||
# to make updatenode be able to be called multiple times in one process.
|
||||
if (defined($VERBOSE)) {
|
||||
$::VERBOSE=$VERBOSE;
|
||||
} else {
|
||||
undef $::VERBOSE;
|
||||
}
|
||||
if (defined($timeout)) {
|
||||
$::timeout=$timeout;
|
||||
} else {
|
||||
undef $::timeout;
|
||||
}
|
||||
if (defined($fanout)) {
|
||||
$::fanout=$fanout;
|
||||
} else {
|
||||
undef $::fanout;
|
||||
}
|
||||
if (defined($USER)) {
|
||||
$::USER=$USER;
|
||||
} else {
|
||||
undef $::USER;
|
||||
}
|
||||
if (defined($ALTSRC)) {
|
||||
$::ALTSRC=$ALTSRC;
|
||||
} else {
|
||||
undef $::ALTSRC;
|
||||
}
|
||||
if (defined($ALLSW)) {
|
||||
$::ALLSW=$ALLSW;
|
||||
} else {
|
||||
undef $::ALLSW;
|
||||
}
|
||||
if (defined($SETSERVER)) {
|
||||
$::SETSERVER=$SETSERVER;
|
||||
} else {
|
||||
undef $::SETSERVER;
|
||||
}
|
||||
|
||||
#
|
||||
# process @ARGV
|
||||
@@ -1089,7 +1168,7 @@ sub updatenode
|
||||
}
|
||||
}
|
||||
# Just generate mypostscripts file and get out
|
||||
if ($::GENMYPOST)
|
||||
if ($GENMYPOST)
|
||||
{
|
||||
my @entries = xCAT::TableUtils->get_site_attribute("precreatemypostscripts");
|
||||
if ($entries[0] ) {
|
||||
@@ -1385,6 +1464,13 @@ sub updatenoderunps
|
||||
|
||||
foreach my $snkey (keys %servernodes)
|
||||
{
|
||||
if ((!defined($snkey)) or ($snkey eq "")) { # if we could not find the xcatmaster
|
||||
|
||||
my $rsp = {};
|
||||
$rsp->{error}->[0] = "Could not find xcatmaster for @{$servernodes{$snkey}}. Will skip this node. ";
|
||||
$callback->($rsp);
|
||||
next;
|
||||
}
|
||||
my $nodestring = join(',', @{$servernodes{$snkey}});
|
||||
my $args;
|
||||
my $mode;
|
||||
@@ -1838,7 +1924,7 @@ sub updatenodesoftware
|
||||
my $cmd;
|
||||
my $args1;
|
||||
$cmd =
|
||||
"$installdir/postscripts/xcatdsklspost 2 -m $snkey 'ospkgs,otherpkgs' --tftp $tftpdir --installdir $installdir --nfsv4 $nfsv4 -c";
|
||||
"$installdir/postscripts/xcatdsklspost 2 -m $snkey 'ospkgs,otherpkgs,syscloneimgupdate' --tftp $tftpdir --installdir $installdir --nfsv4 $nfsv4 -c";
|
||||
# add flowcontrol flag
|
||||
if ($flowcontrol == 1){
|
||||
$cmd .= " -F";
|
||||
|
||||
@@ -349,9 +349,8 @@ sub process_request {
|
||||
if ($errored) {
|
||||
my $rsp;
|
||||
$rsp->{errorcode}->[0]=1;
|
||||
$rsp->{error}->[0]="Failed in running begin prescripts\n";
|
||||
$rsp->{error}->[0]="Failed in running begin prescripts. Processing will still continue.\n";
|
||||
$::VSMPPXE_callback->($rsp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -466,9 +465,8 @@ sub process_request {
|
||||
if ($errored) {
|
||||
my $rsp;
|
||||
$rsp->{errorcode}->[0]=1;
|
||||
$rsp->{error}->[0]="Failed in running end prescripts\n";
|
||||
$rsp->{error}->[0]="Failed in running end prescripts. Processing will still continue.\n";
|
||||
$::VSMPPXE_callback->($rsp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -435,9 +435,8 @@ sub process_request {
|
||||
if ($errored) {
|
||||
my $rsp;
|
||||
$rsp->{errorcode}->[0]=1;
|
||||
$rsp->{error}->[0]="Failed in running begin prescripts.\n";
|
||||
$rsp->{error}->[0]="Failed in running begin prescripts. Processing will still continue.\n";
|
||||
$::XNBA_callback->($rsp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -564,9 +563,8 @@ sub process_request {
|
||||
if ($errored) {
|
||||
my $rsp;
|
||||
$rsp->{errorcode}->[0]=1;
|
||||
$rsp->{error}->[0]="Failed in running end prescripts.\n";
|
||||
$rsp->{error}->[0]="Failed in running end prescripts. Processing will still continue.\n";
|
||||
$::XNBA_callback->($rsp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -469,9 +469,8 @@ sub process_request {
|
||||
if ($errored) {
|
||||
my $rsp;
|
||||
$rsp->{errorcode}->[0]=1;
|
||||
$rsp->{error}->[0]="Failed in running begin prescripts.\n";
|
||||
$rsp->{error}->[0]="Failed in running begin prescripts. Processing will still continue.\n";
|
||||
$::YABOOT_callback->($rsp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -726,9 +725,8 @@ sub process_request {
|
||||
if ($errored) {
|
||||
my $rsp;
|
||||
$rsp->{errorcode}->[0]=1;
|
||||
$rsp->{error}->[0]="Failed in running end prescripts\n";
|
||||
$rsp->{error}->[0]="Failed in running end prescripts. Processing will still continue.\n";
|
||||
$::YABOOT_callback->($rsp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+134
-200
@@ -418,12 +418,14 @@ if ($::INITIALINSTALL || $::FORCE || $::UPDATEINSTALL || $::genCredentials)
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
$xcmd = "$::XCATROOT/sbin/restartxcatd";
|
||||
system($xcmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
$xcmd = "/etc/init.d/xcatd restart";
|
||||
#$xcmd = "/etc/init.d/xcatd restart";
|
||||
xCAT::Utils->restartservice("xcatd");
|
||||
}
|
||||
system($xcmd);
|
||||
|
||||
}
|
||||
|
||||
# more config needed after xcatd start
|
||||
@@ -453,8 +455,8 @@ if ($::INITIALINSTALL || $::FORCE)
|
||||
&setuphttp;
|
||||
|
||||
# chkconfig dhcpd on
|
||||
system("chkconfig dhcpd on");
|
||||
|
||||
#system("chkconfig dhcpd on");
|
||||
xCAT::Utils->enableservice("dhcp");
|
||||
|
||||
# Turn off selinux on RedHat
|
||||
if (-f "/etc/redhat-release")
|
||||
@@ -505,66 +507,74 @@ if ($::INITIALINSTALL || $::FORCE)
|
||||
xCAT::MsgUtils->message('E', "Failed to update /etc/ntp.conf");
|
||||
}
|
||||
|
||||
my $ntpserv;
|
||||
if (-f "/etc/redhat-release")
|
||||
{
|
||||
$ntpserv = "ntpd";
|
||||
}
|
||||
else
|
||||
{
|
||||
$ntpserv = "ntp";
|
||||
}
|
||||
$cmd = "service $ntpserv restart";
|
||||
$outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
#my $ntpserv;
|
||||
#if (-f "/etc/redhat-release")
|
||||
#{
|
||||
# $ntpserv = "ntpd";
|
||||
#}
|
||||
#else
|
||||
#{
|
||||
# $ntpserv = "ntp";
|
||||
#}
|
||||
#$cmd = "service $ntpserv restart";
|
||||
#$outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
#if ($::RUNCMD_RC != 0)
|
||||
my $ret=xCAT::Utils->restartservice("ntpserver");
|
||||
if($ret !=0)
|
||||
{
|
||||
xCAT::MsgUtils->message('E', "Failed to start ntp service");
|
||||
}
|
||||
if (-f "/sbin/chkconfig")
|
||||
{
|
||||
$cmd = "chkconfig $ntpserv on";
|
||||
$outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
#if (-f "/sbin/chkconfig")
|
||||
#{
|
||||
# $cmd = "chkconfig $ntpserv on";
|
||||
# $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
$ret=xCAT::Utils->enableservice("ntpserver");
|
||||
# if ($::RUNCMD_RC != 0)
|
||||
if($ret!=0)
|
||||
{
|
||||
xCAT::MsgUtils->message('E', "Failed to enable ntp service on every boot");
|
||||
}
|
||||
}
|
||||
#}
|
||||
}
|
||||
|
||||
# Disable firewall
|
||||
my $fwserv;
|
||||
if(-f "/etc/SuSE-release")
|
||||
{
|
||||
$fwserv = "SuSEfirewall2_setup";
|
||||
}
|
||||
elsif(-f "/etc/redhat-release")
|
||||
{
|
||||
$fwserv = "iptables";
|
||||
if( -f "/usr/sbin/firewalld" )
|
||||
{
|
||||
$fwserv = "firewalld";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
#Ubuntu: FIXME
|
||||
}
|
||||
#my $fwserv;
|
||||
#if(-f "/etc/SuSE-release")
|
||||
#{
|
||||
# $fwserv = "SuSEfirewall2_setup";
|
||||
#}
|
||||
#elsif(-f "/etc/redhat-release")
|
||||
#{
|
||||
# $fwserv = "iptables";
|
||||
# if( -f "/usr/sbin/firewalld" )
|
||||
# {
|
||||
# $fwserv = "firewalld";
|
||||
# }
|
||||
#}
|
||||
#else
|
||||
#{
|
||||
# #Ubuntu: FIXME
|
||||
#}
|
||||
|
||||
if($fwserv)
|
||||
{
|
||||
my $cmd = "service $fwserv stop";
|
||||
my $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
#if($fwserv)
|
||||
#{
|
||||
# my $cmd = "service $fwserv stop";
|
||||
# my $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
# if ($::RUNCMD_RC != 0)
|
||||
my $ret=xCAT::Utils->stopservice("firewall");
|
||||
if($ret!=0)
|
||||
{
|
||||
xCAT::MsgUtils->message('E', "Failed to stop firewall");
|
||||
}
|
||||
$cmd = "chkconfig $fwserv off";
|
||||
$outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
# $cmd = "chkconfig $fwserv off";
|
||||
# $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
# if ($::RUNCMD_RC != 0)
|
||||
$ret=xCAT::Utils->disableservice("firewall");
|
||||
if($ret!=0)
|
||||
{
|
||||
xCAT::MsgUtils->message('E', "Failed to disable firewall on boot");
|
||||
}
|
||||
}
|
||||
#}
|
||||
|
||||
# Enable ip forwarding. In most cases,
|
||||
# the MN itself will act as the default gateway for the compute nodes,
|
||||
@@ -1020,44 +1030,6 @@ sub genSSHNodeHostKey
|
||||
|
||||
}
|
||||
|
||||
# is_lsb_ubuntu return value indicates whether system appears to be Ubuntu.
|
||||
# Using required /etc/lsb-release file, instead of optional lsb_release command.
|
||||
|
||||
sub is_lsb_ubuntu
|
||||
{
|
||||
if (open(my $relfile, "<", "/etc/lsb-release")) {
|
||||
my @text = <$relfile>;
|
||||
close($relfile);
|
||||
chomp(@text);
|
||||
my $distrib_id = '';
|
||||
|
||||
foreach (@text) {
|
||||
if ( $_ =~ /^\s*DISTRIB_ID=(.*)$/ ) {
|
||||
$distrib_id = $1; # last DISTRIB_ID value in file used
|
||||
}
|
||||
}
|
||||
|
||||
if ( $distrib_id =~ /^(Ubuntu|"Ubuntu")\s*$/ ) {
|
||||
return 1; # return "true"
|
||||
}
|
||||
}
|
||||
|
||||
return 0; # return "false"
|
||||
}
|
||||
|
||||
sub is_debian
|
||||
{
|
||||
if ( -e "/etc/debian_version" && -e "/etc/issue"){
|
||||
open(my $relfile, "<", "/etc/issue");
|
||||
my $line = <$relfile>;
|
||||
close($relfile);
|
||||
if ( $line =~ /debian.*/i ){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub is_redhat6sp4
|
||||
{
|
||||
if( -e "/etc/redhat-release" ){
|
||||
@@ -1072,21 +1044,6 @@ sub is_redhat6sp4
|
||||
}
|
||||
|
||||
|
||||
# on Ubuntu need to painstakingly compare /etc/localtime with files under
|
||||
# /usr/share/zoneinfo since /etc/localtime # isn't always a symbolic link
|
||||
sub discover_timezone_ubuntu
|
||||
{
|
||||
my $localtime = "/etc/localtime";
|
||||
my $zoneinfo = "/usr/share/zoneinfo";
|
||||
|
||||
my $zone_result = `find $zoneinfo -type f -exec cmp -s $localtime {} \\; -print | grep -v posix | grep -v SystemV`;
|
||||
|
||||
my @zones = split /\n/, $zone_result;
|
||||
|
||||
$zones[0] =~ s/$zoneinfo\///;
|
||||
|
||||
return $zones[0];
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
@@ -1158,6 +1115,7 @@ sub initDB
|
||||
|
||||
# set value based on OS
|
||||
my ($domain, $timezone);
|
||||
my $timezone = xCAT::Utils->gettimezone();
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
my ($name, $rest) = split('\.', $hname);
|
||||
@@ -1170,35 +1128,10 @@ sub initDB
|
||||
$domain = "";
|
||||
}
|
||||
|
||||
$timezone = $ENV{'TZ'};
|
||||
}
|
||||
else # linux
|
||||
{
|
||||
$domain = `hostname -d`;
|
||||
my $tz;
|
||||
if (-f "/etc/redhat-release")
|
||||
{
|
||||
|
||||
# on Redhat look for "ZONE"
|
||||
$tz =
|
||||
`grep ^ZONE /etc/sysconfig/clock|cut -d= -f 2|sed -e 's/"//g'`;
|
||||
}
|
||||
elsif ( is_lsb_ubuntu() || is_debian() )
|
||||
{
|
||||
$tz = discover_timezone_ubuntu;
|
||||
if (!$tz){
|
||||
$tz = `cat /etc/timezone`;
|
||||
chomp $tz;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
# on SuSE look for "TIMEZONE"
|
||||
$tz =
|
||||
`grep ^TIMEZONE /etc/sysconfig/clock|cut -d= -f 2|sed -e 's/"//g'`;
|
||||
}
|
||||
$timezone = $tz;
|
||||
}
|
||||
|
||||
chomp $timezone;
|
||||
@@ -1858,16 +1791,18 @@ sub setupLinuxexports
|
||||
{
|
||||
|
||||
# restart nfs
|
||||
my $cmd;
|
||||
my $os = xCAT::Utils->osver();
|
||||
my $SERVICE = xCAT::Utils->fullpathbin("service");
|
||||
if ($os =~ /sles/) {
|
||||
$cmd = "$SERVICE nfsserver restart";
|
||||
} else {
|
||||
$cmd = "$SERVICE nfs restart";
|
||||
}
|
||||
my $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
# my $cmd;
|
||||
# my $os = xCAT::Utils->osver();
|
||||
# my $SERVICE = xCAT::Utils->fullpathbin("service");
|
||||
# if ($os =~ /sles/) {
|
||||
# $cmd = "$SERVICE nfsserver restart";
|
||||
# } else {
|
||||
# $cmd = "$SERVICE nfs restart";
|
||||
# }
|
||||
# my $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
# if ($::RUNCMD_RC != 0)
|
||||
my $ret=xCAT::Utils->restartservice("nfs");
|
||||
if($ret!=0)
|
||||
{
|
||||
xCAT::MsgUtils->message('E', "Could not restart NFS.");
|
||||
}
|
||||
@@ -1876,14 +1811,18 @@ sub setupLinuxexports
|
||||
xCAT::MsgUtils->message('I', "NFS has been restarted.");
|
||||
}
|
||||
|
||||
my $CHKCONFIG=xCAT::Utils->fullpathbin("chkconfig");
|
||||
if ($os =~ /sles/) {
|
||||
$cmd = "$CHKCONFIG nfsserver on";
|
||||
} else {
|
||||
$cmd = "$CHKCONFIG nfs on";
|
||||
}
|
||||
$outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
#my $CHKCONFIG=xCAT::Utils->fullpathbin("chkconfig");
|
||||
#if ($os =~ /sles/) {
|
||||
# $cmd = "$CHKCONFIG nfsserver on";
|
||||
#} else {
|
||||
# $cmd = "$CHKCONFIG nfs on";
|
||||
#}
|
||||
#$outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
#if ($::RUNCMD_RC != 0)
|
||||
|
||||
|
||||
$ret=xCAT::Utils->enableservice("nfs");
|
||||
if($ret!=0)
|
||||
{
|
||||
xCAT::MsgUtils->message('E', "Could not enable NFS.");
|
||||
}
|
||||
@@ -1972,23 +1911,26 @@ sub makenetworks
|
||||
sub setuphttp
|
||||
{
|
||||
|
||||
my $cmd;
|
||||
# restart httpd
|
||||
if (-e "/etc/init.d/apache2")
|
||||
{ #for sles/ubuntu
|
||||
$cmd = "/etc/init.d/apache2 stop; /etc/init.d/apache2 start";
|
||||
}
|
||||
elsif (-e "/etc/init.d/httpd")
|
||||
{
|
||||
$cmd = "/etc/init.d/httpd stop; /etc/init.d/httpd start";
|
||||
}
|
||||
else
|
||||
{
|
||||
$cmd = "service httpd stop; service httpd start";
|
||||
}
|
||||
# my $cmd;
|
||||
# my $distro = xCAT::Utils->osver();
|
||||
# # restart httpd
|
||||
# if (-e "/etc/init.d/apache2")
|
||||
# { #for sles/ubuntu
|
||||
# $cmd = "/etc/init.d/apache2 stop; /etc/init.d/apache2 start";
|
||||
# }
|
||||
# elsif (-e "/etc/init.d/httpd")
|
||||
# {
|
||||
# $cmd = "/etc/init.d/httpd stop; /etc/init.d/httpd start";
|
||||
# }
|
||||
# else
|
||||
# {
|
||||
# $cmd = "service httpd stop; service httpd start";
|
||||
# }
|
||||
|
||||
my $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
# my $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
# if ($::RUNCMD_RC != 0)
|
||||
my $ret=xCAT::Utils->restartservice("http");
|
||||
if($ret!=0)
|
||||
{
|
||||
xCAT::MsgUtils->message('E', "Could not restart httpd.");
|
||||
}
|
||||
@@ -1998,39 +1940,28 @@ sub setuphttp
|
||||
}
|
||||
|
||||
# enable httpd
|
||||
if (-e "/etc/init.d/apache2")
|
||||
{
|
||||
if (is_lsb_ubuntu() || is_debian() )
|
||||
{ # for ubuntu
|
||||
$cmd = "/usr/sbin/update-rc.d apache2 enable";
|
||||
}
|
||||
else
|
||||
{ # for sles
|
||||
$cmd = "/sbin/chkconfig apache2 on";
|
||||
}
|
||||
}
|
||||
# elsif (-e "/sbin/chkconfig")
|
||||
# {
|
||||
# $cmd = "/sbin/chkconfig httpd on";
|
||||
# }
|
||||
# elsif (-e "/usr/sbin/chkconfig")
|
||||
# {
|
||||
# $cmd = "/usr/sbin/chkconfig httpd on";
|
||||
# }
|
||||
# else
|
||||
# {
|
||||
# $cmd = "chkconfig httpd on";
|
||||
# }
|
||||
else
|
||||
{
|
||||
my $CHKCONFIG = xCAT::Utils->fullpathbin("chkconfig");
|
||||
$cmd = "$CHKCONFIG httpd on";
|
||||
}
|
||||
#if (-e "/etc/init.d/apache2")
|
||||
#{
|
||||
# if ( $distro =~ /ubuntu.*/ || $distro =~ /debian.*/i) {
|
||||
# $cmd = "/usr/sbin/update-rc.d apache2 enable";
|
||||
# }
|
||||
# else
|
||||
# { # for sles
|
||||
# $cmd = "/sbin/chkconfig apache2 on";
|
||||
# }
|
||||
#}
|
||||
#else
|
||||
#{
|
||||
# my $CHKCONFIG = xCAT::Utils->fullpathbin("chkconfig");
|
||||
# $cmd = "$CHKCONFIG httpd on";
|
||||
#}
|
||||
|
||||
|
||||
|
||||
$outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
#$outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
#if ($::RUNCMD_RC != 0)
|
||||
$ret=xCAT::Utils->enableservice("http");
|
||||
if($ret!=0)
|
||||
{
|
||||
xCAT::MsgUtils->message('E', "Could not enable httpd.");
|
||||
}
|
||||
@@ -2253,6 +2184,7 @@ sub setupMNinDB
|
||||
sub startnamedonboot
|
||||
{
|
||||
# start named on boot
|
||||
my $distro = xCAT::Utils->osver();
|
||||
if (xCAT::Utils->isAIX())
|
||||
{
|
||||
#/etc/inittab
|
||||
@@ -2270,12 +2202,12 @@ sub startnamedonboot
|
||||
else
|
||||
{
|
||||
#chkconfig
|
||||
my $serv = "named";
|
||||
my $cmd = "/sbin/chkconfig $serv on";
|
||||
if ( is_lsb_ubuntu() || is_debian() ){
|
||||
$serv = "bind9";
|
||||
$cmd = "update-rc.d $serv enable";
|
||||
}
|
||||
#my $serv = "named";
|
||||
#my $cmd = "/sbin/chkconfig $serv on";
|
||||
#if ( $distro =~ /ubuntu.*/ || $distro =~ /debian.*/i) {
|
||||
# $serv = "bind9";
|
||||
# $cmd = "update-rc.d $serv enable";
|
||||
#}
|
||||
|
||||
#"service named start" is very slowly,sometimes hang in rhels6.4 after installation
|
||||
#a work around is to generate /etc/rndc-key during xCAT installation
|
||||
@@ -2283,14 +2215,16 @@ sub startnamedonboot
|
||||
system("rndc-confgen -a -r /dev/urandom");
|
||||
}
|
||||
|
||||
my $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
#my $outref = xCAT::Utils->runcmd("$cmd", 0);
|
||||
#if ($::RUNCMD_RC != 0)
|
||||
my $ret=xCAT::Utils->enableservice("named");
|
||||
if($ret!=0)
|
||||
{
|
||||
xCAT::MsgUtils->message("E", "Could not enable $serv.");
|
||||
xCAT::MsgUtils->message("E", "Could not enable dns server.");
|
||||
}
|
||||
else
|
||||
{
|
||||
xCAT::MsgUtils->message("I", "$serv has been enabled on boot.");
|
||||
xCAT::MsgUtils->message("I", "dns server has been enabled on boot.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +104,12 @@ use Data::Dumper;
|
||||
use Getopt::Long;
|
||||
use Sys::Syslog qw(:DEFAULT setlogsock);
|
||||
openlog("xcatd",,"local4");
|
||||
# turn off warnings for call to setlogsock. puts out warning message if
|
||||
# syslog tcp port not defined in /etc/services. this can safely be ignored.
|
||||
no warnings qw(Sys::Syslog);
|
||||
setlogsock(["tcp","unix","stream"]);
|
||||
use warnings qw(Sys::Syslog);
|
||||
|
||||
use xCAT::NotifHandler;
|
||||
use xCAT_monitoring::monitorctrl;
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
[main]
|
||||
ssh-setup-command=echo
|
||||
[xdsh]
|
||||
pre-command=NULL
|
||||
post-command=NULL
|
||||
@@ -251,7 +251,11 @@ then
|
||||
then
|
||||
BOOT_HOSTNAME=$(lsattr -El inet0 -a hostname | awk '{print $2}')
|
||||
else # Linux
|
||||
BOOT_HOSTNAME=`grep HOSTNAME /etc/sysconfig/network | cut -f 2 -d "="`
|
||||
if [ -f "/etc/hostname" ]; then
|
||||
BOOT_HOSTNAME=`cat /etc/hostname`
|
||||
else
|
||||
BOOT_HOSTNAME=`grep HOSTNAME /etc/sysconfig/network | cut -f 2 -d "="`
|
||||
fi
|
||||
fi
|
||||
hostname ${BOOT_HOSTNAME}
|
||||
fi
|
||||
|
||||
@@ -7,3 +7,4 @@ rsync
|
||||
yp-tools
|
||||
openssh-server
|
||||
util-linux-ng
|
||||
net-tools
|
||||
|
||||
@@ -0,0 +1,154 @@
|
||||
#
|
||||
#cmdline
|
||||
|
||||
lang en_US
|
||||
#KICKSTARTNET#
|
||||
|
||||
#
|
||||
# Where's the source?
|
||||
# nfs --server hostname.of.server or IP --dir /path/to/RH/CD/image
|
||||
#
|
||||
#nfs --server #XCATVAR:INSTALL_NFS# --dir #XCATVAR:INSTALL_SRC_DIR#
|
||||
|
||||
%include /tmp/repos
|
||||
|
||||
#device ethernet e100
|
||||
keyboard "us"
|
||||
|
||||
#
|
||||
# Clear the MBR
|
||||
#
|
||||
zerombr
|
||||
|
||||
#
|
||||
# Wipe out the disk
|
||||
#
|
||||
clearpart --all --initlabel
|
||||
#clearpart --linux
|
||||
#key --skip
|
||||
|
||||
#
|
||||
# Customize to fit your needs
|
||||
#
|
||||
|
||||
#XCAT_PARTITION_START#
|
||||
#No RAID
|
||||
#/boot really significant for this sort of setup nowadays?
|
||||
#part /boot --size 50 --fstype ext3
|
||||
%include /tmp/partitioning
|
||||
#part swap --size 1024
|
||||
#part / --size 1 --grow --fstype ext4
|
||||
#XCAT_PARTITION_END#
|
||||
|
||||
#RAID 0 /scr for performance
|
||||
#part / --size 1024 --ondisk sda
|
||||
#part swap --size 512 --ondisk sda
|
||||
#part /var --size 1024 --ondisk sdb
|
||||
#part swap --size 512 --ondisk sdb
|
||||
#part raid.01 --size 1 --grow --ondisk sda
|
||||
#part raid.02 --size 1 --grow --ondisk sdb
|
||||
#raid /scr --level 0 --device md0 raid.01 raid.02
|
||||
|
||||
#Full RAID 1 Sample
|
||||
#part raid.01 --size 50 --ondisk sda
|
||||
#part raid.02 --size 50 --ondisk sdb
|
||||
#raid /boot --level 1 --device md0 raid.01 raid.02
|
||||
#
|
||||
#part raid.11 --size 1024 --ondisk sda
|
||||
#part raid.12 --size 1024 --ondisk sdb
|
||||
#raid / --level 1 --device md1 raid.11 raid.12
|
||||
#
|
||||
#part raid.21 --size 1024 --ondisk sda
|
||||
#part raid.22 --size 1024 --ondisk sdb
|
||||
#raid /var --level 1 --device md2 raid.21 raid.22
|
||||
#
|
||||
#part raid.31 --size 1024 --ondisk sda
|
||||
#part raid.32 --size 1024 --ondisk sdb
|
||||
#raid swap --level 1 --device md3 raid.31 raid.32
|
||||
#
|
||||
#part raid.41 --size 1 --grow --ondisk sda
|
||||
#part raid.42 --size 1 --grow --ondisk sdb
|
||||
#raid /scr --level 1 --device md4 raid.41 raid.42
|
||||
|
||||
#
|
||||
# bootloader config
|
||||
# --append <args>
|
||||
# --useLilo
|
||||
# --md5pass <crypted MD5 password for GRUB>
|
||||
#
|
||||
bootloader
|
||||
|
||||
#
|
||||
# install or upgrade
|
||||
#
|
||||
install
|
||||
|
||||
#
|
||||
# text mode install (default is graphical)
|
||||
#
|
||||
text
|
||||
|
||||
#
|
||||
# firewall
|
||||
#
|
||||
firewall --disabled
|
||||
|
||||
#
|
||||
# Select a zone
|
||||
# Add the --utc switch if your hardware clock is set to GMT
|
||||
#
|
||||
#timezone US/Hawaii
|
||||
#timezone US/Pacific
|
||||
#timezone US/Mountain
|
||||
#timezone US/Central
|
||||
#timezone US/Eastern
|
||||
timezone --utc "#TABLE:site:key=timezone:value#"
|
||||
|
||||
#
|
||||
# Don't do X
|
||||
#
|
||||
skipx
|
||||
|
||||
|
||||
#
|
||||
# To generate an encrypted root password use:
|
||||
#
|
||||
# perl -e 'print crypt("blah","Xa") . "\n";'p
|
||||
# openssl passwd -apr1 -salt xxxxxxxx password
|
||||
#
|
||||
# where "blah" is your root password.
|
||||
#
|
||||
#rootpw --iscrypted XaLGAVe1C41x2
|
||||
#rootpw XaLGAVe1C41x2 --iscrypted
|
||||
rootpw --iscrypted #CRYPT:passwd:key=system,username=root:password#
|
||||
|
||||
#
|
||||
# NIS setup: auth --enablenis --nisdomain sensenet
|
||||
# --nisserver neptune --useshadow --enablemd5
|
||||
#
|
||||
# OR
|
||||
auth --useshadow --enablemd5
|
||||
|
||||
|
||||
#
|
||||
# SE Linux
|
||||
#
|
||||
selinux --disabled
|
||||
|
||||
#
|
||||
# Reboot after installation
|
||||
#
|
||||
reboot
|
||||
|
||||
#
|
||||
#end of section
|
||||
#
|
||||
%packages
|
||||
#INCLUDE_DEFAULT_PKGLIST#
|
||||
%end
|
||||
%pre
|
||||
#INCLUDE:#ENV:XCATROOT#/share/xcat/install/scripts/pre.rh.rhel7#
|
||||
%end
|
||||
%post
|
||||
#INCLUDE:#ENV:XCATROOT#/share/xcat/install/scripts/post.xcat#
|
||||
%end
|
||||
@@ -0,0 +1,37 @@
|
||||
#Please make sure there is a space between @ and group name
|
||||
@ Network Infrastructure Server
|
||||
@ System administration tools
|
||||
@ System Management
|
||||
@ X Window System
|
||||
@ Development Tools
|
||||
autofs
|
||||
ksh
|
||||
tcsh
|
||||
ntp
|
||||
tftp
|
||||
xinetd
|
||||
rsh
|
||||
rsh-server
|
||||
psacct
|
||||
nfs-utils
|
||||
net-snmp
|
||||
rsync
|
||||
yp-tools
|
||||
ypserv
|
||||
ypbind
|
||||
m4
|
||||
sendmail-cf
|
||||
gdb
|
||||
binutils
|
||||
openssh-server
|
||||
openssl098e.ppc
|
||||
openssl098e.ppc64
|
||||
util-linux
|
||||
perl-DBD-MySQL
|
||||
perl-Socket6
|
||||
unixODBC
|
||||
perl-DBD-MySQL
|
||||
mysql-connector-odbc
|
||||
perl-DBD-Pg
|
||||
wget
|
||||
util-linux-ng
|
||||
@@ -0,0 +1,28 @@
|
||||
#Please make sure there is a space between @ and group name
|
||||
autofs
|
||||
ksh
|
||||
tcsh
|
||||
ntp
|
||||
tftp
|
||||
xinetd
|
||||
rsh
|
||||
rsh-server
|
||||
psacct
|
||||
nfs-utils
|
||||
net-snmp
|
||||
rsync
|
||||
yp-tools
|
||||
ypserv
|
||||
ypbind
|
||||
m4
|
||||
sendmail-cf
|
||||
gdb
|
||||
binutils
|
||||
openssh-server
|
||||
util-linux
|
||||
unixODBC
|
||||
perl-DBD-MySQL
|
||||
mysql-connector-odbc
|
||||
perl-DBD-Pg
|
||||
wget
|
||||
util-linux-ng
|
||||
@@ -59,7 +59,7 @@ do
|
||||
mv $i/postscripts /xcatpost
|
||||
rm -rf $i
|
||||
chmod +x /xcatpost/*
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /xcatpost/mypostscript
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' | sed -e 's/</</g' -e 's/>/>/g' -e 's/&/\&/g' -e 's/"/"/g' -e "s/'/'/g" > /xcatpost/mypostscript
|
||||
MYCONT=`grep MASTER /xcatpost/mypostscript`
|
||||
MAX_RETRIES=10
|
||||
RETRY=0
|
||||
@@ -72,7 +72,7 @@ do
|
||||
|
||||
let SLI=$RANDOM%10+10
|
||||
sleep $SLI
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /xcatpost/mypostscript
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' | sed -e 's/</</g' -e 's/>/>/g' -e 's/&/\&/g' -e 's/"/"/g' -e "s/'/'/g" > /xcatpost/mypostscript
|
||||
MYCONT=`grep MASTER /xcatpost/mypostscript`
|
||||
done
|
||||
|
||||
|
||||
@@ -13,7 +13,8 @@ if [ -z "$PRINIC" ]
|
||||
then
|
||||
for karg in $(cat /proc/cmdline |sed -e 's/-/:/g' -e 's/ /\n/g'); do
|
||||
if [ "${karg%%=*}" = "BOOTIF" ]; then
|
||||
export PRINIC=`ifconfig -a|grep -i "hwaddr ${karg#*=01:}"|awk '{print $1}'`
|
||||
#export PRINIC=`ifconfig -a|grep -i "hwaddr ${karg#*=01:}"|awk '{print $1}'`
|
||||
export PRINIC=`ip -o link|grep -i "${karg#*=}"|awk '{print $2}'|sed s/://`
|
||||
fi
|
||||
done
|
||||
if [ -z "$PRINIC" ]; then
|
||||
@@ -24,13 +25,16 @@ if [ -z "$PRINIC" ]
|
||||
then
|
||||
export PRINIC=eth0
|
||||
elif [[ `echo "$PRINIC" | grep -sqE ^[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+:[A-Fa-f0-9]+$ ;echo $?` == "0" ]]; then
|
||||
export PRINIC=`ifconfig -a | grep -i "HWaddr $PRINIC" | awk '{print $1}'`
|
||||
#export PRINIC=`ifconfig -a | grep -i "HWaddr $PRINIC" | awk '{print $1}'`
|
||||
export PRINIC=`ip -o link|grep -i "$PRINIC"|awk '{print $2}'|sed s/://`
|
||||
fi
|
||||
IP=$(ifconfig $PRINIC | grep inet | awk '{print $2}' | awk -F: '{print $2}')
|
||||
#IP=$(ifconfig $PRINIC | grep inet | awk '{print $2}' | awk -F: '{print $2}')
|
||||
IP=$(ip addr show dev $PRINIC | grep inet | grep -v inet6 | awk '{print $2}' | head -n 1 | awk -F '/' '{print $1}')
|
||||
if [ -z $IP ]
|
||||
then
|
||||
dhclient eth0
|
||||
IP=$(ifconfig $PRINIC | grep inet | awk '{print $2}' | awk -F: '{print $2}')
|
||||
#IP=$(ifconfig $PRINIC | grep inet | awk '{print $2}' | awk -F: '{print $2}')
|
||||
IP=$(ip addr show dev $PRINIC | grep inet | grep -v inet6 | awk '{print $2}' | head -n 1 | awk -F '/' '{print $1}')
|
||||
fi
|
||||
|
||||
export HOSTNAME=$(host $IP 2>/dev/null | awk '{print $5}' | awk -F. '{print $1}')
|
||||
|
||||
@@ -61,7 +61,7 @@ do
|
||||
mv $i/postscripts /xcatpost
|
||||
rm -rf $i
|
||||
chmod +x /xcatpost/*
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /xcatpost/mypostscript
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' | sed -e 's/</</g' -e 's/>/>/g' -e 's/&/\&/g' -e 's/"/"/g' -e "s/'/'/g" > /xcatpost/mypostscript
|
||||
MYCONT=`grep MASTER /xcatpost/mypostscript`
|
||||
MAX_RETRIES=10
|
||||
RETRY=0
|
||||
@@ -74,7 +74,7 @@ do
|
||||
|
||||
let SLI=$RANDOM%10+10
|
||||
sleep $SLI
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /xcatpost/mypostscript
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' | sed -e 's/</</g' -e 's/>/>/g' -e 's/&/\&/g' -e 's/"/"/g' -e "s/'/'/g" > /xcatpost/mypostscript
|
||||
MYCONT=`grep MASTER /xcatpost/mypostscript`
|
||||
done
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ do
|
||||
if [ ! -x /xcatpost/mypostscript ]; then
|
||||
|
||||
chmod +x /xcatpost/*
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /xcatpost/mypostscript
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' | sed -e 's/</</g' -e 's/>/>/g' -e 's/&/\&/g' -e 's/"/"/g' -e "s/'/'/g" > /xcatpost/mypostscript
|
||||
|
||||
|
||||
MYCONT=`grep MASTER /xcatpost/mypostscript`
|
||||
@@ -59,7 +59,7 @@ do
|
||||
|
||||
let SLI=$RANDOM%10+10
|
||||
sleep $SLI
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' > /xcatpost/mypostscript
|
||||
/xcatpost/getpostscript.awk |sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' | sed -e 's/</</g' -e 's/>/>/g' -e 's/&/\&/g' -e 's/"/"/g' -e "s/'/'/g" > /xcatpost/mypostscript
|
||||
|
||||
MYCONT=`grep MASTER /xcatpost/mypostscript`
|
||||
done
|
||||
|
||||
@@ -225,19 +225,26 @@ elif grep ext4 /proc/filesystems > /dev/null; then
|
||||
else
|
||||
FSTYPE=ext3
|
||||
fi
|
||||
BOOTFSTYPE=ext3
|
||||
EFIFSTYPE=vfat
|
||||
if uname -r|grep ^3.*el7 > /dev/null; then
|
||||
FSTYPE=xfs
|
||||
BOOTFSTYPE=xfs
|
||||
EFIFSTYPE=efi
|
||||
fi
|
||||
|
||||
if [ `uname -m` = "ppc64" ]; then
|
||||
echo 'part None --fstype "PPC PReP Boot" --ondisk '$instdisk' --size 8' >> /tmp/partitioning
|
||||
fi
|
||||
if [ -d /sys/firmware/efi ]; then
|
||||
echo 'bootloader --driveorder='$instdisk >> /tmp/partitioning
|
||||
echo 'part /boot/efi --size 50 --ondisk '$instdisk' --fstype vfat' >> /tmp/partitioning
|
||||
echo 'part /boot/efi --size 50 --ondisk '$instdisk' --fstype $EFIFSTYPE' >> /tmp/partitioning
|
||||
else
|
||||
echo 'bootloader' >> /tmp/partitioning
|
||||
fi
|
||||
|
||||
#TODO: ondisk detection, /dev/disk/by-id/edd-int13_dev80 for legacy maybe, and no idea about efi. at least maybe blacklist SAN if mptsas/mpt2sas/megaraid_sas seen...
|
||||
echo "part /boot --size 256 --fstype ext3 --ondisk $instdisk" >> /tmp/partitioning
|
||||
echo "part /boot --size 256 --fstype $BOOTFSTYPE --ondisk $instdisk" >> /tmp/partitioning
|
||||
echo "part swap --recommended --ondisk $instdisk" >> /tmp/partitioning
|
||||
echo "part / --size 1 --grow --ondisk $instdisk --fstype $FSTYPE" >> /tmp/partitioning
|
||||
|
||||
|
||||
@@ -178,8 +178,6 @@ if [ -z "$instdisk" ]; then
|
||||
instdisk=$firstdisk
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
modprobe ext4 >& /dev/null
|
||||
modprobe ext4dev >& /dev/null
|
||||
if grep ext4dev /proc/filesystems > /dev/null; then
|
||||
@@ -189,18 +187,28 @@ elif grep ext4 /proc/filesystems > /dev/null; then
|
||||
else
|
||||
FSTYPE=ext3
|
||||
fi
|
||||
BOOTFSTYPE=ext3
|
||||
EFIFSTYPE=vfat
|
||||
|
||||
if uname -r|grep '^3.*el7' > /dev/null; then
|
||||
BOOTFSTYPE=xfs
|
||||
FSTYPE=xfs
|
||||
EFIFSTYPE=efi
|
||||
fi
|
||||
|
||||
if [ `uname -m` = "ppc64" ]; then
|
||||
echo 'part None --fstype "PPC PReP Boot" --ondisk '$instdisk' --size 8' >> /tmp/partitioning
|
||||
fi
|
||||
if [ -d /sys/firmware/efi ]; then
|
||||
echo 'part /boot/efi --size 50 --ondisk '$instdisk' --fstype vfat' >> /tmp/partitioning
|
||||
echo 'part /boot/efi --size 50 --ondisk '$instdisk' --fstype '$EFIFSTYPE >> /tmp/partitioning
|
||||
fi
|
||||
|
||||
#TODO: ondisk detection, /dev/disk/by-id/edd-int13_dev80 for legacy maybe, and no idea about efi. at least maybe blacklist SAN if mptsas/mpt2sas/megaraid_sas seen...
|
||||
echo "part /boot --size 256 --fstype ext3 --ondisk $instdisk" >> /tmp/partitioning
|
||||
echo "part /boot --size 256 --fstype $BOOTFSTYPE --ondisk $instdisk" >> /tmp/partitioning
|
||||
echo "part swap --recommended --ondisk $instdisk" >> /tmp/partitioning
|
||||
echo "part / --size 1 --grow --ondisk $instdisk --fstype $FSTYPE" >> /tmp/partitioning
|
||||
echo "part pv.01 --size 1 --grow --ondisk $instdisk" >> /tmp/partitioning
|
||||
echo "volgroup system pv.01" >> /tmp/partitioning
|
||||
echo "logvol / --vgname=system --name=root --size 1 --grow --fstype $FSTYPE" >> /tmp/partitioning
|
||||
|
||||
#XCA_PARTITION_SCRIPT#
|
||||
|
||||
|
||||
@@ -5,10 +5,8 @@ dhclient
|
||||
kernel
|
||||
openssh-server
|
||||
openssh-clients
|
||||
busybox
|
||||
wget
|
||||
rsyslog
|
||||
dash
|
||||
vim-minimal
|
||||
ntp
|
||||
rsyslog
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user