git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/branches/2.6@10240 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
+1
-1
@@ -399,7 +399,7 @@ if [ "$OSNAME" != "AIX" -a "$REL" = "devel" -a "$PROMOTE" != 1 ]; then
|
||||
rpm2cpio ../$XCATCORE/xCAT-client-*.$NOARCH.rpm | cpio -id '*.html'
|
||||
rpm2cpio ../$XCATCORE/perl-xCAT-*.$NOARCH.rpm | cpio -id '*.html'
|
||||
rpm2cpio ../$XCATCORE/xCAT-test-*.$NOARCH.rpm | cpio -id '*.html'
|
||||
while ! rsync -rv opt/xcat/share/doc/man1 opt/xcat/share/doc/man3 opt/xcat/share/doc/man5 opt/xcat/share/doc/man8 $UPLOADUSER,xcat@web.sourceforge.net:htdocs/
|
||||
while ! rsync -rv opt/xcat/share/doc/man1 opt/xcat/share/doc/man3 opt/xcat/share/doc/man5 opt/xcat/share/doc/man7 opt/xcat/share/doc/man8 $UPLOADUSER,xcat@web.sourceforge.net:htdocs/
|
||||
do : ; done
|
||||
cd ..
|
||||
fi
|
||||
|
||||
+1
-1
@@ -112,7 +112,7 @@ cd $OSVER
|
||||
# pyodbc is dependent on unixODBC
|
||||
rpm -Uvh unixODBC*
|
||||
|
||||
for i in `ls *.rpm|grep -v -E '^tcl-|^tk-|^expect-|^unixODBC-'`; do
|
||||
for i in `ls *.rpm|grep -v -E '^tcl-|^tk-|^expect-|^unixODBC-|^xCAT-UI-deps'`; do
|
||||
if [ "$i" == "perl-Net-DNS-0.66-1.aix5.3.ppc.rpm" ]; then
|
||||
opts="--nodeps"
|
||||
else
|
||||
|
||||
+14
-7
@@ -24,15 +24,22 @@ then
|
||||
rpm -ba xCAT-client/xCAT-client.spec
|
||||
#rpm -ta $source/SOURCES/xCAT-client-$VER.tar.gz
|
||||
else
|
||||
if [ -f /etc/redhat-release ]
|
||||
rpmbuild --version > /dev/null
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
pkg="redhat"
|
||||
else
|
||||
pkg="packages"
|
||||
echo "Error: Is rpmbuild installed and working?"
|
||||
exit 1
|
||||
fi
|
||||
RPMROOT=`rpmbuild --eval '%_topdir' xCATsn/xCATsn.spec`
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
echo "Could not determine rpmbuild's root"
|
||||
exit 1
|
||||
fi
|
||||
echo "The location for rpm building is ${RPMROOT}"
|
||||
|
||||
set -x
|
||||
tar --exclude=.svn -czhf /usr/src/$pkg/SOURCES/xCAT-client-$VER.tar.gz xCAT-client
|
||||
rm -f /usr/src/$pkg/SRPMS/xCAT-client-$VER*rpm /usr/src/$pkg/RPMS/noarch/xCAT-client-$VER*rpm
|
||||
rpmbuild -ta /usr/src/$pkg/SOURCES/xCAT-client-$VER.tar.gz
|
||||
tar --exclude=.svn -czhf $RPMROOT/SOURCES/xCAT-client-$VER.tar.gz xCAT-client
|
||||
rm -f $RPMROOT/SRPMS/xCAT-client-$VER*rpm $RPMROOT/RPMS/noarch/xCAT-client-$VER*rpm
|
||||
rpmbuild -ta $RPMROOT/SOURCES/xCAT-client-$VER.tar.gz
|
||||
fi
|
||||
|
||||
+16
-9
@@ -1,16 +1,23 @@
|
||||
#!/bin/sh
|
||||
VER=`cat Version`
|
||||
if [ -f /etc/redhat-release ]
|
||||
rpmbuild --version > /dev/null
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
pkg="redhat"
|
||||
else
|
||||
pkg="packages"
|
||||
echo "Error: Is rpmbuild installed and working?"
|
||||
exit 1
|
||||
fi
|
||||
RPMROOT=`rpmbuild --eval '%_topdir' xCATsn/xCATsn.spec`
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
echo "Could not determine rpmbuild's root"
|
||||
exit 1
|
||||
fi
|
||||
echo "The location for rpm building is ${RPMROOT}"
|
||||
cd `dirname $0`/xCAT-nbroot
|
||||
tar --exclude .svn -czvf /usr/src/$pkg/SOURCES/xcat-nbrootoverlay.tar.gz -C overlay/ .
|
||||
#mv -f *.gz /usr/src/$pkg/SOURCES
|
||||
cp LICENSE.html /usr/src/$pkg/BUILD
|
||||
cp xcat-core-nbroot.spec /usr/src/$pkg/SOURCES
|
||||
tar --exclude .svn -czvf $RPMROOT/SOURCES/xcat-nbrootoverlay.tar.gz -C overlay/ .
|
||||
#mv -f *.gz $RPMROOT/SOURCES
|
||||
cp LICENSE.html $RPMROOT/BUILD
|
||||
cp xcat-core-nbroot.spec $RPMROOT/SOURCES
|
||||
cd -
|
||||
rm -f /usr/src/$pkg/SRPMS/xCAT-nbroot-$VER*rpm /usr/src/$pkg/RPMS/*/xCAT-nbroot-$VER*rpm
|
||||
rm -f $RPMROOT/SRPMS/xCAT-nbroot-$VER*rpm $RPMROOT/RPMS/*/xCAT-nbroot-$VER*rpm
|
||||
rpmbuild -ba xCAT-nbroot/xcat-core-nbroot.spec --target $1
|
||||
|
||||
+17
-9
@@ -26,19 +26,27 @@ then
|
||||
rpm -ba perl-xCAT/perl-xCAT.spec
|
||||
#rpm -ta $source/SOURCES/perl-xCAT-$VER.tar.gz
|
||||
else
|
||||
if [ -f /etc/redhat-release ]
|
||||
|
||||
rpmbuild --version > /dev/null
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
pkg="redhat"
|
||||
else
|
||||
pkg="packages"
|
||||
echo "Error: Is rpmbuild installed and working?"
|
||||
exit 1
|
||||
fi
|
||||
RPMROOT=`rpmbuild --eval '%_topdir' xCATsn/xCATsn.spec`
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
echo "Could not determine rpmbuild's root"
|
||||
exit 1
|
||||
fi
|
||||
echo "The location for rpm building is ${RPMROOT}"
|
||||
|
||||
set -x
|
||||
|
||||
svn info > perl-xCAT/.svninfo
|
||||
tar --exclude .svn -czhf /usr/src/$pkg/SOURCES/perl-xCAT-$VER.tar.gz perl-xCAT;
|
||||
rm perl-xCAT/.svninfo
|
||||
rm -f /usr/src/$pkg/SRPMS/perl-xCAT-$VER*rpm /usr/src/$pkg/RPMS/noarch/perl-xCAT-$VER*rpm
|
||||
rpmbuild -ta /usr/src/$pkg/SOURCES/perl-xCAT-$VER.tar.gz
|
||||
svn info > perl-xCAT/.svninfo
|
||||
tar --exclude .svn -czhf $RPMROOT/SOURCES/perl-xCAT-$VER.tar.gz perl-xCAT;
|
||||
rm perl-xCAT/.svninfo
|
||||
rm -f $RPMROOT/SRPMS/perl-xCAT-$VER*rpm $RPMROOT/RPMS/noarch/perl-xCAT-$VER*rpm
|
||||
rpmbuild -ta $RPMROOT/SOURCES/perl-xCAT-$VER.tar.gz
|
||||
|
||||
fi
|
||||
|
||||
+28
-20
@@ -7,32 +7,40 @@ if [ "$OSNAME" = "AIX" ]
|
||||
then
|
||||
|
||||
#echo '.svn' > /tmp/xcat-excludes
|
||||
#tar -X /tmp/xcat-excludes -cf /opt/freeware/src/packages/SOURCES/xCAT-server-$VER.tar xCAT-server
|
||||
#gzip -f /opt/freeware/src/packages/SOURCES/xCAT-server-$VER.tar
|
||||
#cd ./xCAT-server
|
||||
#rm -f /opt/freeware/src/packages/SRPMS/xCAT-server-$VER*rpm /opt/freeware/src/packages/RPMS/ppc/xCAT-server-$VER*rpm
|
||||
#rpm -ba xCAT-server.spec
|
||||
#rpm -Uvh /opt/freeware/src/packages/RPMS/ppc/xCAT-server-$VER*rpm
|
||||
#tar -X /tmp/xcat-excludes -cf /opt/freeware/src/packages/SOURCES/xCAT-server-$VER.tar xCAT-server
|
||||
#gzip -f /opt/freeware/src/packages/SOURCES/xCAT-server-$VER.tar
|
||||
#cd ./xCAT-server
|
||||
#rm -f /opt/freeware/src/packages/SRPMS/xCAT-server-$VER*rpm /opt/freeware/src/packages/RPMS/ppc/xCAT-server-$VER*rpm
|
||||
#rpm -ba xCAT-server.spec
|
||||
#rpm -Uvh /opt/freeware/src/packages/RPMS/ppc/xCAT-server-$VER*rpm
|
||||
|
||||
source=/opt/freeware/src/packages
|
||||
source=/opt/freeware/src/packages
|
||||
echo '.svn' > /tmp/xcat-excludes
|
||||
tar -X /tmp/xcat-excludes -cf $source/SOURCES/xCAT-server-$VER.tar xCAT-server
|
||||
gzip -f $source/SOURCES/xCAT-server-$VER.tar
|
||||
rm -f $source/SRPMS/xCAT-server-$VER*rpm $source/RPMS/ppc/xCAT-server-$VER*rpm
|
||||
rpm -ba xCAT-server/xCAT-server.spec
|
||||
#rpm -ta $source/SOURCES/xCAT-server-$VER.tar.gz
|
||||
tar -X /tmp/xcat-excludes -cf $source/SOURCES/xCAT-server-$VER.tar xCAT-server
|
||||
gzip -f $source/SOURCES/xCAT-server-$VER.tar
|
||||
rm -f $source/SRPMS/xCAT-server-$VER*rpm $source/RPMS/ppc/xCAT-server-$VER*rpm
|
||||
rpm -ba xCAT-server/xCAT-server.spec
|
||||
#rpm -ta $source/SOURCES/xCAT-server-$VER.tar.gz
|
||||
|
||||
else
|
||||
|
||||
if [ -f /etc/redhat-release ]
|
||||
rpmbuild --version > /dev/null
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
pkg="redhat"
|
||||
else
|
||||
pkg="packages"
|
||||
echo "Error: Is rpmbuild installed and working?"
|
||||
exit 1
|
||||
fi
|
||||
RPMROOT=`rpmbuild --eval '%_topdir' xCATsn/xCATsn.spec`
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
echo "Could not determine rpmbuild's root"
|
||||
exit 1
|
||||
fi
|
||||
echo "The location for rpm building is ${RPMROOT}"
|
||||
|
||||
tar --exclude .svn -czf $RPMROOT/SOURCES/xCAT-server-$VER.tar.gz xCAT-server
|
||||
rm -f $RPMROOT/SRPMS/xCAT-server-$VER*rpm $RPMROOT/RPMS/noarch/xCAT-server-$VER*rpm
|
||||
rpmbuild -ta $RPMROOT/SOURCES/xCAT-server-$VER.tar.gz
|
||||
#rpm -Uvh $RPMROOT/RPMS/noarch/xCAT-server-$VER*rpm
|
||||
|
||||
tar --exclude .svn -czf /usr/src/$pkg/SOURCES/xCAT-server-$VER.tar.gz xCAT-server
|
||||
rm -f /usr/src/$pkg/SRPMS/xCAT-server-$VER*rpm /usr/src/$pkg/RPMS/noarch/xCAT-server-$VER*rpm
|
||||
rpmbuild -ta /usr/src/$pkg/SOURCES/xCAT-server-$VER.tar.gz
|
||||
#rpm -Uvh /usr/src/$pkg/RPMS/noarch/xCAT-server-$VER*rpm
|
||||
fi
|
||||
|
||||
+36
-28
@@ -6,45 +6,53 @@ VER=`cat Version`
|
||||
if [ "$OSNAME" = "AIX" ]
|
||||
then
|
||||
|
||||
cd `dirname $0`/xCAT
|
||||
echo '.svn' > /tmp/xcat-excludes
|
||||
echo 'upflag' >> /tmp/xcat-excludes
|
||||
cd `dirname $0`/xCAT
|
||||
echo '.svn' > /tmp/xcat-excludes
|
||||
echo 'upflag' >> /tmp/xcat-excludes
|
||||
|
||||
tar -X /tmp/xcat-excludes -cf /opt/freeware/src/packages/SOURCES/postscripts.tar postscripts LICENSE.html
|
||||
gzip -f /opt/freeware/src/packages/SOURCES/postscripts.tar
|
||||
tar -X /tmp/xcat-excludes -cf /opt/freeware/src/packages/SOURCES/postscripts.tar postscripts LICENSE.html
|
||||
gzip -f /opt/freeware/src/packages/SOURCES/postscripts.tar
|
||||
|
||||
tar -X /tmp/xcat-excludes -cf /opt/freeware/src/packages/SOURCES/templates.tar templates
|
||||
gzip -f /opt/freeware/src/packages/SOURCES/templates.tar
|
||||
tar -X /tmp/xcat-excludes -cf /opt/freeware/src/packages/SOURCES/templates.tar templates
|
||||
gzip -f /opt/freeware/src/packages/SOURCES/templates.tar
|
||||
|
||||
cp xcat.conf /opt/freeware/src/packages/SOURCES
|
||||
cp xCATMN /opt/freeware/src/packages/SOURCES
|
||||
cp xcat.conf /opt/freeware/src/packages/SOURCES
|
||||
cp xCATMN /opt/freeware/src/packages/SOURCES
|
||||
|
||||
rm -f /opt/freeware/src/packages/SRPMS/xCAT-$VER*rpm /opt/freeware/src/packages/RPMS/ppc/xCAT-$VER*rpm
|
||||
cd -
|
||||
rm -f /opt/freeware/src/packages/SRPMS/xCAT-$VER*rpm /opt/freeware/src/packages/RPMS/ppc/xCAT-$VER*rpm
|
||||
cd -
|
||||
|
||||
rpm -ba xCAT/xCAT.spec
|
||||
#rpm -Uvh /opt/freeware/src/packages/RPMS/ppc/xCAT-$VER*rpm
|
||||
rpm -ba xCAT/xCAT.spec
|
||||
#rpm -Uvh /opt/freeware/src/packages/RPMS/ppc/xCAT-$VER*rpm
|
||||
|
||||
else
|
||||
|
||||
if [ -f /etc/redhat-release ]
|
||||
rpmbuild --version > /dev/null
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
pkg="redhat"
|
||||
else
|
||||
pkg="packages"
|
||||
echo "Error: Is rpmbuild installed and working?"
|
||||
exit 1
|
||||
fi
|
||||
RPMROOT=`rpmbuild --eval '%_topdir' xCATsn/xCATsn.spec`
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
echo "Could not determine rpmbuild's root"
|
||||
exit 1
|
||||
fi
|
||||
echo "The location for rpm building is ${RPMROOT}"
|
||||
|
||||
cd `dirname $0`/xCAT
|
||||
tar --exclude .svn -czf /usr/src/$pkg/SOURCES/postscripts.tar.gz postscripts LICENSE.html
|
||||
tar --exclude .svn -czf /usr/src/$pkg/SOURCES/prescripts.tar.gz prescripts
|
||||
tar --exclude .svn -czf /usr/src/$pkg/SOURCES/templates.tar.gz templates
|
||||
cp xcat.conf /usr/src/$pkg/SOURCES
|
||||
cp xCATMN /usr/src/$pkg/SOURCES
|
||||
tar --exclude .svn -czf $RPMROOT/SOURCES/postscripts.tar.gz postscripts LICENSE.html
|
||||
tar --exclude .svn -czf $RPMROOT/SOURCES/prescripts.tar.gz prescripts
|
||||
tar --exclude .svn -czf $RPMROOT/SOURCES/templates.tar.gz templates
|
||||
cp xcat.conf $RPMROOT/SOURCES
|
||||
cp xCATMN $RPMROOT/SOURCES
|
||||
cd -
|
||||
rm -f /usr/src/$pkg/SRPMS/xCAT-$VER*rpm /usr/src/$pkg/RPMS/*/xCAT-$VER*rpm
|
||||
if [ ! -z "$1" ]; then
|
||||
rpmbuild -ba xCAT/xCAT.spec --target $1
|
||||
else
|
||||
rpmbuild -ba xCAT/xCAT.spec
|
||||
fi
|
||||
rm -f $RPMROOT/SRPMS/xCAT-$VER*rpm $RPMROOT/RPMS/*/xCAT-$VER*rpm
|
||||
if [ ! -z "$1" ]; then
|
||||
rpmbuild -ba xCAT/xCAT.spec --target $1
|
||||
else
|
||||
rpmbuild -ba xCAT/xCAT.spec
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
+32
-23
@@ -5,41 +5,50 @@ VER=`cat Version`
|
||||
|
||||
if [ "$OSNAME" = "AIX" ]
|
||||
then
|
||||
cd `dirname $0`/xCATsn
|
||||
echo '.svn' > /tmp/xcat-excludes
|
||||
|
||||
cd `dirname $0`/xCATsn
|
||||
echo '.svn' > /tmp/xcat-excludes
|
||||
echo 'upflag' >> /tmp/xcat-excludes
|
||||
|
||||
tar -X /tmp/xcat-excludes -cf /opt/freeware/src/packages/SOURCES/license.tar LICENSE.html
|
||||
gzip -f /opt/freeware/src/packages/SOURCES/license.tar
|
||||
tar -X /tmp/xcat-excludes -cf /opt/freeware/src/packages/SOURCES/license.tar LICENSE.html
|
||||
gzip -f /opt/freeware/src/packages/SOURCES/license.tar
|
||||
|
||||
# cp xcat.conf /opt/freeware/src/packages/SOURCES
|
||||
# cp xCATSN /usr/src/$pkg/SOURCES
|
||||
#cp xcat.conf /opt/freeware/src/packages/SOURCES
|
||||
#cp xCATSN /usr/src/$pkg/SOURCES
|
||||
|
||||
cp xCATSN /opt/freeware/src/packages/SOURCES
|
||||
rm -f /opt/freeware/src/packages/SRPMS/xCATsn-$VER*rpm /opt/freeware/src/packages/RPMS/ppc/xCATsn-$VER*rpm
|
||||
cd -
|
||||
rm -f /opt/freeware/src/packages/SRPMS/xCATsn-$VER*rpm /opt/freeware/src/packages/RPMS/ppc/xCATsn-$VER*rpm
|
||||
cd -
|
||||
|
||||
rpm -ba xCATsn/xCATsn.spec
|
||||
#rpm -Uvh /opt/freeware/src/packages/RPMS/ppc/xCATsn-$VER*rpm
|
||||
rpm -ba xCATsn/xCATsn.spec
|
||||
#rpm -Uvh /opt/freeware/src/packages/RPMS/ppc/xCATsn-$VER*rpm
|
||||
|
||||
else
|
||||
|
||||
if [ -f /etc/redhat-release ]
|
||||
rpmbuild --version > /dev/null
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
pkg="redhat"
|
||||
else
|
||||
pkg="packages"
|
||||
echo "Error: Is rpmbuild installed and working?"
|
||||
exit 1
|
||||
fi
|
||||
RPMROOT=`rpmbuild --eval '%_topdir' xCATsn/xCATsn.spec`
|
||||
if [ $? -gt 0 ]
|
||||
then
|
||||
echo "Could not determine rpmbuild's root"
|
||||
exit 1
|
||||
fi
|
||||
echo "The location for rpm building is ${RPMROOT}"
|
||||
|
||||
cd `dirname $0`/xCATsn
|
||||
tar --exclude .svn -czf /usr/src/$pkg/SOURCES/license.tar.gz LICENSE.html
|
||||
cp xcat.conf /usr/src/$pkg/SOURCES
|
||||
cp xCATSN /usr/src/$pkg/SOURCES
|
||||
rm -f /usr/src/$pkg/SRPMS/xCATsn-$VER*rpm /usr/src/$pkg/RPMS/*/xCATsn-$VER*rpm
|
||||
tar --exclude .svn -czf $RPMROOT/SOURCES/license.tar.gz LICENSE.html
|
||||
cp xcat.conf $RPMROOT/SOURCES
|
||||
cp xCATSN $RPMROOT/SOURCES
|
||||
rm -f $RPMROOT/SRPMS/xCATsn-$VER*rpm $RPMROOT/RPMS/*/xCATsn-$VER*rpm
|
||||
cd -
|
||||
if [ ! -z "$1" ]; then
|
||||
rpmbuild -ba xCATsn/xCATsn.spec --target $1
|
||||
else
|
||||
rpmbuild -ba xCATsn/xCATsn.spec
|
||||
fi
|
||||
if [ ! -z "$1" ]; then
|
||||
rpmbuild -ba xCATsn/xCATsn.spec --target $1
|
||||
else
|
||||
rpmbuild -ba xCATsn/xCATsn.spec
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
+4
-1
@@ -20,6 +20,8 @@ my $poddir = 'pods';
|
||||
my $mandir = 'share/man';
|
||||
my $htmldir = 'share/doc';
|
||||
my $cachedir = '/tmp';
|
||||
my $isaix = ($^O =~ /^aix/i);
|
||||
my $skiponaix = 'route|group';
|
||||
|
||||
my $poddir5 = 'pods/man5';
|
||||
my $poddir7 = 'pods/man7';
|
||||
@@ -30,7 +32,7 @@ if (system("mkdir -p $poddir7")) { die "Error: could not create $poddir7.\n"; }
|
||||
print "Building PODs pages for the database tables...\n";
|
||||
writesummarypage("$poddir5/xcatdb.5.pod", xCAT::Table->getDescriptions(), \%{xCAT::Schema::defspec});
|
||||
|
||||
# Build the pad man page for each object definition
|
||||
# Build the pod man page for each object definition
|
||||
my $defspecref = \%{xCAT::Schema::defspec};
|
||||
foreach my $defkey (keys %$defspecref) {
|
||||
my $def = $defspecref->{$defkey};
|
||||
@@ -55,6 +57,7 @@ my @pods = getPodList($poddir);
|
||||
#mkdir($mandir) or die "Error: could not create $mandir.\n";
|
||||
print "Converting PODs to man pages...\n";
|
||||
foreach my $podfile (@pods) {
|
||||
if ($isaix && grep(/\/($skiponaix)\.\d\.pod$/, $podfile)) { print "Skipping $podfile\n"; next; }
|
||||
my $manfile = $podfile;
|
||||
$manfile =~ s/^$poddir/$mandir/; # change the beginning of the path
|
||||
$manfile =~ s/\.pod$//; # change the ending
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
perl-xcat (2.0-2) testing; urgency=low
|
||||
perl-xcat (2.5.0-2) stable; urgency=low
|
||||
|
||||
* post-release snap
|
||||
* Initial Debian build
|
||||
|
||||
-- Isaac Freeman <ifreeman@us.ibm.com> Mon, 16 Jun 2008 15:35:15 -0400
|
||||
-- Mark Hamzy <hamzy@us.ibm.com> Fri, 29 Apr 2011 14:40:34 -0500
|
||||
|
||||
perl-xcat (2.0-1) lenny; urgency=low
|
||||
perl-xcat (2.5.0-1) stable; urgency=low
|
||||
|
||||
* Initial release
|
||||
|
||||
-- Isaac Freeman <ifreeman@us.ibm.com> Thu, 08 May 2008 13:14:33 -0400
|
||||
* Initial Release
|
||||
|
||||
-- OCF xCAT <xcat@ocf.co.uk> Mon, 25 oct 2010 09:00:00 -0000
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
Source: perl-xcat
|
||||
Section: libs
|
||||
Priority: extra
|
||||
Maintainer: Isaac Freeman <ifreeman@us.ibm.com>
|
||||
Build-Depends: debhelper (>= 5), libdbi-perl
|
||||
Maintainer: Arif Ali <aali@ocf.co.uk>
|
||||
Build-Depends: debhelper (>= 5), libsoap-lite-perl
|
||||
Standards-Version: 3.7.2
|
||||
|
||||
Package: perl-xcat
|
||||
Architecture: any
|
||||
Depends: ${perl:Depends}, libio-socket-ssl-perl, libxml-simple-perl, libstorable-perl, libsys-syslog-perl, libsnmp-perl, libdbi-perl
|
||||
Architecture: all
|
||||
Depends: ${perl:Depends}
|
||||
Description: xCAT perl libraries
|
||||
Provides perl xCAT libraries for core functionality. Required for all xCAT installations.
|
||||
Includes xCAT::Table, xCAT::NodeRange, among others.
|
||||
|
||||
@@ -1,2 +1,7 @@
|
||||
usr/lib/perl5/xCAT
|
||||
usr/lib/perl5/xCAT/data
|
||||
opt/xcat/lib/perl/xCAT
|
||||
opt/xcat/lib/perl/xCAT/data
|
||||
opt/xcat/share/doc/packages/perl-xCAT
|
||||
opt/xcat/share/man/man5
|
||||
opt/xcat/share/doc/man5
|
||||
opt/xcat/share/man/man7
|
||||
opt/xcat/share/doc/man7
|
||||
|
||||
@@ -14,6 +14,7 @@ export DH_COMPAT=5
|
||||
|
||||
build:
|
||||
dh_testdir
|
||||
./modifyUtils 2.5.0
|
||||
./db2man
|
||||
|
||||
clean:
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#!/bin/sh
|
||||
# Put the version, svn revision #, and build date into the Version function in Utils.pm
|
||||
# Put the version, svn revision #, and build date into the Version function in Version.pm
|
||||
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
echo "modifyUtils: Error: must specify the xCAT version as an argument!"
|
||||
echo "modifyVersion: Error: must specify the xCAT version as an argument!"
|
||||
exit
|
||||
fi
|
||||
VER=$1
|
||||
@@ -24,8 +24,8 @@ BUILDDATE=`date`
|
||||
|
||||
if [ "$(uname)" = "AIX" ]
|
||||
then
|
||||
sed -e s/"#XCATVERSIONSUBHERE"/". '$VER'"/ -e s/"#XCATSVNBUILDSUBHERE"/". ' (${SVNREF}built $BUILDDATE)'"/ xCAT/Utils.pm >xCAT/Utils.pm.new
|
||||
mv xCAT/Utils.pm.new xCAT/Utils.pm
|
||||
sed -e s/"#XCATVERSIONSUBHERE"/". '$VER'"/ -e s/"#XCATSVNBUILDSUBHERE"/". ' (${SVNREF}built $BUILDDATE)'"/ xCAT/Version.pm >xCAT/Version.pm.new
|
||||
mv xCAT/Version.pm.new xCAT/Version.pm
|
||||
else
|
||||
sed -i -e s/"#XCATVERSIONSUBHERE"/". '$VER'"/ -e s/"#XCATSVNBUILDSUBHERE"/". ' (${SVNREF}built $BUILDDATE)'"/ xCAT/Utils.pm
|
||||
sed -i -e s/"#XCATVERSIONSUBHERE"/". '$VER'"/ -e s/"#XCATSVNBUILDSUBHERE"/". ' (${SVNREF}built $BUILDDATE)'"/ xCAT/Version.pm
|
||||
fi
|
||||
|
||||
@@ -20,6 +20,7 @@ use strict;
|
||||
|
||||
# IPv6 not yet implemented - need Socket6
|
||||
use Socket;
|
||||
my @tabletype = qw(ppc zvm);
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
@@ -2106,8 +2107,10 @@ sub getchildren
|
||||
my $p = $entry->{parent};
|
||||
my $c = $entry->{node};
|
||||
if ( $p and $c) {
|
||||
my $type = $ppctab->getNodeAttribs($c, ["nodetype"]);
|
||||
if ( $type and ($type->{nodetype} eq 'fsp') or ($type->{nodetype} eq 'bpa'))
|
||||
#my $type = $ppctab->getNodeAttribs($c, ["nodetype"]);
|
||||
my $type = getnodetype($c);
|
||||
#if ( $type and ($type->{nodetype} eq 'fsp') or ($type->{nodetype} eq 'bpa'))
|
||||
if ( $type eq 'fsp' or $type eq 'bpa')
|
||||
{
|
||||
push @{$::PARENT_CHILDREN{$p}}, $c;
|
||||
}
|
||||
@@ -2176,65 +2179,94 @@ sub getnodetype
|
||||
{
|
||||
$nodes = shift;
|
||||
}
|
||||
my $rsp;
|
||||
|
||||
my $ppctab = xCAT::Table->new( 'ppc' );
|
||||
if ( !$ppctab ) {
|
||||
my $rsp;
|
||||
$rsp->{data}->[0] = "Could not open the ppc table.";
|
||||
xCAT::MsgUtils->message("E", $rsp, $::callback);
|
||||
}
|
||||
my $nodetypetab = xCAT::Table->new( 'nodetype' );
|
||||
if ( !$nodetypetab )
|
||||
{
|
||||
my $rsp;
|
||||
$rsp->{data}->[0] = "Could not open the nodetype table.";
|
||||
xCAT::MsgUtils->message("E", $rsp, $::callback);
|
||||
if ( !$ppctab ) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
my @types = ();
|
||||
my $typep;
|
||||
my $type;
|
||||
my %typehash;
|
||||
if ( $nodes =~ /^ARRAY/) {
|
||||
foreach ( @$nodes ) {
|
||||
if ( $ppctab ) {
|
||||
$typep = $ppctab->getNodeAttribs($_, ["nodetype"]);
|
||||
if ($typep and $typep->{nodetype}) {
|
||||
$type = $typep->{nodetype};
|
||||
push (@types, $type);
|
||||
next;
|
||||
my @nodetypes = $nodetypetab->getAllAttribs('node','nodetype');
|
||||
for my $tn( @nodetypes ) {
|
||||
$typehash{ $tn->{'node'} } = $tn->{'nodetype'};
|
||||
}
|
||||
for my $nn (@$nodes) {
|
||||
$type = $typehash{$nn};
|
||||
if ($type) {
|
||||
my $flag = 0;
|
||||
my @tablename;
|
||||
for my $tt ( split /,/, $type ) {
|
||||
if ( grep(/$tt/, @tabletype)) {
|
||||
@tablename = grep(/$tt/, @tabletype);
|
||||
$flag = 1;
|
||||
next;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( $nodetypetab ) {
|
||||
$typep = $nodetypetab->getNodeAttribs($_, ["nodetype"]);
|
||||
if ($typep and $typep->{nodetype}) {
|
||||
$type = $typep->{nodetype};
|
||||
unless ($flag) { # find type in nodetype table
|
||||
push (@types, $type);
|
||||
} else {
|
||||
my $tablehandler = xCAT::Table->new( $tablename[0] );
|
||||
if ( !$tablehandler ) {
|
||||
$rsp->{data}->[0] = "Could not open the $tablename[0] table.";
|
||||
xCAT::MsgUtils->message("E", $rsp, $::callback);
|
||||
push (@types, undef);
|
||||
next;
|
||||
}
|
||||
}
|
||||
push (@types, undef);
|
||||
}
|
||||
$typep = $tablehandler->getNodeAttribs($nn, ["nodetype"]); # find type in ppc table
|
||||
if ($typep and $typep->{nodetype}) {
|
||||
$type = $typep->{nodetype};
|
||||
push (@types, $type);
|
||||
} else {
|
||||
push (@types, undef);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
push (@types, undef);
|
||||
}
|
||||
}
|
||||
return \@types;
|
||||
} else {
|
||||
if ( $ppctab ) {
|
||||
$typep = $ppctab->getNodeAttribs($nodes, ["nodetype"]);
|
||||
if ( $typep and $typep->{nodetype} ) {
|
||||
$type = $typep->{nodetype};
|
||||
return $type;
|
||||
$typep = $nodetypetab->getNodeAttribs($nodes, ["nodetype"]);
|
||||
if ( $typep and $typep->{nodetype} ) {
|
||||
$type = $typep->{nodetype};
|
||||
my $flag = 0;
|
||||
my @tablename;
|
||||
for my $tt ( split /,/, $type ) {
|
||||
if ( grep(/$tt/, @tabletype)) {
|
||||
@tablename = grep(/$tt/, @tabletype);
|
||||
$flag = 1;
|
||||
next;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( $nodetypetab ) {
|
||||
$typep = $nodetypetab->getNodeAttribs($nodes, ["nodetype"]);
|
||||
if ( $typep and $typep->{nodetype} ) {
|
||||
$type = $typep->{nodetype};
|
||||
unless ($flag) { # find type in nodetype table
|
||||
return $type;
|
||||
} else { # find type in ppc table
|
||||
my $tablehandler = xCAT::Table->new( $tablename[0] );
|
||||
if ( !$tablehandler ) {
|
||||
$rsp->{data}->[0] = "Could not open the $tablename[0] table.";
|
||||
xCAT::MsgUtils->message("E", $rsp, $::callback);
|
||||
return undef;
|
||||
}
|
||||
$typep = $tablehandler->getNodeAttribs($nodes, ["nodetype"]);
|
||||
if ( $typep and $typep->{nodetype} ) {
|
||||
$type = $typep->{nodetype};
|
||||
return $type;
|
||||
} else {
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
@@ -2272,8 +2304,9 @@ sub getcecchildren
|
||||
my $p = $entry->{parent};
|
||||
my $c = $entry->{node};
|
||||
if ( $p and $c) {
|
||||
my $type = $ppctab->getNodeAttribs($c, ["nodetype"]);
|
||||
if ( $type and ($type->{nodetype} eq 'cec')) {
|
||||
#my $type = $ppctab->getNodeAttribs($c, ["nodetype"]);
|
||||
my $type = getnodetype($c);
|
||||
if ( $type eq 'cec') {
|
||||
push @{$::PARENT_CHILDREN_CEC{$p}}, $c;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ foreach (@extSchema) {
|
||||
my $modname = $1;
|
||||
no strict 'refs';
|
||||
my $warning;
|
||||
`logger -t xCAT processing $_`;
|
||||
# `logger -t xCAT processing $_`;
|
||||
eval {require($_)};
|
||||
if ($@) {
|
||||
$warning ="Warning: The user defined database table schema file $file cannot be located or has compiling errors.\n";
|
||||
|
||||
@@ -80,7 +80,6 @@ sub fsp_api_action {
|
||||
if( !defined($tooltype) ) {
|
||||
$tooltype = 0;
|
||||
}
|
||||
|
||||
$id = $$attrs[0];
|
||||
$fsp_name = $$attrs[3];
|
||||
|
||||
@@ -149,9 +148,15 @@ sub fsp_api_action {
|
||||
$cmd = "$fsp_api -a $action -T $tooltype -t $type:$fsp_ip:$id:$node_name: -d $install_dir/packages_fw/";
|
||||
} elsif($action =~ /^add_connection$/) {
|
||||
$cmd = "$fsp_api -a $action -u $user -p $password -T $tooltype -t $type:$fsp_ip:$id:$node_name:";
|
||||
} elsif ($action =~ /^set_frame_number$/) {
|
||||
$cmd = "$fsp_api -a $action -T $tooltype -f $parameter -t $type:$fsp_ip:$id:$node_name:";
|
||||
} else {
|
||||
if( defined($parameter) ) {
|
||||
$cmd = "$fsp_api -a $action -T $tooltype -t $type:$fsp_ip:$id:$node_name:$parameter";
|
||||
if ($action =~ /^set_(frame|cec|lpar)_name$/) {
|
||||
$cmd = "$fsp_api -a $action -n $parameter -T $tooltype -t $type:$fsp_ip:$id:$node_name:";
|
||||
} else {
|
||||
$cmd = "$fsp_api -a $action -T $tooltype -t $type:$fsp_ip:$id:$node_name:$parameter";
|
||||
}
|
||||
} else {
|
||||
$cmd = "$fsp_api -a $action -T $tooltype -t $type:$fsp_ip:$id:$node_name:";
|
||||
}
|
||||
|
||||
@@ -97,10 +97,11 @@ sub do_rnetboot {
|
||||
}
|
||||
}
|
||||
|
||||
my $mac = lc($opt->{m});
|
||||
#######################################
|
||||
# Network specified
|
||||
#######################################
|
||||
$cmd.= " -s auto -d auto -m $opt->{m} -S $opt->{S} -G $opt->{G} -C $opt->{C}";
|
||||
$cmd.= " -s auto -d auto -m \"$mac\" -S $opt->{S} -G $opt->{G} -C $opt->{C}";
|
||||
if ( exists( $opt->{o} )) {
|
||||
$cmd.= " -o";
|
||||
}
|
||||
|
||||
+497
-35
@@ -4,6 +4,8 @@ package xCAT::FSPcfg;
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
use xCAT::Usage;
|
||||
use xCAT::Utils;
|
||||
use xCAT::PPCcfg;
|
||||
#use Data::Dumper;
|
||||
#use xCAT::PPCcli;
|
||||
|
||||
@@ -11,8 +13,16 @@ use xCAT::Usage;
|
||||
##########################################
|
||||
# Globals
|
||||
##########################################
|
||||
my %rspconfig = (
|
||||
frame => \&frame,
|
||||
cec_off_policy => \&cec_off_policy,
|
||||
);
|
||||
|
||||
|
||||
my %default_passwd = (
|
||||
HMC => "",
|
||||
admin => "admin",
|
||||
general => "general",
|
||||
);
|
||||
|
||||
##########################################################################
|
||||
# Parse the command line for options and operands
|
||||
@@ -28,25 +38,36 @@ sub parse_args {
|
||||
"HMC_passwd",
|
||||
"admin_passwd",
|
||||
"general_passwd",
|
||||
"*_passwd"
|
||||
"*_passwd",
|
||||
"resetnet",
|
||||
);
|
||||
my @bpa = (
|
||||
"frame",
|
||||
"HMC_passwd",
|
||||
"admin_passwd",
|
||||
"general_passwd",
|
||||
"*_passwd"
|
||||
"*_passwd",
|
||||
"resetnet"
|
||||
);
|
||||
my @cec = (
|
||||
"HMC_passwd",
|
||||
"admin_passwd",
|
||||
"general_passwd",
|
||||
"*_passwd"
|
||||
"*_passwd",
|
||||
"cec_off_policy",
|
||||
"resetnet",
|
||||
"sysname",
|
||||
"pending_power_on_side"
|
||||
);
|
||||
my @frame = (
|
||||
"frame",
|
||||
"HMC_passwd",
|
||||
"admin_passwd",
|
||||
"general_passwd",
|
||||
"*_passwd"
|
||||
"*_passwd",
|
||||
"resetnet",
|
||||
"sysname",
|
||||
"pending_power_on_side"
|
||||
);
|
||||
|
||||
|
||||
@@ -59,18 +80,24 @@ sub parse_args {
|
||||
#############################################
|
||||
# Get support command list
|
||||
#############################################
|
||||
my $sitetab = xCAT::Table->new( 'nodetype' );
|
||||
#my $typetab = xCAT::Table->new( 'nodetype' );
|
||||
#my $nodes = $request->{node};
|
||||
#foreach (@$nodes) {
|
||||
# if ( defined( $typetab )) {
|
||||
# my ($ent) = $typetab->getAttribs({ node=>$_},'nodetype');
|
||||
# if ( defined($ent) ) {
|
||||
# $request->{hwtype} = $ent->{nodetype};
|
||||
# last;
|
||||
# }
|
||||
#
|
||||
# }
|
||||
#
|
||||
#}
|
||||
|
||||
my $nodes = $request->{node};
|
||||
foreach (@$nodes) {
|
||||
if ( defined( $sitetab )) {
|
||||
my ($ent) = $sitetab->getAttribs({ node=>$_},'nodetype');
|
||||
if ( defined($ent) ) {
|
||||
$request->{hwtype} = $ent->{nodetype};
|
||||
last;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
foreach my $nn (@$nodes) {
|
||||
$request->{hwtype} = xCAT::DBobjUtils->getnodetype($nn);
|
||||
last if ($request->{hwtype});
|
||||
}
|
||||
|
||||
my $supported = $rsp{$request->{hwtype}};
|
||||
@@ -98,7 +125,7 @@ sub parse_args {
|
||||
Getopt::Long::Configure( "bundling" );
|
||||
$request->{method} = undef;
|
||||
|
||||
if ( !GetOptions( \%opt, qw(V|Verbose) )) {
|
||||
if ( !GetOptions( \%opt, qw(V|Verbose resetnet))) {
|
||||
return( usage() );
|
||||
}
|
||||
####################################
|
||||
@@ -118,8 +145,17 @@ sub parse_args {
|
||||
####################################
|
||||
foreach my $arg ( @ARGV ) {
|
||||
my ($command,$value) = split( /=/, $arg );
|
||||
if ( !grep( /^$command$/, @$supported )) {
|
||||
return(usage( "Invalid command: $arg" ));
|
||||
if ( !grep( /^$command$/, @$supported) and !$opt{resetnet}) {
|
||||
my @enableASMI = xCAT::Utils->get_site_attribute("enableASMI");
|
||||
if (defined($enableASMI[0])) {
|
||||
$enableASMI[0] =~ tr/a-z/A-Z/; # convert to upper
|
||||
if (($enableASMI[0] eq "1") || ($enableASMI[0] eq "YES"))
|
||||
{
|
||||
$request->{enableASMI} = 1;
|
||||
return xCAT::PPCcfg::parse_args($request, @_);
|
||||
}
|
||||
}
|
||||
return(usage( "Invalid command for $request->{hwtype} : $arg" ));
|
||||
}
|
||||
if ( exists( $cmds{$command} )) {
|
||||
return(usage( "Command multiple times: $command" ));
|
||||
@@ -148,12 +184,25 @@ sub parse_args {
|
||||
####################################
|
||||
# Return method to invoke
|
||||
####################################
|
||||
#if ( exists($cmds{frame}) ) {
|
||||
# $request->{hcp} = "hmc";
|
||||
# $request->{method} = "cfg";
|
||||
# return( \%opt );
|
||||
#}
|
||||
#
|
||||
if ( exists($cmds{frame}) or exists($cmds{cec_off_policy})) {
|
||||
$request->{hcp} = (exists($cmds{frame})) ? "bpa" : "fsp";
|
||||
$request->{method} = "cfg";
|
||||
return( \%opt );
|
||||
}
|
||||
|
||||
####################################
|
||||
# Return method to invoke
|
||||
####################################
|
||||
if ( $opt{resetnet} ) {
|
||||
$request->{hcp} = "fsp";
|
||||
$request->{method} = "resetnet";
|
||||
return( \%opt );
|
||||
}
|
||||
if(exists($cmds{sysname}) or exists($cmds{pending_power_on_side})) {
|
||||
$request->{hcp} = $request->{hwtype} eq 'frame' ? "bpa":"fsp";
|
||||
$request->{method} = "do_fspapi_function";
|
||||
return (\%opt);
|
||||
}
|
||||
####################################
|
||||
# Return method to invoke
|
||||
####################################
|
||||
@@ -181,22 +230,200 @@ sub parse_option {
|
||||
####################################
|
||||
# Password
|
||||
####################################
|
||||
if ( $command eq 'admin_passwd' or $command eq 'general_passwd' or $command eq "*_passwd"){
|
||||
#if ( $command eq 'admin_passwd' or $command eq 'general_passwd' or $command eq "*_passwd"){
|
||||
# my ($passwd,$newpasswd) = split /,/, $value;
|
||||
# if ( !$passwd or !$newpasswd) {
|
||||
# return( "Current password and new password couldn't be empty for user 'admin' and 'general'" );
|
||||
# }
|
||||
#}
|
||||
|
||||
if ( $command eq 'HMC_passwd' or $command eq 'admin_passwd' or $command eq 'general_passwd' or $command eq "*_passwd" ) {
|
||||
my ($passwd,$newpasswd) = split /,/, $value;
|
||||
if ( !$passwd or !$newpasswd) {
|
||||
return( "Current password and new password couldn't be empty for user 'admin' and 'general'" );
|
||||
if ( !$newpasswd ) {
|
||||
return( "New password couldn't be empty for user 'HMC', 'admin' or 'general'" );
|
||||
}
|
||||
}
|
||||
|
||||
if ( $command eq 'HMC_passwd' ) {
|
||||
my ($passwd,$newpasswd) = split /,/, $value;
|
||||
if ( !$newpasswd ) {
|
||||
return( "New password couldn't be empty for user 'HMC'" );
|
||||
if ( $command eq 'frame' ){
|
||||
if ( $value !~ /^\d+$/i && $value ne '*' ) {
|
||||
return( "Invalid frame number '$value'" );
|
||||
}
|
||||
}
|
||||
|
||||
if ( $command eq 'cec_off_policy' ){
|
||||
if ( $value !~ /^poweroff$/i && $value !~ /^stayon$/i ) {
|
||||
return( "Invalid cec_off_policy '$value'" );
|
||||
}
|
||||
}
|
||||
if ($command eq 'sysname') {
|
||||
if ($value ne '*') {
|
||||
if ($value !~ /^[a-zA-Z0-9-_]+$/) {
|
||||
return( "Invalid sysname param '$value'" );
|
||||
} elsif (scalar(@{$request->{node}}) gt '1') {
|
||||
return( "Invalid sysname param '$value'" );
|
||||
}
|
||||
my $len = rindex $value."\$", "\$";
|
||||
if ($len > '31') {
|
||||
return ("Invalid sysname param '$value', name is too long, max 31 characters");
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($command eq 'pending_power_on_side') {
|
||||
if ($value !~ /^(temp|perm)$/) {
|
||||
return ("Invalid pending_power_on_side param '$value'");
|
||||
}
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
sub check_node_info {
|
||||
my $hash = shift;
|
||||
my $invalid_node = undef;
|
||||
while (my ($mtsm, $h) = each (%$hash)) {
|
||||
while (my ($name, $d) = each(%$h)) {
|
||||
if (@$d[4] !~ /^(cec|frame)$/) {
|
||||
$invalid_node = $name;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $invalid_node;
|
||||
}
|
||||
|
||||
my %fspapi_action = (
|
||||
sysname => {
|
||||
query => {
|
||||
cec => "get_cec_name",
|
||||
frame => "get_frame_name"
|
||||
},
|
||||
set => {
|
||||
cec => "set_cec_name",
|
||||
frame => "set_frame_name"
|
||||
}
|
||||
},
|
||||
pending_power_on_side => {
|
||||
query => {
|
||||
cec => "list_firmware_level",
|
||||
frame => "list_firmware_level"
|
||||
},
|
||||
set => {
|
||||
cec => "set_ipl_param",
|
||||
frame => "set_ipl_param"
|
||||
}
|
||||
}
|
||||
);
|
||||
sub do_process_query_res {
|
||||
my $name = shift;
|
||||
my $cmd = shift;
|
||||
my $result = shift;
|
||||
my $res = shift;
|
||||
if ($cmd =~ /^sysname$/) {
|
||||
push @$result, $res;
|
||||
if (@$res[2] != 0) {
|
||||
return "Error";
|
||||
}
|
||||
} elsif($cmd =~ /^pending_power_on_side$/) {
|
||||
if (@$res[2] != 0) {
|
||||
push @$result, $res;
|
||||
return "Error";
|
||||
} else {
|
||||
my @values = split(/\n/, @$res[1]);
|
||||
foreach my $v (@values) {
|
||||
if ($v =~ /pend_power_on_side_(\w+)=(temp|perm),/) {
|
||||
push @$result, [$name, "Pending Power On Side \L\u$1: $2", '0'];
|
||||
} else {
|
||||
push @$result, [$name, $v, '1'];
|
||||
return "Error";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
sub do_query {
|
||||
my $request = shift;
|
||||
my $hash = shift;
|
||||
my $cmd = shift;
|
||||
my @result = ();
|
||||
while (my ($mtms, $h) = each(%$hash)) {
|
||||
while (my($name, $d) = each(%$h)) {
|
||||
my $action = $fspapi_action{$cmd}{query}{@$d[4]};
|
||||
my $values = xCAT::FSPUtils::fsp_api_action($name, $d, $action);
|
||||
my $res = &do_process_query_res($name, $cmd, \@result, $values);
|
||||
if (defined($res)) {
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
return (\@result);
|
||||
}
|
||||
sub do_set_get_para {
|
||||
my $node_name = shift;
|
||||
my $cmd = shift;
|
||||
my $value = shift;
|
||||
if ($cmd =~ /^sysname$/) {
|
||||
return (($value eq '*') ? $node_name : $value);
|
||||
} elsif ($cmd =~ /^pending_power_on_side$/){
|
||||
return ($value =~ /^perm$/) ? '0' : '1';
|
||||
}
|
||||
}
|
||||
|
||||
sub do_process_set_res {
|
||||
my $name = shift;
|
||||
my $cmd = shift;
|
||||
my $result = shift;
|
||||
my $res = shift;
|
||||
if (@$res[1] && @$res[1] !~ /success/i) {
|
||||
push @$result, $res;
|
||||
return "Error";
|
||||
} else {
|
||||
push @$result, [$name, "Success", 0];
|
||||
}
|
||||
}
|
||||
sub do_set {
|
||||
my $request = shift;
|
||||
my $hash = shift;
|
||||
my $cmd = shift;
|
||||
my $value = shift;
|
||||
my @result = ();
|
||||
while (my ($mtms, $h) = each(%$hash)) {
|
||||
while (my($name, $d) = each(%$h)) {
|
||||
my $action = $fspapi_action{$cmd}{set}{@$d[4]};
|
||||
my $para = &do_set_get_para($name, $cmd, $value);
|
||||
my $values = xCAT::FSPUtils::fsp_api_action($name, $d, $action, 0, $para);
|
||||
# print Dumper($values);
|
||||
my $res = &do_process_set_res($name, $cmd, \@result, $values);
|
||||
if (defined($res)) {
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
return (\@result);
|
||||
}
|
||||
sub do_fspapi_function {
|
||||
my $request = shift;
|
||||
my $hash = shift;
|
||||
my $exp = shift;
|
||||
my @ret = ();
|
||||
my $res;
|
||||
my $args = $request->{arg};
|
||||
my $invalid_node = &check_node_info($hash);
|
||||
if (defined($invalid_node)) {
|
||||
return ([[$invalid_node, "Node must be CEC or Frame", '1']]);
|
||||
}
|
||||
foreach my $arg (@$args) {
|
||||
my ($cmd, $value) = split /=/, $arg;
|
||||
if ($cmd !~ /^(sysname|pending_power_on_side)$/) {
|
||||
return ([["Error", "'$cmd' can not execute with 'sysname' or 'pending_power_on_side'", '1']]);
|
||||
}
|
||||
if ($value) {
|
||||
$res = &do_set($request, $hash, $cmd, $value)
|
||||
} else {
|
||||
$res = &do_query($request, $hash, $cmd);
|
||||
}
|
||||
push @ret, @$res;
|
||||
}
|
||||
return \@ret;
|
||||
}
|
||||
##########################################################################
|
||||
# Update passwords for different users on FSP/BPA
|
||||
##########################################################################
|
||||
@@ -209,13 +436,21 @@ sub passwd {
|
||||
my $user = ();
|
||||
my $users = ();
|
||||
my @output = ();
|
||||
my $default;
|
||||
|
||||
foreach my $arg ( @$args ) {
|
||||
my ($user,$value) = split /=/, $arg;
|
||||
if ($user !~ /_passwd$/) {
|
||||
return ([["Error", "'$user' can not execute with '*_passwd' commands", '1']]);
|
||||
}
|
||||
my ($passwd,$newpasswd) = split /,/, $value;
|
||||
$user =~ s/_passwd$//;
|
||||
#$user =~ s/^HMC$/access/g;
|
||||
|
||||
|
||||
if( !$passwd) {
|
||||
$default = 1;
|
||||
}
|
||||
|
||||
if ( $user eq "*" ) {
|
||||
push @$users, "HMC";
|
||||
push @$users, "admin";
|
||||
@@ -225,7 +460,10 @@ sub passwd {
|
||||
}
|
||||
|
||||
foreach my $usr ( @$users ) {
|
||||
|
||||
if( $default == 1 ) {
|
||||
$passwd = $default_passwd{$usr};
|
||||
}
|
||||
|
||||
while ( my ($cec,$h) = each(%$hash) ) {
|
||||
while ( my ($node,$d) = each(%$h) ) {
|
||||
my $type = @$d[4];
|
||||
@@ -252,6 +490,215 @@ sub passwd {
|
||||
return( \@output );
|
||||
}
|
||||
|
||||
##########################################################################
|
||||
# Handles all PPC rspconfig commands
|
||||
##########################################################################
|
||||
sub cfg {
|
||||
|
||||
my $request = shift;
|
||||
my $hash = shift;
|
||||
my $exp = shift;
|
||||
my $args = $request->{arg};
|
||||
my $result;
|
||||
|
||||
foreach ( @$args ) {
|
||||
##################################
|
||||
# Ignore switches in command-line
|
||||
##################################
|
||||
unless ( /^-/ ) {
|
||||
my ($cmd,$value) = split /=/;
|
||||
if ($cmd !~ /(frame|cec_off_policy)/) {
|
||||
return ([["Error", "'$cmd' can not execute with 'frame' or 'cec_off_policy'", '1']]);
|
||||
}
|
||||
|
||||
no strict 'refs';
|
||||
$result = $rspconfig{$cmd}( $request, $value, $hash );
|
||||
use strict;
|
||||
}
|
||||
}
|
||||
return( $result );
|
||||
}
|
||||
|
||||
sub frame {
|
||||
my $request = shift;
|
||||
my $value = shift;
|
||||
my $hash = shift;
|
||||
my $arg = $request->{arg};
|
||||
|
||||
foreach ( @$arg ) {
|
||||
my $result;
|
||||
my $Rc;
|
||||
my $data;
|
||||
|
||||
my ($cmd, $value) = split /=/, $_;
|
||||
if ( $cmd ne "frame" ) {
|
||||
return( [["Error","Multiple option $cmd and frame is not accepted", -1]] );
|
||||
}
|
||||
|
||||
#################################
|
||||
# Open xCAT database to sync with
|
||||
# the frame number between hcp
|
||||
# and database
|
||||
#################################
|
||||
my $tab = xCAT::Table->new( "ppc" );
|
||||
|
||||
while ( my ($cec,$h) = each(%$hash) ) {
|
||||
while ( my ($node,$d) = each(%$h) ) {
|
||||
if ( !defined($value) ) {
|
||||
|
||||
#################################
|
||||
# Get frame number
|
||||
#################################
|
||||
#$data = xCAT::PPCcli::lssyscfg( $exp, @$d[4], @$d[2], 'frame_num' );
|
||||
$data = xCAT::FSPUtils::fsp_api_action( $node, $d, "get_frame_number");
|
||||
$Rc = pop(@$data);
|
||||
|
||||
#################################
|
||||
# Return error
|
||||
#################################
|
||||
if ( $Rc != 0 ) {
|
||||
return( [[$node,@$data[1],$Rc]] );
|
||||
}
|
||||
|
||||
push @$result, [$node,@$data[1], 0];
|
||||
|
||||
#################################
|
||||
# Set frame number to database
|
||||
#################################
|
||||
$tab->setNodeAttribs( $node, { id=>@$data[1] } );
|
||||
|
||||
} elsif ( $value eq '*' ) {
|
||||
#################################
|
||||
# Set frame number
|
||||
# Read the settings from database
|
||||
#################################
|
||||
my $ent=$tab->getNodeAttribs( $node,['id'] );
|
||||
|
||||
#################################
|
||||
# Return error
|
||||
#################################
|
||||
if ( !defined($ent) or !defined($ent->{id}) ) {
|
||||
return( [[$node,"Cannot find frame num in database", -1]] );
|
||||
}
|
||||
#$data = xCAT::PPCcli::chsyscfg( $exp, "bpa", $d, "frame_num=".$ent->{id} );
|
||||
$data = xCAT::FSPUtils::fsp_api_action( $node, $d, "set_frame_number", 0, $ent->{id});
|
||||
$Rc = pop(@$data);
|
||||
|
||||
#################################
|
||||
# Return error
|
||||
#################################
|
||||
if ( $Rc != 0 ) {
|
||||
return( [[$node,@$data[1],$Rc]] );
|
||||
}
|
||||
|
||||
push @$result, [$node,@$data[1], 0];
|
||||
push @$result, [$node,"It will take several minutes to complete. So please wait for several minutes, then the other operations could be done. Otherwise, the other operation will fail.", 0];
|
||||
|
||||
} else {
|
||||
#################################
|
||||
# Set frame number
|
||||
# Read the frame number from opt
|
||||
#################################
|
||||
#$data = xCAT::PPCcli::chsyscfg( $exp, "bpa", $d, "frame_num=$value" );
|
||||
$data = xCAT::FSPUtils::fsp_api_action( $node, $d, "set_frame_number", 0, $value);
|
||||
$Rc = pop(@$data);
|
||||
|
||||
#################################
|
||||
# Return error
|
||||
#################################
|
||||
if ( $Rc != 0 ) {
|
||||
return( [[$node,@$data[1],$Rc]] );
|
||||
}
|
||||
|
||||
push @$result, [$node,@$data[1],0];
|
||||
push @$result, [$node,"It will take several minutes to complete. So please wait for several minutes, then the other operations could be done. Otherwise, the other operation will fail.", 0];
|
||||
|
||||
#################################
|
||||
# Set frame number to database
|
||||
#################################
|
||||
$tab->setNodeAttribs( $node, { id=>$value } );
|
||||
}
|
||||
}
|
||||
|
||||
return( [@$result] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub cec_off_policy {
|
||||
my $request = shift;
|
||||
my $value = shift;
|
||||
my $hash = shift;
|
||||
my $arg = $request->{arg};
|
||||
|
||||
foreach ( @$arg ) {
|
||||
my $result;
|
||||
my $Rc;
|
||||
my $data;
|
||||
|
||||
my ($cmd, $value) = split /=/, $_;
|
||||
if ( $cmd ne "cec_off_policy" ) {
|
||||
return( [["Error","Multiple option $cmd and cec is not accepted", -1]] );
|
||||
}
|
||||
|
||||
while ( my ($cec,$h) = each(%$hash) ) {
|
||||
while ( my ($node,$d) = each(%$h) ) {
|
||||
if ( !defined($value) ) {
|
||||
|
||||
#################################
|
||||
# Get platform IPL parameters
|
||||
#################################
|
||||
$data = xCAT::FSPUtils::fsp_api_action( $node, $d, "get_phyp_cfg_power_off_policy");
|
||||
$Rc = pop(@$data);
|
||||
|
||||
#################################
|
||||
# Return error
|
||||
#################################
|
||||
if ( $Rc != 0 ) {
|
||||
return( [[$node,@$data[1],$Rc]] );
|
||||
}
|
||||
|
||||
@$data[1] =~ /cec_off_policy=(\w*);/;
|
||||
|
||||
push @$result, [$node, $1, 0];
|
||||
|
||||
|
||||
} else {
|
||||
#################################
|
||||
# Set cec off policy
|
||||
#################################
|
||||
if( $value eq "poweroff") {
|
||||
$value = "cec_off_policy_poweroff";
|
||||
} else {
|
||||
$value = "cec_off_policy_stayon";
|
||||
}
|
||||
$data = xCAT::FSPUtils::fsp_api_action( $node, $d, $value);
|
||||
$Rc = pop(@$data);
|
||||
|
||||
#################################
|
||||
# Return error
|
||||
#################################
|
||||
if ( $Rc != 0 ) {
|
||||
return( [[$node,@$data[1],$Rc]] );
|
||||
}
|
||||
|
||||
push @$result, [$node,"Success",0];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return( [@$result] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
##########################################################################
|
||||
# Invoke fsp_api to change the passwords and store updated passwd in db
|
||||
@@ -278,7 +725,7 @@ sub fsp_api_passwd {
|
||||
############################
|
||||
# Set type for FSP or BPA
|
||||
############################
|
||||
if($$attrs[4] =~ /^fsp$/ || $$attrs[4] =~ /^lpar$/ || $$attrs[4] =~ /^cec$/) {
|
||||
if($$attrs[4] =~ /^fsp$/ || $$attrs[4] =~ /^lpar$/ || $$attrs[4] =~ /^cec$/) {
|
||||
$type = 0;
|
||||
} else {
|
||||
$type = 1;
|
||||
@@ -321,5 +768,20 @@ sub fsp_api_passwd {
|
||||
|
||||
}
|
||||
|
||||
|
||||
##########################################################################
|
||||
# Do resetnet
|
||||
##########################################################################
|
||||
sub resetnet {
|
||||
my $request = shift;
|
||||
my $hash = shift;
|
||||
my %nodehash;
|
||||
foreach ( @{$request->{noderange}}) {
|
||||
$nodehash{$_} = 1;
|
||||
}
|
||||
# go to use lsslp do_resetnet
|
||||
my $result = xCAT_plugin::lsslp::do_resetnet($request, \%nodehash);
|
||||
return [$result];
|
||||
}
|
||||
1;
|
||||
|
||||
|
||||
+88
-82
@@ -56,25 +56,29 @@ sub mkhwconn_parse_args
|
||||
$Getopt::Long::ignorecase = 0;
|
||||
Getopt::Long::Configure( "bundling" );
|
||||
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help t T=s p=s P=s port=s) )) {
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help t s:s T=s p=s P=s port=s ) )) {
|
||||
return( usage() );
|
||||
}
|
||||
|
||||
if ( exists $opt{s} )
|
||||
{
|
||||
my $opttmp = xCAT::PPCconn::mkhwconn_parse_args($request, $args);
|
||||
return $opttmp;
|
||||
my $opttmp = xCAT::PPCconn::mkhwconn_parse_args($request, $args);
|
||||
return $opttmp;
|
||||
}
|
||||
|
||||
|
||||
return usage() if ( exists $opt{h});
|
||||
|
||||
if ( !exists $opt{t} and !exists $opt{p}) {
|
||||
return ( usage('Flag -t or -p must be used.'));
|
||||
}
|
||||
|
||||
if ( exists $opt{t} and exists $opt{p})
|
||||
{
|
||||
return( usage('Flags -t and -p cannot be used together.'));
|
||||
}
|
||||
|
||||
if ( exists $opt{P} and ! exists $opt{p})
|
||||
if ( (exists $opt{P} or grep(/^(-P)$/, @$args)) and !exists $opt{p})
|
||||
{
|
||||
return( usage('Flags -P can only be used when flag -p is specified.'));
|
||||
}
|
||||
@@ -84,7 +88,7 @@ sub mkhwconn_parse_args
|
||||
##########################################
|
||||
my $nodes = $request->{node};
|
||||
my $ppctab = xCAT::Table->new( 'ppc' );
|
||||
my $nodetypetab = xCAT::Table->new( 'nodetype');
|
||||
#my $nodetypetab = xCAT::Table->new( 'nodetype');
|
||||
my $vpdtab = xCAT::Table->new( 'vpd');
|
||||
my @bpa_ctrled_nodes = ();
|
||||
my @no_type_nodes = ();
|
||||
@@ -95,8 +99,9 @@ sub mkhwconn_parse_args
|
||||
##########################################
|
||||
if ( exists $opt{p} )
|
||||
{
|
||||
my $nodetype_hash = $nodetypetab->getNodeAttribs( $opt{p},[qw(nodetype)]);
|
||||
my $nodetype = $nodetype_hash->{nodetype};
|
||||
#my $nodetype_hash = $nodetypetab->getNodeAttribs( $opt{p},[qw(nodetype)]);
|
||||
#my $nodetype = $nodetype_hash->{nodetype};
|
||||
my $nodetype = xCAT::DBobjUtils->getnodetype($opt{p});
|
||||
if( !defined($nodetype) ) {
|
||||
return(usage("Something wrong with the specified HMC (-p Option). The HMC type doesn't exist."));
|
||||
}
|
||||
@@ -114,15 +119,16 @@ sub mkhwconn_parse_args
|
||||
my $node_parent = undef;
|
||||
my $nodetype = undef;
|
||||
my $node_hcp_nodetype = undef;
|
||||
my $nodetype_hash = $nodetypetab->getNodeAttribs( $node,[qw(nodetype)]);
|
||||
#my $nodetype_hash = $nodetypetab->getNodeAttribs( $node,[qw(nodetype)]);
|
||||
my $node_parent_hash = $ppctab->getNodeAttribs( $node,[qw(parent)]);
|
||||
if ( exists $opt{t} )
|
||||
{
|
||||
my $node_hcp_hash = $ppctab->getNodeAttribs( $node,[qw(hcp)]);
|
||||
if ( $node_hcp_hash->{hcp} )
|
||||
{
|
||||
my $node_hcp_nodetype_hash = $nodetypetab->getNodeAttribs($node_hcp_hash->{hcp},[qw(nodetype)]);
|
||||
$node_hcp_nodetype = $node_hcp_nodetype_hash->{nodetype};
|
||||
#my $node_hcp_nodetype_hash = $nodetypetab->getNodeAttribs($node_hcp_hash->{hcp},[qw(nodetype)]);
|
||||
#$node_hcp_nodetype = $node_hcp_nodetype_hash->{nodetype};
|
||||
$node_hcp_nodetype = xCAT::DBobjUtils->getnodetype($node_hcp_hash->{hcp});
|
||||
}
|
||||
if ( defined $hcp_nodetype )
|
||||
{
|
||||
@@ -141,7 +147,8 @@ sub mkhwconn_parse_args
|
||||
}
|
||||
|
||||
}
|
||||
$nodetype = $nodetype_hash->{nodetype};
|
||||
#$nodetype = $nodetype_hash->{nodetype};
|
||||
$nodetype = xCAT::DBobjUtils->getnodetype($node);
|
||||
$node_parent = $node_parent_hash->{parent};
|
||||
if ( !$nodetype )
|
||||
{
|
||||
@@ -170,7 +177,7 @@ sub mkhwconn_parse_args
|
||||
if ( $nodetype eq 'frame')
|
||||
{
|
||||
my $my_frame_bpa_cec = xCAT::DBobjUtils::getcecchildren( $node) ;
|
||||
push @frame_members, @$my_frame_bpa_cec;
|
||||
push @frame_members, @$my_frame_bpa_cec if($my_frame_bpa_cec);
|
||||
push @frame_members, $node;
|
||||
}
|
||||
|
||||
@@ -223,7 +230,7 @@ sub mkhwconn_parse_args
|
||||
}
|
||||
|
||||
$ppctab->close();
|
||||
$nodetypetab->close();
|
||||
#$nodetypetab->close();
|
||||
$vpdtab->close();
|
||||
|
||||
$request->{method} = 'mkhwconn';
|
||||
@@ -296,7 +303,13 @@ sub lshwconn_parse_args
|
||||
$Getopt::Long::ignorecase = 0;
|
||||
Getopt::Long::Configure( "bundling" );
|
||||
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help T=s) )) {
|
||||
if ( exists $opt{s} )
|
||||
{
|
||||
my $opttmp = xCAT::PPCconn::lshwconn_parse_args($request, $args);
|
||||
return $opttmp;
|
||||
}
|
||||
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help T=s s) )) {
|
||||
return( usage() );
|
||||
}
|
||||
return usage() if ( exists $opt{h});
|
||||
@@ -322,49 +335,50 @@ sub lshwconn_parse_args
|
||||
if ( scalar( @ARGV)) {
|
||||
return(usage( "No additional flag is support by this command" ));
|
||||
}
|
||||
my $nodetypetab = xCAT::Table->new('nodetype');
|
||||
if (! $nodetypetab)
|
||||
{
|
||||
return( ["Failed to open table 'nodetype'.\n"]);
|
||||
}
|
||||
#my $nodetypetab = xCAT::Table->new('nodetype');
|
||||
#if (! $nodetypetab)
|
||||
#{
|
||||
# return( ["Failed to open table 'nodetype'.\n"]);
|
||||
#}
|
||||
my $nodehmtab = xCAT::Table->new('nodehm');
|
||||
if (! $nodehmtab)
|
||||
{
|
||||
return( ["Failed to open table 'nodehm'.\n"]);
|
||||
}
|
||||
|
||||
|
||||
my $nodetype;
|
||||
for my $node ( @{$request->{node}})
|
||||
{
|
||||
my $ent = $nodetypetab->getNodeAttribs( $node, [qw(nodetype)]);
|
||||
#my $ent = $nodetypetab->getNodeAttribs( $node, [qw(nodetype)]);
|
||||
my $nodehm = $nodehmtab->getNodeAttribs( $node, [qw(mgt)]);
|
||||
if ( ! $ent)
|
||||
{
|
||||
return( ["Failed to get node type for node $node.\n"]);
|
||||
}
|
||||
if ( ! $nodehm)
|
||||
#if ( ! $ent)
|
||||
#{
|
||||
# return( ["Failed to get node type for node $node.\n"]);
|
||||
#}
|
||||
my $ttype = xCAT::DBobjUtils->getnodetype($node);
|
||||
if ( ! $ttype)
|
||||
{
|
||||
return( ["Failed to get nodehm.mgt value for node $node.\n"]);
|
||||
}
|
||||
if ( $ent->{nodetype} ne 'fsp' and $ent->{nodetype} ne 'cec'
|
||||
and $ent->{nodetype} ne 'bpa' and $ent->{nodetype} ne 'frame')
|
||||
if ( $ttype ne 'fsp' and $ttype ne 'cec'
|
||||
and $ttype ne 'bpa' and $ttype ne 'frame')
|
||||
{
|
||||
return( ["Node type $ent->{nodetype} is not supported for this command in FSPAPI\n"]);
|
||||
return( ["Node type $ttype is not supported for this command in FSPAPI\n"]);
|
||||
}
|
||||
if ( ! $nodetype)
|
||||
{
|
||||
$nodetype = $ent->{nodetype};
|
||||
$nodetype = $ttype; #$ent->{nodetype};
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( $nodetype ne $ent->{nodetype})
|
||||
if ( $nodetype ne $ttype) #$ent->{nodetype})
|
||||
{
|
||||
return( ["Cannot support multiple node types in this command line.\n"]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$nodetypetab->close();
|
||||
#$nodetypetab->close();
|
||||
$nodehmtab->close();
|
||||
|
||||
$request->{nodetype} = $nodetype;
|
||||
@@ -393,11 +407,17 @@ sub rmhwconn_parse_args
|
||||
$Getopt::Long::ignorecase = 0;
|
||||
Getopt::Long::Configure( "bundling" );
|
||||
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help T=s) )) {
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help T=s s) )) {
|
||||
return( usage() );
|
||||
}
|
||||
return usage() if ( exists $opt{h});
|
||||
|
||||
|
||||
if ( $opt{s} )
|
||||
{
|
||||
my $opttmp = xCAT::PPCconn::rmhwconn_parse_args($request, $args);
|
||||
return $opttmp;
|
||||
}
|
||||
|
||||
if( ! exists $opt{T} )
|
||||
{
|
||||
$opt{T} = "lpar"; #defaut value is lpar.
|
||||
@@ -425,8 +445,8 @@ sub rmhwconn_parse_args
|
||||
my $nodes = $request->{node};
|
||||
my $ppctab = xCAT::Table->new( 'ppc' );
|
||||
return( ["Failed to open table 'ppc'.\n"]) if ( ! $ppctab);
|
||||
my $nodetypetab = xCAT::Table->new( 'nodetype');
|
||||
return( ["Failed to open table 'nodetype'.\n"]) if ( ! $nodetypetab);
|
||||
#my $nodetypetab = xCAT::Table->new( 'nodetype');
|
||||
#return( ["Failed to open table 'nodetype'.\n"]) if ( ! $nodetypetab);
|
||||
my $vpdtab = xCAT::Table->new( 'vpd');
|
||||
return( ["Failed to open table 'vpd'.\n"]) if ( ! $vpdtab);
|
||||
my $nodehmtab = xCAT::Table->new('nodehm');
|
||||
@@ -444,9 +464,10 @@ sub rmhwconn_parse_args
|
||||
|
||||
my $node_parent = undef;
|
||||
my $nodetype = undef;
|
||||
my $nodetype_hash = $nodetypetab->getNodeAttribs( $node,[qw(nodetype)]);
|
||||
#my $nodetype_hash = $nodetypetab->getNodeAttribs( $node,[qw(nodetype)]);
|
||||
my $node_parent_hash = $ppctab->getNodeAttribs( $node,[qw(parent)]);
|
||||
$nodetype = $nodetype_hash->{nodetype};
|
||||
#$nodetype = $nodetype_hash->{nodetype};
|
||||
$nodetype = xCAT::DBobjUtils->getnodetype($node);
|
||||
$node_parent = $node_parent_hash->{parent};
|
||||
if ( !$nodetype)
|
||||
{
|
||||
@@ -481,7 +502,7 @@ sub rmhwconn_parse_args
|
||||
}
|
||||
|
||||
$ppctab->close();
|
||||
$nodetypetab->close();
|
||||
#$nodetypetab->close();
|
||||
$vpdtab->close();
|
||||
$nodehmtab->close();
|
||||
|
||||
@@ -576,54 +597,39 @@ sub lshwconn
|
||||
#print "in lshwconn:\n";
|
||||
#print Dumper($res);
|
||||
my $Rc = @$res[2];
|
||||
my $data = @$res[1];
|
||||
my $values = @$res[1];
|
||||
|
||||
############################################
|
||||
# If lssysconn failed, put error into all
|
||||
# nodes' return values
|
||||
############################################
|
||||
if ( $Rc )
|
||||
{
|
||||
push @value, [$node_name, $data, $Rc];
|
||||
next;
|
||||
}
|
||||
|
||||
my $node_ip = xCAT::Utils::getNodeIPaddress( $node_name );
|
||||
if(!defined($node_ip)) {
|
||||
$data = "Failed to get the $node_name\'s ip";
|
||||
push @value, [$node_name, $data, -1];
|
||||
next;
|
||||
}
|
||||
if( $data =~ /state/) {
|
||||
$data =~ /state=([\w\s]+), type=([\w-]+), MTMS=([\w-\*]+), ([\w=]+), slot=([\w]+), ipadd=([\w.]+), alt_ipadd=([\w.]+)/ ;
|
||||
#$data =~ /state=([\w\s]+),\(type=([\w-]+)\),\(serial-number=([\w]+)\),\(machinetype-model=([\w-]+)\),sp=([\w]+),\(ip-address=([\w.]+),([\w.]+)\)/ ;
|
||||
print "parsing: $1,$2,$3,$4,$5,$6,$7\n";
|
||||
my $state = $1;
|
||||
my $type = $2;
|
||||
my $mtms = $3;
|
||||
my $sp = $4;
|
||||
my $slot = $5;
|
||||
my $ipadd = $6;
|
||||
my $alt_ipaddr = $7;
|
||||
#if($ipadd ne $node_ip) {
|
||||
# $ipadd=$7;
|
||||
# $alt_ipaddr = $6;
|
||||
#}
|
||||
#$data = "$sp,ipadd=$node_ip,alt_ipadd=$alt_ipaddr,state=$state";
|
||||
$data = "$sp,ipadd=$ipadd,alt_ipadd=$alt_ipaddr,state=$state";
|
||||
#my $s;
|
||||
#foreach my $val ( @infomap ) {
|
||||
# if ( $data =~ /@$val[0]=([\w.\-\s]+)/ ) {
|
||||
# print "$1\n";
|
||||
# $s = $s + "@$val[1]=$1";
|
||||
# }
|
||||
#}
|
||||
#$data = $s;
|
||||
}
|
||||
push @value, [$node_name, $data, $Rc];
|
||||
|
||||
}
|
||||
}
|
||||
#if ( $Rc )
|
||||
# {
|
||||
# push @value, [$node_name, $values, $Rc];
|
||||
# next;
|
||||
# }
|
||||
|
||||
my @data_a = split("\n", $values);
|
||||
foreach my $data(@data_a) {
|
||||
if( $data =~ /state/) {
|
||||
$data =~ /state=([\w\s\,]+), type=([\w-]+), MTMS=([\w-\*]+), ([\w=]+), slot=([\w]+), ipadd=([\w.]+), alt_ipadd=([\w.]+)/ ;
|
||||
#$data =~ /state=([\w\s]+),\(type=([\w-]+)\),\(serial-number=([\w]+)\),\(machinetype-model=([\w-]+)\),sp=([\w]+),\(ip-address=([\w.]+),([\w.]+)\)/ ;
|
||||
print "parsing: $1,$2,$3,$4,$5,$6,$7\n";
|
||||
my $state = $1;
|
||||
my $type = $2;
|
||||
my $mtms = $3;
|
||||
my $sp = $4;
|
||||
my $slot = $5;
|
||||
my $ipadd = $6;
|
||||
my $alt_ipaddr = $7;
|
||||
$data = "$ipadd: $sp,ipadd=$ipadd,alt_ipadd=$alt_ipaddr,state=$state";
|
||||
}
|
||||
push @value, [$node_name, $data, $Rc];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return \@value;
|
||||
|
||||
|
||||
|
||||
@@ -20,12 +20,16 @@ my @licmap = (
|
||||
["accepted_level", "Accepted Level "],
|
||||
["curr_ecnumber_a", "Release Level A"],
|
||||
["curr_level_a", "Level A "],
|
||||
["curr_power_on_side_a", "Current Power on side A"],
|
||||
["curr_ecnumber_b", "Release Level B"],
|
||||
["curr_level_b", "Level B "],
|
||||
["curr_power_on_side_b", "Current Power on side B"],
|
||||
["curr_ecnumber_primary", "Release Level Primary"],
|
||||
["curr_level_primary", "Level Primary "],
|
||||
["curr_power_on_side_primary", "Current Power on side Primary"],
|
||||
["curr_ecnumber_secondary","Release Level Secondary"],
|
||||
["curr_level_secondary", "Level Secondary"]
|
||||
["curr_level_secondary", "Level Secondary"],
|
||||
["curr_power_on_side_secondary","Current Power on side Secondary"]
|
||||
);
|
||||
|
||||
##########################################################################
|
||||
@@ -254,14 +258,25 @@ sub deconfig {
|
||||
next;
|
||||
}
|
||||
|
||||
|
||||
#####################################
|
||||
# Format fsp-api results
|
||||
#####################################
|
||||
my $decfg = XMLin($data);
|
||||
#my $decfg = XMLin($data);
|
||||
my $decfg;
|
||||
eval {
|
||||
$decfg = XMLin($data);
|
||||
};
|
||||
if( $@ ) {
|
||||
push @result,[$name, "Error: there are some unreadable XML data from the firmware. Please check with the data provider.", -1];
|
||||
return (\@result);
|
||||
}
|
||||
|
||||
my $node = $decfg->{NODE};
|
||||
if( $node ) {
|
||||
if( defined($node) && exists($node->{Location_code}) ) {
|
||||
push @result,[$name,"Deconfigured resources", 0];
|
||||
push @result,[$name,$node->{Location_code}.",".$node->{RID}, 0];
|
||||
push @result,[$name,"Location_code RID Call_Out_Method Call_Out_Hardware_State TYPE", 0];
|
||||
push @result,[$name,"$node->{Location_code} $node->{RID}", 0];
|
||||
foreach my $unit(@{$node->{GARDRECORD}}) {
|
||||
my $Call_Out_Hardware_State = $unit->{GARDUNIT}->{Call_Out_Hardware_State};
|
||||
my $Call_Out_Method = $unit->{GARDUNIT}->{Call_Out_Method};
|
||||
@@ -269,7 +284,7 @@ sub deconfig {
|
||||
my $RID = $unit->{GARDUNIT}->{RID};
|
||||
my $TYPE = $unit->{GARDUNIT}->{TYPE};
|
||||
|
||||
push @result,[$name,"$Location_code,$RID,$Call_Out_Method,$Call_Out_Hardware_State,$TYPE",0];
|
||||
push @result,[$name,"$Location_code $RID $Call_Out_Method $Call_Out_Hardware_State $TYPE",0];
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
@@ -191,8 +191,9 @@ sub powercmd {
|
||||
} elsif ($$d[4] =~ /^(fsp|cec)$/) {
|
||||
if($action =~ /^on$/) { $action = "cec_on_autostart"; }
|
||||
if($action =~ /^off$/) { $action = "cec_off"; }
|
||||
if($action =~ /^resetsp$/) { $action = "reboot_service_processor"; }
|
||||
if($action =~ /^lowpower$/) { $action = "cec_on_low_power"; }
|
||||
if($action =~ /^of$/ ) {
|
||||
if($action !~ /^cec_on_autostart$/ && $action !~ /^cec_off$/ && $action !~ /^cec_on_low_power$/ && $action !~ /^onstandby$/ && $action !~ /^reboot_service_processor$/ ) {
|
||||
push @output, [$node_name, "\'$action\' command not supported for CEC", -1 ];
|
||||
#return (\@output);
|
||||
next;
|
||||
|
||||
+76
-29
@@ -27,11 +27,20 @@ my @header = (
|
||||
["side", "%-8s" ],
|
||||
["address", "%-20s\n" ]);
|
||||
|
||||
my @attribs = qw(nodetype node id mtm serial side hcp pprofile parent groups mgt cons);
|
||||
my %nodetype = (
|
||||
my @attribs = qw(nodetype node id mtm serial side hcp pprofile parent groups mgt cons hwtype);
|
||||
my %globalnodetype = (
|
||||
fsp => $::NODETYPE_PPC,
|
||||
bpa => $::NODETYPE_PPC,
|
||||
cec => $::NODETYPE_PPC,
|
||||
frame=> $::NODETYPE_PPC,
|
||||
lpar =>"$::NODETYPE_PPC,$::NODETYPE_OSI"
|
||||
);
|
||||
my %globalhwtype = (
|
||||
fsp => $::NODETYPE_FSP,
|
||||
bpa => $::NODETYPE_BPA,
|
||||
lpar =>"$::NODETYPE_LPAR,$::NODETYPE_OSI"
|
||||
lpar => $::NODETYPE_LPAR,
|
||||
cec => $::NODETYPE_CEC,
|
||||
frame=> $::NODETYPE_FRAME,
|
||||
);
|
||||
|
||||
|
||||
@@ -75,7 +84,7 @@ sub enumerate {
|
||||
my $hash = shift;
|
||||
my $exp = shift;
|
||||
my $hwtype = ();
|
||||
my $server = ();
|
||||
my $server ;
|
||||
my @values = ();
|
||||
my $cageid;
|
||||
my $server;
|
||||
@@ -87,6 +96,13 @@ sub enumerate {
|
||||
my $filter;
|
||||
my $data;
|
||||
my @output;
|
||||
my $ips;
|
||||
my $fsp;
|
||||
my $model ;
|
||||
my $serial;
|
||||
my $side;
|
||||
my $ips;
|
||||
my $line;
|
||||
|
||||
foreach my $cec_bpa ( keys %$hash)
|
||||
{
|
||||
@@ -104,7 +120,7 @@ sub enumerate {
|
||||
my $stat = xCAT::FSPUtils::fsp_api_action ($node_name, $d, "query_connection");
|
||||
my $Rc = @$stat[2];
|
||||
my $data = @$stat[1];
|
||||
|
||||
|
||||
##################################
|
||||
# Output error
|
||||
##################################
|
||||
@@ -113,32 +129,51 @@ sub enumerate {
|
||||
push @values, $data;
|
||||
next;
|
||||
}
|
||||
if($data !~ "Connected" && $data !~ "LINE UP" ) {
|
||||
$data = "please check if the $node_name is coneected to the hardware server";
|
||||
#push @output, [$node_name,$data,$Rc];
|
||||
push @values, $data;
|
||||
next;
|
||||
}
|
||||
my @data_a = split("\n", $data);
|
||||
foreach $line(@data_a) {
|
||||
if($line !~ "Connected" && $line !~ "LINE UP" ) {
|
||||
next;
|
||||
}
|
||||
|
||||
#########################################
|
||||
# GET CEC's information
|
||||
#########################################
|
||||
#$data =~ /state=([\w\s]+),\(type=([\w-]+)\),\(serial-number=([\w]+)\),\(machinetype-model=([\w-]+)\),sp=([\w]+),\(ip-address=([\w.]+),([\w.]+)\)/ ;
|
||||
$data =~ /state=([\w\s]+), type=([\w-]+), MTMS=([\w-]+)\*([\w-]+), ([\w=]+), slot=([\w]+), ipadd=([\w.]+), alt_ipadd=([\w.]+)/ ;
|
||||
print "parsing: $1,$2,$3,$4,$5,$6,$7,$8\n";
|
||||
#########################################
|
||||
# GET CEC's information
|
||||
#########################################
|
||||
#$data =~ /state=([\w\s]+),\(type=([\w-]+)\),\(serial-number=([\w]+)\),\(machinetype-model=([\w-]+)\),sp=([\w]+),\(ip-address=([\w.]+),([\w.]+)\)/ ;
|
||||
$line =~ /state=([\w\s]+), type=([\w-]+), MTMS=([\w-]+)\*([\w-]+), sp=([\w=]+), slot=([\w]+), ipadd=([\w.]+), alt_ipadd=([\w.]+)/ ;
|
||||
#print "parsing: $1,$2,$3,$4,$5,$6,$7,$8\n";
|
||||
|
||||
my $fsp=$node_name;
|
||||
my $model = $3;
|
||||
my $serial = $4;
|
||||
my $side = $6;
|
||||
$server = $fsp;
|
||||
$fname = $fsp;
|
||||
my $ips ="$7,$8";
|
||||
$fsp=$node_name;
|
||||
$model = $3;
|
||||
$serial = $4;
|
||||
$side = $6;
|
||||
$server = $fsp;
|
||||
$fname = $fsp;
|
||||
my $ip = $7;
|
||||
my $ip_s = $8;
|
||||
if(! defined( $ips)) {
|
||||
if( $ip_s =~ /unavailable/ ) {
|
||||
$ips ="$ip;";
|
||||
} else {
|
||||
$ips ="$ip;$ip_s;";
|
||||
}
|
||||
} else {
|
||||
if( $ip_s =~ /unavailable/ ) {
|
||||
$ips .="$ip";
|
||||
} else {
|
||||
$ips .="$ip;$ip_s";
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!defined($fsp)) {
|
||||
my $msg = "please check if the $node_name is coneected to the hardware server";
|
||||
push @values, $msg;
|
||||
next;
|
||||
}
|
||||
if($$d[4] =~ /^cec$/) {
|
||||
$side="";
|
||||
}
|
||||
push @values, join( ",",
|
||||
$$d[4],$node_name,$cageid,$model,$serial,$side, $server,$prof,$fname, $ips);
|
||||
$$d[4],$node_name,$cageid,$model,$serial,$side, $server,$prof,$fname, $ips, $$d[4]);
|
||||
# $$d[4],$node_name,$cageid,$model,$serial,$side, $server,$prof,$fname, $7);
|
||||
# "fsp",$node_name,$cageid,$model,$serial,$side, $server,$prof,$fname, $7);
|
||||
#"fsp",$fsp,$cageid,$model,$serial,$side,$server,$prof,$fname,$ips );
|
||||
@@ -165,7 +200,7 @@ sub enumerate {
|
||||
$lpar =~ /lparname:\s+([\w\-]+),\s+lparid:\s+(\d+),\s+state:/;
|
||||
my $name = $1;
|
||||
my $lparid = $2;
|
||||
my $prof = ""; # No profile for P7 IH
|
||||
my $prof = ""; # No profile for Power 775
|
||||
my $server = $fsp;
|
||||
my $ips = "";
|
||||
my $port = "";
|
||||
@@ -176,7 +211,7 @@ sub enumerate {
|
||||
# Save LPAR information
|
||||
#####################################
|
||||
push @values, join( ",",
|
||||
"lpar",$name,$lparid,$model,$serial,$port,$server,$prof,$fsp,$ips );
|
||||
"lpar",$name,$lparid,$model,$serial,$port,$server,$prof,$fsp,$ips,"lpar" );
|
||||
|
||||
}
|
||||
|
||||
@@ -358,7 +393,9 @@ sub format_stanza {
|
||||
if ( /^node$/ ) {
|
||||
next;
|
||||
} elsif ( /^nodetype$/ ) {
|
||||
$d = $nodetype{$d};
|
||||
$d = $globalnodetype{$type};
|
||||
} elsif ( /^hwtype$/ ) {
|
||||
$d = $globalhwtype{$type};
|
||||
} elsif ( /^groups$/ ) {
|
||||
$d = "$type,all";
|
||||
} elsif ( /^mgt$/ ) {
|
||||
@@ -374,6 +411,10 @@ sub format_stanza {
|
||||
if ( $type eq "lpar" ) {
|
||||
$d = undef;
|
||||
}
|
||||
} elsif (/^side$/) {
|
||||
unless ( $type =~ /^fsp|bpa$/ ) {
|
||||
next;
|
||||
}
|
||||
}
|
||||
$result .= "\t$_=$d\n";
|
||||
}
|
||||
@@ -423,7 +464,9 @@ sub format_xml {
|
||||
my $d = $data[$i++];
|
||||
|
||||
if ( /^nodetype$/ ) {
|
||||
$d = $nodetype{$d};
|
||||
$d = $globalnodetype{$type};
|
||||
} elsif ( /^hwtype$/ ) {
|
||||
$d = $globalhwtype{$type};
|
||||
} elsif ( /^groups$/ ) {
|
||||
$d = "$type,all";
|
||||
} elsif ( /^mgt$/ ) {
|
||||
@@ -438,6 +481,10 @@ sub format_xml {
|
||||
if ( $type eq "lpar" ) {
|
||||
$d = undef;
|
||||
}
|
||||
} elsif (/^side$/) {
|
||||
unless ( $type =~ /^fsp|bpa$/ ) {
|
||||
next;
|
||||
}
|
||||
}
|
||||
$href->{Node}->{$_} = $d;
|
||||
}
|
||||
|
||||
@@ -315,7 +315,8 @@ sub rackenv {
|
||||
foreach my $td ( @t ) {
|
||||
push @result, [$name,$td, $Rc];
|
||||
if ( !exists($request->{verbose}) ) {
|
||||
if( $td =~ /^Rack altitude in meters/ ) {
|
||||
#if( $td =~ /^Rack altitude in meters/ ) {
|
||||
if( $td =~ /^BPA-B total output in watts/ ) {
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
+200
-53
@@ -47,6 +47,26 @@ sub parse_args {
|
||||
##########################################################################
|
||||
# Parse the chvm command line for options and operands
|
||||
##########################################################################
|
||||
sub chvm_parse_lparname {
|
||||
my $args = shift;
|
||||
my $opt = shift;
|
||||
if ((ref($args) ne 'ARRAY') ||
|
||||
(scalar(@$args) > '1')){
|
||||
return "@$args";
|
||||
}
|
||||
my ($cmd, $value) = split(/\=/, $args->[0]);
|
||||
if ($cmd !~ /^lparname$/) {
|
||||
return "'$cmd' not support";
|
||||
}
|
||||
if (!defined($value)) {
|
||||
return "value not specified";
|
||||
}
|
||||
$opt->{$cmd} = $value;
|
||||
if ($value && $value ne '*' && $value !~ /^[a-zA-Z0-9-_]+$/) {
|
||||
return "'$value' invalid";
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
sub chvm_parse_args {
|
||||
|
||||
my $request = shift;
|
||||
@@ -87,12 +107,6 @@ sub chvm_parse_args {
|
||||
return(usage( "Missing option: -" ));
|
||||
}
|
||||
####################################
|
||||
# Check for an extra argument
|
||||
####################################
|
||||
if ( defined( $ARGV[0] )) {
|
||||
return(usage( "Invalid argument: $ARGV[0]" ));
|
||||
}
|
||||
####################################
|
||||
# Configuration file required
|
||||
####################################
|
||||
#if ( !exists( $opt{p}) ) {
|
||||
@@ -159,16 +173,16 @@ sub chvm_parse_args {
|
||||
my @id = (1, 5, 9, 13, 17, 21, 25, 29);
|
||||
my @found = grep(/^$opt{i}$/, @id );
|
||||
if ( @found != 1) {
|
||||
return(usage( "Invalid entry: $opt{i}.\n For P7 IH, starting numeric id of the newly created partitions only could be 1, 5, 9, 13, 17, 21, 25 and 29." ));
|
||||
return(usage( "Invalid entry: $opt{i}.\n For Power 775, starting numeric id of the newly created partitions only could be 1, 5, 9, 13, 17, 21, 25 and 29." ));
|
||||
}
|
||||
|
||||
#if ( !exists($opt{o}) ) {
|
||||
# return(usage("For P7 IH, -i should be used with -o"));
|
||||
# return(usage("For Power 775, -i should be used with -o"));
|
||||
#}
|
||||
|
||||
#my @value = (1, 2, 3, 4, 5);
|
||||
#if ( grep(/^$opt{i}$/, @id ) != 1) {
|
||||
# return(usage( "Invalid entry: $opt{o}.\n For P7 IH, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of mkvm." ));
|
||||
# return(usage( "Invalid entry: $opt{o}.\n For Power 775, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of mkvm." ));
|
||||
#}
|
||||
|
||||
|
||||
@@ -184,7 +198,7 @@ sub chvm_parse_args {
|
||||
} elsif( $opt{m} =~ /^non-interleaved$/ || $opt{m} =~ /^2$/ ) {
|
||||
$opt{m} = 2;
|
||||
} else {
|
||||
return(usage( "Invalid entry: $opt{m}.\n For P7 IH, the pending memory interleaving mode only could be interleaved(or 1), or non-interleaved(or 2)." ));
|
||||
return(usage( "Invalid entry: $opt{m}.\n For Power 775, the pending memory interleaving mode only could be interleaved(or 1), or non-interleaved(or 2)." ));
|
||||
}
|
||||
} else {
|
||||
$opt{m} = 2 ;# non-interleaved, which is the default
|
||||
@@ -201,13 +215,16 @@ sub chvm_parse_args {
|
||||
my @elems = split(/\,/,$opt{r});
|
||||
my $range="";
|
||||
while (my $elem = shift @elems) {
|
||||
if ($elem !~ /\:/) {
|
||||
return (usage("Invalid argument $elem.\n The input format for 'r' should be like this: \"-r Octant_id:Value\"."))
|
||||
}
|
||||
if($elem !~ /\-/) {
|
||||
my @subelems = split(/\:/, $elem);
|
||||
if( $subelems[0] < 0 || $subelems[0] > 7) {
|
||||
return(usage("Octant ID only could be 0 to 7 in the octant configuration value $elem"));
|
||||
}
|
||||
if( grep(/^$subelems[1]$/, @ratio ) != 1) {
|
||||
return(usage( "Invalid octant configuration value in $elem.\n For P7 IH, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of mkvm." ));
|
||||
return(usage( "Invalid octant configuration value in $elem.\n For Power 775, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of chvm." ));
|
||||
}
|
||||
if( exists($octant_cfg{$subelems[0]}) && $octant_cfg{$subelems[0]} == $subelems[1] ) {
|
||||
return(usage("In the octant configuration rule, same octant with different octant configuration value. Error!"));
|
||||
@@ -222,7 +239,7 @@ sub chvm_parse_args {
|
||||
}
|
||||
if($left == $right) {
|
||||
if( grep(/^$subelems[1]$/, @ratio ) != 1) {
|
||||
return(usage( "Invalid octant configuration value in $elem.\n For P7 IH, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of mkvm." ));
|
||||
return(usage( "Invalid octant configuration value in $elem.\n For Power 775, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of chvm." ));
|
||||
}
|
||||
if( exists($octant_cfg{$left}) || $octant_cfg{$left} == $subelems[1] ) {
|
||||
return(usage("In the octant configuration rule, same octant with different octant configuration value. Error!"));
|
||||
@@ -267,12 +284,32 @@ sub chvm_parse_args {
|
||||
$other_p = $p;
|
||||
}
|
||||
if ($other_p ne $p) {
|
||||
return(usage("For P7 IH, please make sure the noderange are in one CEC "));
|
||||
return(usage("For Power 775, please make sure the noderange are in one CEC "));
|
||||
}
|
||||
}
|
||||
$request->{node} = [$other_p];
|
||||
$request->{noderange} = $other_p;
|
||||
}
|
||||
####################################
|
||||
# Check for an extra argument
|
||||
####################################
|
||||
if ( defined( $ARGV[0] )) {
|
||||
my $check_chvm_lpar_arg = chvm_parse_lparname(\@ARGV, \%opt);
|
||||
if (defined($check_chvm_lpar_arg)) {
|
||||
return (usage("Invalid argument: $check_chvm_lpar_arg"));
|
||||
} elsif (($opt{lparname} ne '*') && (scalar(@{$request->{node}}) > '1')){
|
||||
return(usage( "Invalid argument: must specify '*' for more than one node" ));
|
||||
} else {
|
||||
my $len = rindex $opt{lparname}."\$", "\$";
|
||||
if ($len > '47') {
|
||||
return (usage("Invalid lparname '$opt{lparname}', name is too long, max 47 characters"));
|
||||
}
|
||||
}
|
||||
if (exists($opt{lparname}) &&
|
||||
(exists($opt{p}) || exists($opt{i}) || exists($opt{m}) || exists($opt{r}))) {
|
||||
return (usage("lparname should NOT be used with -p, -i, -m or -r."));
|
||||
}
|
||||
}
|
||||
|
||||
####################################
|
||||
# No operands - add command name
|
||||
@@ -337,16 +374,16 @@ sub mkvm_parse_args {
|
||||
my @id = (1, 5, 9, 13, 17, 21, 25, 29);
|
||||
my @found = grep(/^$opt{i}$/, @id );
|
||||
if ( @found != 1) {
|
||||
return(usage( "Invalid entry: $opt{i}.\n For P7 IH, starting numeric id of the newly created partitions only could be 1, 5, 9, 13, 17, 21, 25 and 29." ));
|
||||
return(usage( "Invalid entry: $opt{i}.\n For Power 775, starting numeric id of the newly created partitions only could be 1, 5, 9, 13, 17, 21, 25 and 29." ));
|
||||
}
|
||||
|
||||
#if ( !exists($opt{o}) ) {
|
||||
# return(usage("For P7 IH, -i should be used with -o"));
|
||||
# return(usage("For Power 775, -i should be used with -o"));
|
||||
#}
|
||||
|
||||
#my @value = (1, 2, 3, 4, 5);
|
||||
#if ( grep(/^$opt{i}$/, @id ) != 1) {
|
||||
# return(usage( "Invalid entry: $opt{o}.\n For P7 IH, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of mkvm." ));
|
||||
# return(usage( "Invalid entry: $opt{o}.\n For Power 775, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of mkvm." ));
|
||||
#}
|
||||
|
||||
|
||||
@@ -362,7 +399,7 @@ sub mkvm_parse_args {
|
||||
} elsif( $opt{m} =~ /^non-interleaved$/ || $opt{m} =~ /^2$/ ) {
|
||||
$opt{m} = 2;
|
||||
} else {
|
||||
return(usage( "Invalid entry: $opt{m}.\n For P7 IH, the pending memory interleaving mode only could be interleaved(or 1), or non-interleaved(or 2)." ));
|
||||
return(usage( "Invalid entry: $opt{m}.\n For Power 775, the pending memory interleaving mode only could be interleaved(or 1), or non-interleaved(or 2)." ));
|
||||
}
|
||||
} else {
|
||||
$opt{m} = 2 ;# non-interleaved, which is the default
|
||||
@@ -380,7 +417,7 @@ sub mkvm_parse_args {
|
||||
return(usage("Octant ID only could be 0 to 7 in the octant configuration value $elem"));
|
||||
}
|
||||
if( grep(/^$subelems[1]$/, @ratio ) != 1) {
|
||||
return(usage( "Invalid octant configuration value in $elem.\n For P7 IH, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of mkvm." ));
|
||||
return(usage( "Invalid octant configuration value in $elem.\n For Power 775, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of mkvm." ));
|
||||
}
|
||||
if( exists($octant_cfg{$subelems[0]}) && $octant_cfg{$subelems[0]} == $subelems[1] ) {
|
||||
return(usage("In the octant configuration rule, same octant with different octant configuration value. Error!"));
|
||||
@@ -395,7 +432,7 @@ sub mkvm_parse_args {
|
||||
}
|
||||
if($left == $right) {
|
||||
if( grep(/^$subelems[1]$/, @ratio ) != 1) {
|
||||
return(usage( "Invalid octant configuration value in $elem.\n For P7 IH, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of mkvm." ));
|
||||
return(usage( "Invalid octant configuration value in $elem.\n For Power 775, octant configuration values only could be 1, 2, 3, 4, 5. Please see the details in manpage of mkvm." ));
|
||||
}
|
||||
if( exists($octant_cfg{$left}) || $octant_cfg{$left} == $subelems[1] ) {
|
||||
return(usage("In the octant configuration rule, same octant with different octant configuration value. Error!"));
|
||||
@@ -443,7 +480,7 @@ sub mkvm_parse_args {
|
||||
$other_p = $p;
|
||||
}
|
||||
if ($other_p ne $p) {
|
||||
return(usage("For P7 IH, please make sure the noderange are in one CEC "));
|
||||
return(usage("For Power 775, please make sure the noderange are in one CEC "));
|
||||
}
|
||||
}
|
||||
$request->{node} = [$other_p];
|
||||
@@ -494,7 +531,7 @@ sub rmvm_parse_args {
|
||||
if ( !GetOptions( \%opt, qw(V|verbose service r) )) {
|
||||
return( usage() );
|
||||
}
|
||||
return(usage( "rmvm doesn't support for P7 IH." ));
|
||||
return(usage( "rmvm doesn't support for Power 775." ));
|
||||
####################################
|
||||
# Check for "-" with no option
|
||||
####################################
|
||||
@@ -548,7 +585,7 @@ sub lsvm_parse_args {
|
||||
$Getopt::Long::ignorecase = 0;
|
||||
Getopt::Long::Configure( "bundling" );
|
||||
|
||||
if ( !GetOptions( \%opt, qw(V|verbose ) )) {
|
||||
if ( !GetOptions( \%opt, qw(V|verbose l|long) )) {
|
||||
return( usage() );
|
||||
}
|
||||
####################################
|
||||
@@ -577,8 +614,54 @@ sub lsvm_parse_args {
|
||||
sub modify {
|
||||
my $request = shift;
|
||||
my $hash = shift;
|
||||
return modify_by_prof( $request, $hash) if ( $request->{opt}->{p});
|
||||
my $usage_string = xCAT::Usage->getUsage($request->{command});
|
||||
return modify_by_prof( $request, $hash) if ( $request->{opt}->{p} || $request->{stdin});
|
||||
return create( $request, $hash) if ( $request->{opt}->{i});
|
||||
return op_lparname ($request, $hash) if ($request->{opt}->{lparname});
|
||||
return ([["Error", "Miss argument\n".$usage_string, 1]]);
|
||||
}
|
||||
sub do_set_lparname {
|
||||
my $request = shift;
|
||||
my $hash = shift;
|
||||
my @values = ();
|
||||
my $lparname_para = $request->{opt}->{lparname};
|
||||
while (my ($mtms, $h) = each(%$hash)) {
|
||||
while (my($name, $d) = each(%$h)) {
|
||||
my $lparname = ($lparname_para eq '*') ? $name : $lparname_para;
|
||||
my $values = xCAT::FSPUtils::fsp_api_action($name, $d, "set_lpar_name", 0, $lparname);
|
||||
if (@$values[1] && ((@$values[1] =~ /Error/i) && (@$values[2] ne '0'))) {
|
||||
return ([[$name, @$values[1], '1']]) ;
|
||||
} else {
|
||||
push @values, [$name, "Success", '0'];
|
||||
}
|
||||
}
|
||||
}
|
||||
return \@values;
|
||||
}
|
||||
sub check_node_info {
|
||||
my $hash = shift;
|
||||
my $not_lpar = undef;
|
||||
while (my ($mtms, $h) = each(%$hash)) {
|
||||
while (my($name, $d) = each(%$h)) {
|
||||
my $node_type = @$d[4];
|
||||
if ($node_type !~ /^lpar$/) {
|
||||
$not_lpar = $name;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $not_lpar;
|
||||
}
|
||||
|
||||
sub op_lparname {
|
||||
my $request = shift;
|
||||
my $hash = shift;
|
||||
my $node = $request->{node};
|
||||
my $lpar_flag = &check_node_info($hash);
|
||||
if (defined($lpar_flag)) {
|
||||
return ([[$lpar_flag,"Node must be LPAR", 1]]);
|
||||
}
|
||||
return &do_set_lparname($request, $hash);
|
||||
}
|
||||
|
||||
|
||||
@@ -623,12 +706,12 @@ sub modify_by_prof {
|
||||
#get the current I/O slot information
|
||||
my $action = "get_io_slot_info";
|
||||
my $values = xCAT::FSPUtils::fsp_api_action ($cec_name, $td, $action);
|
||||
my $Rc = shift(@$values);
|
||||
my $Rc = $$values[2];
|
||||
if ( $Rc != 0 ) {
|
||||
push @result, [$cec_name, $$values[0], $Rc];
|
||||
push @result, [$cec_name, $$values[1], $Rc];
|
||||
return (\@result);
|
||||
}
|
||||
my @data = split(/\n/, $$values[0]);
|
||||
my @data = split(/\n/, $$values[1]);
|
||||
foreach my $v (@data) {
|
||||
my ($lparid, $busid, $location, $drc_index, $owner_type, $owner, $descr) = split(/,/, $v);
|
||||
$io{$drc_index}{lparid} = $lparid;
|
||||
@@ -704,12 +787,13 @@ sub enumerate {
|
||||
$td[4]="fsp";
|
||||
my $action = "get_io_slot_info";
|
||||
my $values = xCAT::FSPUtils::fsp_api_action ($cec, \@td, $action);
|
||||
my $Rc = shift(@$values);
|
||||
#my $Rc = shift(@$values);
|
||||
my $Rc = $$values[2];
|
||||
if ( $Rc != 0 ) {
|
||||
return( [$Rc,@$values[0]] );
|
||||
}
|
||||
|
||||
$outhash{ 0 } = $$values[0];
|
||||
$outhash{ 1 } = "The LPARs' I/O slots information could NOT be listed because the cec is in power off state";
|
||||
} else {
|
||||
$outhash{ 0 } = $$values[1];
|
||||
}
|
||||
#my @t;
|
||||
#foreach my $value ( @$values ) {
|
||||
# my ($lparid, $busid, $slot_location_code, $drc_index,@t ) = split (/,/, $value);
|
||||
@@ -719,20 +803,20 @@ sub enumerate {
|
||||
if( $type =~ /^(fsp|cec)$/ ) {
|
||||
$action = "query_octant_cfg";
|
||||
my $values = xCAT::FSPUtils::fsp_api_action ($cec, \@td, $action);
|
||||
my $Rc = shift(@$values);
|
||||
my $Rc = pop(@$values);
|
||||
if ( $Rc != 0 ) {
|
||||
return( [$Rc,@$values[0]] );
|
||||
return( [$Rc,$$values[1]] );
|
||||
}
|
||||
#$outhash{ $cec } = @$values[0];
|
||||
my $data = @$values[0];
|
||||
my $data = $$values[1];
|
||||
my @value = split(/:/, $data);
|
||||
my $pendingpumpmode = $value[0];
|
||||
my $currentpumpMode = $value[1];
|
||||
my $octantcount = $value[2];
|
||||
my $j = 3;
|
||||
my $res = "PendingPumpMode=$pendingpumpmode,CurrentPumpMode=$currentpumpMode,OctantCount=$octantcount:";
|
||||
my $res = "PendingPumpMode=$pendingpumpmode,CurrentPumpMode=$currentpumpMode,OctantCount=$octantcount:\n";
|
||||
for(my $i=0; $i < $octantcount; $i++) {
|
||||
$res = $res."OctantID=".$value[$j++].",PendingOctCfg=".$value[$j++].",CurrentOctCfg=".$value[$j++].",PendingMemoryInterleaveMode=".$value[$j++].",CurrentMemoryInterleaveMode=".$value[$j++].";";
|
||||
$res = $res."OctantID=".$value[$j++].",PendingOctCfg=".$value[$j++].",CurrentOctCfg=".$value[$j++].",PendingMemoryInterleaveMode=".$value[$j++].",CurrentMemoryInterleaveMode=".$value[$j++].";\n";
|
||||
}
|
||||
$outhash{ $cec } = $res;
|
||||
}
|
||||
@@ -740,6 +824,43 @@ sub enumerate {
|
||||
return( [0,\%outhash] );
|
||||
}
|
||||
|
||||
sub get_cec_lpar_info {
|
||||
my $name = shift;
|
||||
my $attr = shift;
|
||||
my $lparid = shift;
|
||||
my $values = xCAT::FSPUtils::fsp_api_action($name, $attr, "get_lpar_info");
|
||||
if (@$values[1] && ((@$values[1] =~ /Error/i) && @$values[2] ne '0')) {
|
||||
return ([[$name, @$values[1], '1']]);
|
||||
}
|
||||
return @$values[1];
|
||||
}
|
||||
sub get_cec_lpar_name {
|
||||
my $name = shift;
|
||||
my $lpar_info = shift;
|
||||
my $lparid = shift;
|
||||
my @value = split(/\n/, $lpar_info);
|
||||
foreach my $v (@value) {
|
||||
if($v =~ /lparname:\s*([^\,]*),\s*lparid:\s*([\d]+),/) {
|
||||
if($2 == $lparid) {
|
||||
return $1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ([[$name, "can not get lparname for lpar id $lparid", '1']]);
|
||||
|
||||
}
|
||||
sub get_lpar_lpar_name {
|
||||
my $name = shift;
|
||||
my $attr = shift;
|
||||
my $values = xCAT::FSPUtils::fsp_api_action($name, $attr, "get_lpar_name");
|
||||
if (@$values[1] && ((@$values[1] =~ /Error/i) && (@$values[2] ne '0'))) {
|
||||
my @result = ();
|
||||
push @result, $values;
|
||||
return \@result;
|
||||
}
|
||||
return @$values[1];
|
||||
}
|
||||
|
||||
##########################################################################
|
||||
# Lists logical partitions
|
||||
##########################################################################
|
||||
@@ -753,13 +874,12 @@ sub list {
|
||||
my $node_name;
|
||||
my $d;
|
||||
my @result;
|
||||
|
||||
my $lpar_infos;
|
||||
#print Dumper($hash);
|
||||
while (my ($mtms,$h) = each(%$hash) ) {
|
||||
my $info = enumerate( $h, $mtms );
|
||||
my $Rc = shift(@$info);
|
||||
my $data = @$info[0];
|
||||
my $values = $data->{0};
|
||||
|
||||
while (($node_name,$d) = each(%$h) ) {
|
||||
my $cec = @$d[3];
|
||||
@@ -771,23 +891,50 @@ sub list {
|
||||
push @result, [$node_name, $data,$Rc];
|
||||
next;
|
||||
}
|
||||
my $values = $data->{0};
|
||||
my $msg = $data->{1};
|
||||
|
||||
# if ( !exists( $data->{$id} )) {
|
||||
# push @result, [$node_name, "Node not found",1];
|
||||
# next;
|
||||
# }
|
||||
|
||||
# get the I/O slot information
|
||||
my $v;
|
||||
my @t;
|
||||
my @value = split(/\n/, $values);
|
||||
foreach my $v (@value) {
|
||||
my ($lparid, @t ) = split (/,/, $v);
|
||||
if ($type=~/^(fsp|cec)$/) {
|
||||
push @result,[$lparid, join('/', @t), $Rc];
|
||||
} else {
|
||||
if( $lparid eq $id) {
|
||||
push @result,[$lparid, join('/', @t), $Rc];
|
||||
if( defined($msg)) {
|
||||
push @result,[$node_name, $msg, 0];
|
||||
} else {
|
||||
# get the I/O slot information
|
||||
if($request->{opt}->{l} and $type =~ /^(fsp|cec)$/) {
|
||||
$lpar_infos = get_cec_lpar_info($node_name, $d);
|
||||
if (ref($lpar_infos) eq 'ARRAY') {
|
||||
return $lpar_infos;
|
||||
}
|
||||
}
|
||||
my $v;
|
||||
my @t;
|
||||
my @value = split(/\n/, $values);
|
||||
foreach my $v (@value) {
|
||||
my ($lparid, @t ) = split (/,/, $v);
|
||||
my $lparname = undef;
|
||||
if ($request->{opt}->{l}) {
|
||||
if ($type =~ /^(fsp|cec)$/) {
|
||||
$lparname = get_cec_lpar_name($node_name, $lpar_infos, $lparid);
|
||||
} else {
|
||||
$lparname = get_lpar_lpar_name($node_name, $d);
|
||||
}
|
||||
if (ref($lparname) eq 'ARRAY') {
|
||||
return $lparname;
|
||||
} else {
|
||||
$lparname = "$lparname: $lparid";
|
||||
}
|
||||
} else {
|
||||
$lparname = $lparid;
|
||||
}
|
||||
if ($type=~/^(fsp|cec)$/) {
|
||||
push @result,[$lparname, join('/', @t), $Rc];
|
||||
} else {
|
||||
if( $lparid eq $id) {
|
||||
push @result,[$lparname, join('/', @t), $Rc];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -918,7 +1065,7 @@ sub create {
|
||||
if ( $Rc != 0 ) {
|
||||
return( [[$cec_name,$$values[0],$Rc]] );
|
||||
}
|
||||
my @v = split(/:/, @$values[0]);
|
||||
my @v = split(/:/, $$values[0]);
|
||||
$octant_cfg->{pendingpumpmode} = $v[0];
|
||||
|
||||
|
||||
@@ -991,8 +1138,8 @@ sub create {
|
||||
|
||||
#$values = xCAT::FSPUtils::fsp_api_create_parttion( $starting_lpar_id, $octant_cfg, $node_number, $d, "set_octant_cfg");
|
||||
$values = xCAT::FSPUtils::fsp_api_action ($cec_name, $d, "set_octant_cfg", 0, $parameters);
|
||||
my $Rc = @$values[2];
|
||||
my $data = @$values[1];
|
||||
my $Rc = $$values[2];
|
||||
my $data = $$values[1];
|
||||
if ( $Rc != SUCCESS ) {
|
||||
push @result, [$cec_name,$data,$Rc];
|
||||
} else {
|
||||
@@ -1137,7 +1284,7 @@ sub chvm {
|
||||
|
||||
|
||||
##########################################################################
|
||||
# No rmvm for P7 IH
|
||||
# No rmvm for Power 775
|
||||
##########################################################################
|
||||
#sub rmvm {
|
||||
# return( remove(@_) );
|
||||
|
||||
@@ -16,8 +16,7 @@ This module contains all the global info for xCAT.
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
# valid values for nodelist.nodetype column
|
||||
$::NODETYPE_OSI="osi";
|
||||
# valid values for nodelist.hwtype column
|
||||
$::NODETYPE_LPAR="lpar";
|
||||
$::NODETYPE_BPA="bpa";
|
||||
$::NODETYPE_FSP="fsp";
|
||||
@@ -26,6 +25,11 @@ $::NODETYPE_IVM="ivm";
|
||||
$::NODETYPE_FRAME="frame";
|
||||
$::NODETYPE_CEC="cec";
|
||||
|
||||
# valid values for nodelist.nodetype column
|
||||
$::NODETYPE_OSI="osi";
|
||||
$::NODETYPE_PPC="ppc";
|
||||
$::NODETYPE_ZVM="zvm";
|
||||
|
||||
# valid values for nodelist.status columns or other status
|
||||
$::STATUS_ACTIVE="alive";
|
||||
$::STATUS_INACTIVE="unreachable";
|
||||
|
||||
@@ -202,6 +202,10 @@ sub is_me
|
||||
my $nameIP = xCAT::NetworkUtils->getipaddr($name);
|
||||
chomp $nameIP;
|
||||
|
||||
# shut off verbose - just for this routine
|
||||
my $verb = $::VERBOSE;
|
||||
$::VERBOSE = 0;
|
||||
|
||||
# split into octets
|
||||
#my ($b1, $b2, $b3, $b4) = split /\./, $nameIP;
|
||||
|
||||
@@ -213,6 +217,7 @@ sub is_me
|
||||
my $rsp;
|
||||
# push @{$rsp->{data}}, "Could not run $ifcmd.\n";
|
||||
# xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
$::VERBOSE = $verb;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -225,9 +230,11 @@ sub is_me
|
||||
|
||||
if ($myIP eq $nameIP)
|
||||
{
|
||||
$::VERBOSE = $verb;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
$::VERBOSE = $verb;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -355,9 +362,11 @@ sub get_nim_attr_val
|
||||
xCAT::InstUtils->xcmd($callback, $sub_req, "xdsh", $target, $cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $rsp;
|
||||
push @{$rsp->{data}}, "Could not run lsnim command: \'$cmd\'.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
if ($::VERBOSE) {
|
||||
my $rsp;
|
||||
push @{$rsp->{data}}, "Could not run lsnim command: \'$cmd\'.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $callback);
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
|
||||
@@ -785,6 +794,10 @@ sub dolitesetup
|
||||
%imghash = %$imagehash;
|
||||
}
|
||||
|
||||
# get name as known by xCAT
|
||||
my $Sname = xCAT::InstUtils->myxCATname();
|
||||
chomp $Sname;
|
||||
|
||||
my @nodelist;
|
||||
my @nodel;
|
||||
my @nl;
|
||||
@@ -833,7 +846,7 @@ sub dolitesetup
|
||||
}
|
||||
|
||||
# get spot inst_root loc
|
||||
my $spotloc = xCAT::InstUtils->get_nim_attr_val($imghash{$imagename}{spot}, 'location', $callback, "", $subreq);
|
||||
my $spotloc = xCAT::InstUtils->get_nim_attr_val($imghash{$imagename}{spot}, 'location', $callback, $Sname, $subreq);
|
||||
|
||||
my $instrootloc = $spotloc . "/lpp/bos/inst_root";
|
||||
|
||||
@@ -1277,7 +1290,7 @@ sub dolitesetup
|
||||
my $nimprime = xCAT::InstUtils->getnimprime();
|
||||
chomp $nimprime;
|
||||
# get the location of the shared_root directory
|
||||
my $SRloc = xCAT::InstUtils->get_nim_attr_val($imghash{$imagename}{shared_root}, 'location', $callback, $nimprime, $subreq);
|
||||
my $SRloc = xCAT::InstUtils->get_nim_attr_val($imghash{$imagename}{shared_root}, 'location', $callback, $Sname, $subreq);
|
||||
|
||||
# copy the statelite table file to the shared root location
|
||||
# this will not effect any running nodes that are using
|
||||
@@ -1329,5 +1342,23 @@ sub dolitesetup
|
||||
return 0;
|
||||
}
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
=head3 convert_xcatmaster
|
||||
|
||||
Convert the keyword <xcatmaster> of nameservers attr in site/networks table to IP address.
|
||||
(Either the management node or a service node)
|
||||
|
||||
=cut
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
sub convert_xcatmaster
|
||||
{
|
||||
my $shorthost = xCAT::InstUtils->myxCATname();
|
||||
my $selfip = xCAT::NetworkUtils->getipaddr($shorthost);
|
||||
|
||||
return $selfip;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#!/usr/bin/perl
|
||||
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
||||
package xCAT::MacMap;
|
||||
require Exporter;
|
||||
our @ISA=qw/Exporter/;
|
||||
our @EXPORT_OK=qw/walkoid/;
|
||||
use strict;
|
||||
use xCAT::Table;
|
||||
use xCAT::Utils;
|
||||
|
||||
@@ -260,6 +260,9 @@ sub getipaddr
|
||||
{
|
||||
#return inet_ntoa(inet_aton($iporhost))
|
||||
#TODO, what if no scoket6 support, but passing in a IPv6 hostname?
|
||||
if ($iporhost =~ /:/) { #ipv6
|
||||
die "Attempt to process IPv6 address, but system does not have requisite IPv6 perl support";
|
||||
}
|
||||
my $packed_ip;
|
||||
$iporhost and $packed_ip = inet_aton($iporhost);
|
||||
if (!$packed_ip)
|
||||
|
||||
@@ -39,6 +39,7 @@ my %allgrphash;
|
||||
my $retaincache=0;
|
||||
my $recurselevel=0;
|
||||
|
||||
my @cachedcolumns;
|
||||
#TODO: With a very large nodelist (i.e. 65k or so), deriving the members
|
||||
# of a group is a little sluggish. We may want to put in a mechanism to
|
||||
# maintain a two-way hash anytime nodelist or nodegroup changes, allowing
|
||||
@@ -133,6 +134,22 @@ sub nodesbycriteria {
|
||||
foreach (@{$tables{$tab}}) {
|
||||
push @cols, $_->[0];
|
||||
}
|
||||
if ($tab eq "nodelist") { #fun caching interaction
|
||||
my $neednewcache=0;
|
||||
my $nlcol;
|
||||
foreach $nlcol (@cols) {
|
||||
unless (grep /^$nlcol\z/,@cachedcolumns) {
|
||||
$neednewcache=1;
|
||||
push @cachedcolumns,$nlcol;
|
||||
}
|
||||
}
|
||||
if ($neednewcache) {
|
||||
if ($nodelist) {
|
||||
$nodelist->_clear_cache();
|
||||
$nodelist->_build_cache(\@cachedcolumns);
|
||||
}
|
||||
}
|
||||
}
|
||||
my $rechash = $tabh->getNodesAttribs($nodes,\@cols); #TODO: if not defined nodes, getAllNodesAttribs may be faster actually...
|
||||
foreach my $node (@$nodes) {
|
||||
my $recs = $rechash->{$node};
|
||||
@@ -518,7 +535,8 @@ sub noderange {
|
||||
unless ($nodelist) {
|
||||
$nodelist =xCAT::Table->new('nodelist',-create =>1);
|
||||
$nodelist->_set_use_cache(0); #TODO: a more proper external solution
|
||||
$nodelist->_build_cache(['node','groups']);
|
||||
@cachedcolumns = ('node','groups');
|
||||
$nodelist->_build_cache(\@cachedcolumns);
|
||||
$nodelist->_set_use_cache(1); #TODO: a more proper external solution
|
||||
}
|
||||
my %nodes = ();
|
||||
|
||||
@@ -187,7 +187,8 @@ sub do_rnetboot {
|
||||
#######################################
|
||||
# Network specified
|
||||
#######################################
|
||||
$cmd.= " -s auto -d auto -m $mac -S $opt->{S} -C $opt->{C} -N $opt->{N}";
|
||||
my $mac_a = lc($mac);
|
||||
$cmd.= " -s auto -d auto -m $mac_a -S $opt->{S} -C $opt->{C} -N $opt->{N}";
|
||||
if (defined($opt->{G}))
|
||||
{
|
||||
$cmd.= " -G $opt->{G}";
|
||||
|
||||
+74
-16
@@ -43,7 +43,10 @@ sub parse_args {
|
||||
"admin_passwd",
|
||||
"general_passwd",
|
||||
"*_passwd",
|
||||
"hostname"
|
||||
"hostname",
|
||||
"resetnet",
|
||||
"dev",
|
||||
"celogin1"
|
||||
);
|
||||
my @bpa = (
|
||||
"frame",
|
||||
@@ -53,7 +56,10 @@ sub parse_args {
|
||||
"admin_passwd",
|
||||
"general_passwd",
|
||||
"*_passwd",
|
||||
"hostname"
|
||||
"hostname",
|
||||
"resetnet",
|
||||
"dev",
|
||||
"celogin1"
|
||||
);
|
||||
my @ppc = (
|
||||
"sshcfg"
|
||||
@@ -69,18 +75,24 @@ sub parse_args {
|
||||
#############################################
|
||||
# Get support command list
|
||||
#############################################
|
||||
my $sitetab = xCAT::Table->new( 'nodetype' );
|
||||
#my $typetab = xCAT::Table->new( 'nodetype' );
|
||||
#my $nodes = $request->{node};
|
||||
#foreach (@$nodes) {
|
||||
# if ( defined( $typetab )) {
|
||||
# my ($ent) = $typetab->getAttribs({ node=>$_},'nodetype');
|
||||
# if ( defined($ent) ) {
|
||||
# $request->{hwtype} = $ent->{nodetype};
|
||||
# last;
|
||||
# }
|
||||
#
|
||||
# }
|
||||
#
|
||||
#}
|
||||
|
||||
my $nodes = $request->{node};
|
||||
foreach (@$nodes) {
|
||||
if ( defined( $sitetab )) {
|
||||
my ($ent) = $sitetab->getAttribs({ node=>$_},'nodetype');
|
||||
if ( defined($ent) ) {
|
||||
$request->{hwtype} = $ent->{nodetype};
|
||||
last;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
foreach my $nn (@$nodes) {
|
||||
$request->{hwtype} = xCAT::DBobjUtils->getnodetype($nn);
|
||||
last if ($request->{hwtype});
|
||||
}
|
||||
|
||||
my $supported = $rsp{$request->{hwtype}};
|
||||
@@ -108,7 +120,7 @@ sub parse_args {
|
||||
Getopt::Long::Configure( "bundling" );
|
||||
$request->{method} = undef;
|
||||
|
||||
if ( !GetOptions( \%opt, qw(V|Verbose) )) {
|
||||
if ( !GetOptions( \%opt, qw(V|Verbose resetnet))) {
|
||||
return( usage() );
|
||||
}
|
||||
####################################
|
||||
@@ -128,7 +140,7 @@ sub parse_args {
|
||||
####################################
|
||||
foreach my $arg ( @ARGV ) {
|
||||
my ($command,$value) = split( /=/, $arg );
|
||||
if ( !grep( /^$command$/, @$supported )) {
|
||||
if ( !grep( /^$command$/, @$supported) and !$opt{resetnet}) {
|
||||
return(usage( "Invalid command: $arg" ));
|
||||
}
|
||||
if ( exists( $cmds{$command} )) {
|
||||
@@ -148,6 +160,12 @@ sub parse_args {
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
my $result = parse_dev_option( $request, \%cmds);
|
||||
if ($result) {
|
||||
return ( usage($result));
|
||||
}
|
||||
}
|
||||
####################################
|
||||
# Return method to invoke
|
||||
####################################
|
||||
@@ -163,6 +181,14 @@ sub parse_args {
|
||||
$request->{method} = "cfg";
|
||||
return( \%opt );
|
||||
}
|
||||
####################################
|
||||
# Return method to invoke
|
||||
####################################
|
||||
if ( $opt{resetnet} ) {
|
||||
$request->{hcp} = "hmc";
|
||||
$request->{method} = "resetnet";
|
||||
return( \%opt );
|
||||
}
|
||||
|
||||
####################################
|
||||
# Return method to invoke
|
||||
@@ -178,6 +204,24 @@ sub parse_args {
|
||||
}
|
||||
|
||||
|
||||
sub parse_dev_option{
|
||||
my $req = shift;
|
||||
my $cmds = shift;
|
||||
foreach my $cmd (keys %$cmds) {
|
||||
if ( $cmd =~ /^(dev|celogin1)$/ ) {
|
||||
if ($cmds->{$cmd} and ($cmds->{$cmd} !~ /^(enable|disable)$/i) ) {
|
||||
return( "Invalid argument ".$cmds->{$cmd}." for ".$cmd );
|
||||
}
|
||||
$req->{dev} = 1;
|
||||
} else {
|
||||
$req->{other} = 1;
|
||||
}
|
||||
}
|
||||
if ($req->{dev} eq '1' && $req->{other} eq '1') {
|
||||
return ("Invalid command arrays");
|
||||
}
|
||||
return undef;
|
||||
}
|
||||
##########################################################################
|
||||
# Parse the command line optional arguments
|
||||
##########################################################################
|
||||
@@ -392,7 +436,7 @@ sub sshcfg {
|
||||
# Find logon in key file
|
||||
#################################
|
||||
foreach ( @$result ) {
|
||||
if ( /= $logon$/ ) {
|
||||
if ( /$logon$/ ) {
|
||||
return( [[$server,"enabled",SUCCESS]] );
|
||||
}
|
||||
}
|
||||
@@ -580,6 +624,20 @@ sub hostname {
|
||||
|
||||
return( [@$result] );
|
||||
}
|
||||
##########################################################################
|
||||
# Do resetnet
|
||||
##########################################################################
|
||||
sub resetnet {
|
||||
my $request = shift;
|
||||
my $hash = shift;
|
||||
my %nodehash;
|
||||
foreach ( @{$request->{noderange}}) {
|
||||
$nodehash{$_} = 1;
|
||||
}
|
||||
# go to use lsslp do_resetnet
|
||||
my $result = xCAT_plugin::lsslp::do_resetnet($request, \%nodehash);
|
||||
return [$result];
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
|
||||
+23
-13
@@ -33,6 +33,7 @@ my %lssyscfg = (
|
||||
fsps =>"lssyscfg -r sys -F %s",
|
||||
node =>"lssyscfg -r lpar -m %s -F %s --filter lpar_ids=%s",
|
||||
lpar =>"lssyscfg -r lpar -m %s -F %s",
|
||||
lpar2 =>"lssyscfg -r lpar -m %s --filter %s",
|
||||
bpa =>"lssyscfg -r frame -e %s -F %s",
|
||||
frame =>"lssyscfg -r frame -e %s -F %s",
|
||||
bpas =>"lssyscfg -r frame -F %s",
|
||||
@@ -44,7 +45,9 @@ my %lssyscfg = (
|
||||
my %chsyscfg = (
|
||||
prof =>"chsyscfg -r prof -m %s -i %s",
|
||||
bpa =>"chsyscfg -r frame -e %s -i %s",
|
||||
fsp =>"chsyscfg -r sys -m %s -i %s"
|
||||
fsp =>"chsyscfg -r sys -m %s -i %s",
|
||||
frame =>"chsyscfg -r frame -e %s -i %s",
|
||||
cec =>"chsyscfg -r sys -m %s -i %s",
|
||||
);
|
||||
|
||||
##############################################
|
||||
@@ -966,7 +969,7 @@ sub mkauthkeys {
|
||||
# When adding, remove old keys first
|
||||
#####################################
|
||||
foreach ( @$result ) {
|
||||
unless ( /= $logon$/ ) {
|
||||
unless ( /$logon$/ ) {
|
||||
push @authkey, $_;
|
||||
}
|
||||
}
|
||||
@@ -1322,21 +1325,28 @@ sub getHMCcontrolIP
|
||||
}
|
||||
my $serial = $ent->{'serial'};
|
||||
my $mtm = $ent->{'mtm'};
|
||||
my $mtms = $mtm . '*' . $serial;
|
||||
my $nodes_found = lssyscfg( $exp, "$type", "$mtms");
|
||||
#my $mtms = $mtm . '*' . $serial;
|
||||
#my $nodes_found = lssyscfg( $exp, "$type", "$mtms");
|
||||
my $nodes_found = lssysconn ($exp, "all");
|
||||
my @ips;
|
||||
my $ip_result;
|
||||
if ( @$nodes_found[0] eq SUCCESS ) {
|
||||
my $Rc = shift(@$nodes_found);
|
||||
#foreach my $mtms ( @$nodes_found ) {
|
||||
my @newnodes = split(/,/, $nodes_found->[0]);
|
||||
$Rc = shift(@newnodes);
|
||||
for my $entry (@newnodes) {
|
||||
if(xCAT::Utils->isIpaddr($entry)) {
|
||||
push @ips,$entry;
|
||||
}
|
||||
$ip_result = join( ",", @ips );
|
||||
}
|
||||
#my @newnodes = split(/,/, $nodes_found->[0]);
|
||||
#$Rc = shift(@newnodes);
|
||||
#for my $entry (@newnodes) {
|
||||
# if(xCAT::Utils->isIpaddr($entry)) {
|
||||
# push @ips,$entry;
|
||||
# }
|
||||
# $ip_result = join( ",", @ips );
|
||||
#}
|
||||
foreach my $entry ( @$nodes_found ) {
|
||||
if ( $entry =~ /$mtm\*$serial/) {
|
||||
$entry =~ /ipaddr=(\d+\.\d+\.\d+\.\d+),/;
|
||||
push @ips, $1;
|
||||
}
|
||||
}
|
||||
$ip_result = join( ",", @ips );
|
||||
}
|
||||
return $ip_result;
|
||||
}
|
||||
|
||||
+40
-31
@@ -55,32 +55,35 @@ sub mkhwconn_parse_args
|
||||
$Getopt::Long::ignorecase = 0;
|
||||
Getopt::Long::Configure( "bundling" );
|
||||
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help t p=s P=s port=s s) )) {
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help t p=s P=s port=s s:s) )) {
|
||||
return( usage() );
|
||||
}
|
||||
return usage() if ( exists $opt{h});
|
||||
|
||||
#if ( exists $opt{s} )
|
||||
#{
|
||||
# return( usage('Flags -s is just used in direct-attach enviroment.'));
|
||||
#}
|
||||
|
||||
if ( exists $opt{t} and exists $opt{p})
|
||||
if ( !exists $opt{t} and !exists $opt{p} and !exists $opt{s}) {
|
||||
return ( usage('Flag -t or -p or -s must be used.'));
|
||||
}
|
||||
|
||||
if (( exists $opt{t} and exists $opt{p}) or (exists $opt{s} and exists $opt{p}) or (exists $opt{t} and exists $opt{p}))
|
||||
{
|
||||
return( usage('Flags -t and -p cannot be used together.'));
|
||||
}
|
||||
|
||||
if ( exists $opt{P} and ! exists $opt{p})
|
||||
if ( exists $opt{P} and (!exists $opt{p} and !exists $opt{s}))
|
||||
{
|
||||
return( usage('Flags -P can only be used when flag -p is specified.'));
|
||||
}
|
||||
|
||||
##########################################
|
||||
# Find the sfp for the mkhwconn -s
|
||||
##########################################
|
||||
$request->{sfp} = $opt{s};
|
||||
##########################################
|
||||
# Check if CECs are controlled by a frame
|
||||
##########################################
|
||||
my $nodes = $request->{node};
|
||||
my $ppctab = xCAT::Table->new( 'ppc' );
|
||||
my $nodetypetab = xCAT::Table->new( 'nodetype');
|
||||
#my $nodetypetab = xCAT::Table->new( 'nodetype');
|
||||
my $vpdtab = xCAT::Table->new( 'vpd');
|
||||
my @bpa_ctrled_nodes = ();
|
||||
my @no_type_nodes = ();
|
||||
@@ -91,9 +94,10 @@ sub mkhwconn_parse_args
|
||||
{
|
||||
my $node_parent = undef;
|
||||
my $nodetype = undef;
|
||||
my $nodetype_hash = $nodetypetab->getNodeAttribs( $node,[qw(nodetype)]);
|
||||
#my $nodetype_hash = $nodetypetab->getNodeAttribs( $node,[qw(nodetype)]);
|
||||
my $node_parent_hash = $ppctab->getNodeAttribs( $node,[qw(parent)]);
|
||||
$nodetype = $nodetype_hash->{nodetype};
|
||||
#$nodetype = $nodetype_hash->{nodetype};
|
||||
$nodetype = xCAT::DBobjUtils->getnodetype($node);
|
||||
$node_parent = $node_parent_hash->{parent};
|
||||
if ( !$nodetype )
|
||||
{
|
||||
@@ -147,7 +151,7 @@ sub mkhwconn_parse_args
|
||||
if ( $nodetype eq 'frame')
|
||||
{
|
||||
my $my_frame_bpa_cec = xCAT::DBobjUtils::getcecchildren( $node) ;
|
||||
push @frame_members, @$my_frame_bpa_cec;
|
||||
push @frame_members, @$my_frame_bpa_cec if($my_frame_bpa_cec);
|
||||
push @frame_members, $node;
|
||||
}
|
||||
}
|
||||
@@ -164,7 +168,7 @@ sub mkhwconn_parse_args
|
||||
my $tmp_nodelist = join ',', @bpa_ctrled_nodes;
|
||||
return ( usage("Node(s) $tmp_nodelist is(are) controlled by BPA."));
|
||||
}
|
||||
|
||||
|
||||
if ( scalar( @frame_members))
|
||||
{
|
||||
my @all_nodes = xCAT::Utils::get_unique_members( @$nodes, @frame_members);
|
||||
@@ -252,7 +256,7 @@ sub lshwconn_parse_args
|
||||
$Getopt::Long::ignorecase = 0;
|
||||
Getopt::Long::Configure( "bundling" );
|
||||
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help) )) {
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help s) )) {
|
||||
return( usage() );
|
||||
}
|
||||
return usage() if ( exists $opt{h});
|
||||
@@ -261,13 +265,15 @@ sub lshwconn_parse_args
|
||||
# Process command-line arguments
|
||||
#############################################
|
||||
if ( scalar( @ARGV)) {
|
||||
unless( $opt{s}) {
|
||||
return(usage( "No additional flag is support by this command" ));
|
||||
}
|
||||
}
|
||||
my $nodetypetab = xCAT::Table->new('nodetype');
|
||||
if (! $nodetypetab)
|
||||
{
|
||||
return( ["Failed to open table 'nodetype'.\n"]);
|
||||
}
|
||||
#my $nodetypetab = xCAT::Table->new('nodetype');
|
||||
#if (! $nodetypetab)
|
||||
#{
|
||||
# return( ["Failed to open table 'nodetype'.\n"]);
|
||||
#}
|
||||
my $nodehmtab = xCAT::Table->new('nodehm');
|
||||
if (! $nodehmtab)
|
||||
{
|
||||
@@ -277,9 +283,10 @@ sub lshwconn_parse_args
|
||||
my $nodetype;
|
||||
for my $node ( @{$request->{node}})
|
||||
{
|
||||
my $ent = $nodetypetab->getNodeAttribs( $node, [qw(nodetype)]);
|
||||
#my $ent = $nodetypetab->getNodeAttribs( $node, [qw(nodetype)]);
|
||||
my $ttype = xCAT::DBobjUtils->getnodetype($node);
|
||||
my $nodehm = $nodehmtab->getNodeAttribs( $node, [qw(mgt)]);
|
||||
if ( ! $ent)
|
||||
if ( ! $ttype)
|
||||
{
|
||||
return( ["Failed to get node type for node $node.\n"]);
|
||||
}
|
||||
@@ -291,19 +298,19 @@ sub lshwconn_parse_args
|
||||
{
|
||||
return( ["lshwconn can only support HMC nodes, or nodes managed by HMC, i.e. nodehm.mgt should be 'hmc'. Please make sure node $node has correect nodehm.mgt and ppc.hcp value.\n"]);
|
||||
}
|
||||
if ( $ent->{nodetype} ne 'hmc'
|
||||
and $ent->{nodetype} ne 'fsp' and $ent->{nodetype} ne 'cec'
|
||||
and $ent->{nodetype} ne 'bpa' and $ent->{nodetype} ne 'frame')
|
||||
if ( $ttype ne 'hmc'
|
||||
and $ttype ne 'fsp' and $ttype ne 'cec'
|
||||
and $ttype ne 'bpa' and $ttype ne 'frame')
|
||||
{
|
||||
return( ["Node type $ent->{nodetype} is not supported for this command.\n"]);
|
||||
return( ["Node type $ttype is not supported for this command.\n"]);
|
||||
}
|
||||
if ( ! $nodetype)
|
||||
{
|
||||
$nodetype = $ent->{nodetype};
|
||||
$nodetype = $ttype;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( $nodetype ne $ent->{nodetype})
|
||||
if ( $nodetype ne $ttype)
|
||||
{
|
||||
return( ["Cannot support multiple node types in this command line.\n"]);
|
||||
}
|
||||
@@ -336,7 +343,7 @@ sub rmhwconn_parse_args
|
||||
$Getopt::Long::ignorecase = 0;
|
||||
Getopt::Long::Configure( "bundling" );
|
||||
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help) )) {
|
||||
if ( !GetOptions( \%opt, qw(V|verbose h|help s) )) {
|
||||
return( usage() );
|
||||
}
|
||||
return usage() if ( exists $opt{h});
|
||||
@@ -345,7 +352,9 @@ sub rmhwconn_parse_args
|
||||
# Process command-line arguments
|
||||
#############################################
|
||||
if ( scalar (@ARGV)) {
|
||||
unless( $opt{s}) {
|
||||
return(usage( "No additional flag is support by this command" ));
|
||||
}
|
||||
}
|
||||
##########################################
|
||||
# Check if CECs are controlled by a frame
|
||||
@@ -417,7 +426,7 @@ sub rmhwconn_parse_args
|
||||
my $tmp_nodelist = join ',', @bpa_ctrled_nodes;
|
||||
return ( usage("Node(s) $tmp_nodelist is(are) controlled by BPA."));
|
||||
}
|
||||
|
||||
|
||||
if ( scalar( @frame_members))
|
||||
{
|
||||
my @all_nodes = xCAT::Utils::get_unique_members( @$nodes, @frame_members);
|
||||
@@ -500,7 +509,7 @@ sub mkhwconn
|
||||
my $res = xCAT::PPCcli::mksysconn( $exp, $node_ip, $type, $passwd);
|
||||
$Rc = shift @$res;
|
||||
push @value, [$node_name, @$res[0], $Rc];
|
||||
if ( !$Rc and !$opt->{s})
|
||||
if ( !$Rc and !(exists $opt->{s}))
|
||||
{
|
||||
sethmcmgt( $node_name, $exp->[3]);
|
||||
}
|
||||
@@ -677,7 +686,7 @@ sub rmhwconn
|
||||
my $res = xCAT::PPCcli::rmsysconn( $exp, $type, $nn);
|
||||
$Rc = shift @$res;
|
||||
push @value, [$node_name, @$res[0], $Rc];
|
||||
if ( !$Rc)
|
||||
if ( !$Rc and !$opt->{s})
|
||||
{
|
||||
rmhmcmgt( $node_name, $type);
|
||||
}
|
||||
|
||||
+135
-209
@@ -43,7 +43,25 @@ my %defaultgrp = (
|
||||
cec => "cec",
|
||||
|
||||
);
|
||||
my %globlehwtype = (
|
||||
fsp => $::NODETYPE_FSP,
|
||||
bpa => $::NODETYPE_BPA,
|
||||
lpar => $::NODETYPE_LPAR,
|
||||
hmc => $::NODETYPE_HMC,
|
||||
ivm => $::NODETYPE_IVM,
|
||||
frame => $::NODETYPE_FRAME,
|
||||
cec => $::NODETYPE_CEC,
|
||||
);
|
||||
|
||||
my %globalnodetype = (
|
||||
fsp => $::NODETYPE_PPC,
|
||||
bpa => $::NODETYPE_PPC,
|
||||
cec => $::NODETYPE_PPC,
|
||||
frame=> $::NODETYPE_PPC,
|
||||
hmc => $::NODETYPE_PPC,
|
||||
ivm => $::NODETYPE_PPC,
|
||||
lpar =>"$::NODETYPE_PPC,$::NODETYPE_OSI"
|
||||
);
|
||||
|
||||
##########################################################################
|
||||
# Adds a node to the xCAT databases
|
||||
@@ -56,16 +74,6 @@ sub add_ppc {
|
||||
my $otherinterfaces = shift;
|
||||
my @tabs = qw(ppc vpd nodehm nodelist nodetype hosts mac);
|
||||
my %db = ();
|
||||
my %nodetype = (
|
||||
fsp => $::NODETYPE_FSP,
|
||||
bpa => $::NODETYPE_BPA,
|
||||
lpar =>"$::NODETYPE_LPAR,$::NODETYPE_OSI",
|
||||
hmc => $::NODETYPE_HMC,
|
||||
ivm => $::NODETYPE_IVM,
|
||||
frame => $::NODETYPE_FRAME,
|
||||
cec => $::NODETYPE_CEC,
|
||||
);
|
||||
|
||||
###################################
|
||||
# Open database needed
|
||||
###################################
|
||||
@@ -94,8 +102,11 @@ sub add_ppc {
|
||||
###############################
|
||||
# Update nodetype table
|
||||
###############################
|
||||
if ( $type =~ /^(fsp|bpa|lpar|hmc|ivm|frame|cec)$/ ) {
|
||||
$db{nodetype}->setNodeAttribs( $name,{nodetype=>$nodetype{$type}} );
|
||||
if ( $type =~ /^(fsp|bpa|hmc|ivm|frame|cec)$/ ) {
|
||||
$db{nodetype}->setNodeAttribs( $name,{nodetype=>'ppc'} );
|
||||
$db{nodetype}{commit} = 1;
|
||||
} elsif ($type =~ /^lpar$/) {
|
||||
$db{nodetype}->setNodeAttribs( $name,{nodetype=>'ppc,osi'} );
|
||||
$db{nodetype}{commit} = 1;
|
||||
}
|
||||
###############################
|
||||
@@ -147,7 +158,7 @@ sub add_ppc {
|
||||
id=>$id,
|
||||
pprofile=>$pprofile,
|
||||
parent=>$parent,
|
||||
nodetype=>$nodetype{$type},
|
||||
nodetype=>$globlehwtype{$type},
|
||||
});
|
||||
$db{ppc}{commit} = 1;
|
||||
|
||||
@@ -176,14 +187,20 @@ sub add_ppc {
|
||||
###############################
|
||||
# Update vpd table
|
||||
###############################
|
||||
if ( $type =~ /^(fsp|bpa|frame|cec)$/ ) {
|
||||
if ( $type =~ /^(fsp|bpa)$/ ) {
|
||||
$db{vpd}->setNodeAttribs( $name,
|
||||
{ mtm=>$model,
|
||||
serial=>$serial,
|
||||
side=>$side
|
||||
});
|
||||
$db{vpd}{commit} = 1;
|
||||
}
|
||||
if ( $type =~ /^(frame|cec)$/ ) {
|
||||
$db{vpd}->setNodeAttribs( $name,
|
||||
{ mtm=>$model,
|
||||
serial=>$serial,
|
||||
});
|
||||
}
|
||||
$db{vpd}{commit} = 1;
|
||||
|
||||
###############################
|
||||
# Update hosts table
|
||||
@@ -228,15 +245,7 @@ sub update_ppc {
|
||||
my $not_overwrite = shift;
|
||||
my @tabs = qw(ppc vpd nodehm nodelist nodetype ppcdirect hosts mac);
|
||||
my %db = ();
|
||||
my %nodetype = (
|
||||
fsp => $::NODETYPE_FSP,
|
||||
bpa => $::NODETYPE_BPA,
|
||||
lpar =>"$::NODETYPE_LPAR,$::NODETYPE_OSI",
|
||||
hmc => $::NODETYPE_HMC,
|
||||
ivm => $::NODETYPE_IVM,
|
||||
);
|
||||
my @update_list = ();
|
||||
my @create_list = ();
|
||||
|
||||
###################################
|
||||
# Open database needed
|
||||
@@ -253,58 +262,6 @@ sub update_ppc {
|
||||
'pprofile','parent','supernode',
|
||||
'comments', 'disable']);
|
||||
my @maclist = $db{mac}->getAllNodeAttribs(['node','mac']);
|
||||
|
||||
###################################
|
||||
# By pass the CEC/Frame with same
|
||||
# mtms and node name
|
||||
###################################
|
||||
my %cec_frame_hash = ();
|
||||
foreach my $value ( @$values ) {
|
||||
my ($ttype,
|
||||
$tname,
|
||||
$tid,
|
||||
$tmtm,
|
||||
$tsn,
|
||||
$tside,
|
||||
$server,
|
||||
$pprofile,
|
||||
$parent,
|
||||
$ips ) = split /,/, $value;
|
||||
|
||||
if ( $ttype ne 'cec' && $ttype ne 'frame' )
|
||||
{
|
||||
next;
|
||||
}
|
||||
|
||||
foreach my $vpdent (@vpdlist) {
|
||||
my $type = xCAT::DBobjUtils::getnodetype($vpdent->{node});
|
||||
if ( $vpdent->{mtm} eq $tmtm && $vpdent->{serial} eq $tsn && $type eq $ttype) {
|
||||
$cec_frame_hash{$tmtm*$tsn} = $tname;
|
||||
}
|
||||
}
|
||||
|
||||
foreach my $vpdent (@vpdlist) {
|
||||
my $type = xCAT::DBobjUtils::getnodetype($vpdent->{node});
|
||||
if ( $vpdent->{mtm} eq $tmtm && $vpdent->{serial} eq $tsn ) {
|
||||
if ( $type eq $ttype ) {
|
||||
if ( $vpdent->{node} ne $tname ) {
|
||||
if ( update_node_attribs($hwtype, $ttype, $tname, $tid, $tmtm, $tsn, $tside,
|
||||
$server, $pprofile, $parent, $ips, \%db, $vpdent->{node}, \@ppclist))
|
||||
{
|
||||
push @update_list, $value;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ( !$cec_frame_hash{$tmtm*$tsn} ) {
|
||||
push @create_list, $value;
|
||||
}
|
||||
}
|
||||
$cec_frame_hash{$tmtm*$tsn} = $tname;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
###################################
|
||||
# Need to do database migration first
|
||||
###################################
|
||||
@@ -322,127 +279,111 @@ sub update_ppc {
|
||||
|
||||
if ( $ttype eq 'cec' )
|
||||
{
|
||||
foreach my $vpdent (@vpdlist) {
|
||||
my $type = xCAT::DBobjUtils::getnodetype($vpdent->{node});
|
||||
if ( $vpdent->{mtm} eq $tmtm && $vpdent->{serial} eq $tsn && $type eq 'fsp' ) {
|
||||
my $newname = $vpdent->{node};
|
||||
if ( $vpdent->{node} eq $tname ) {
|
||||
if ( $vpdent->{side} =~ /^(A|B)$/ ) {
|
||||
$newname = $tname . "-" . $vpdent->{side};
|
||||
}
|
||||
}
|
||||
|
||||
my $pparent = $cec_frame_hash{$tmtm*$tsn};
|
||||
if ( update_node_attribs($hwtype, $type, $newname, $tid, $tmtm, $tsn, $tside,
|
||||
$server, $pprofile, $pparent, $ips, \%db, $vpdent->{node}, 1, \@ppclist))
|
||||
{
|
||||
push @update_list, $value;
|
||||
}
|
||||
my $hostname = xCAT_plugin::lsslp::gethost_from_url_or_old($tname, "FSP", $tmtm, $tsn, "", "", $tid, "","");
|
||||
if ($hostname ne $tname)
|
||||
{
|
||||
$hostname =~ /\-(\w)$/;
|
||||
if ($1 =~ /^(A|B)$/)
|
||||
{
|
||||
$tside = $1;
|
||||
}
|
||||
if ( update_node_attribs($hwtype, $ttype, $hostname, $tid, $tmtm, $tsn, $tside,
|
||||
$server, $pprofile, $parent, $ips, \%db, $tname, \@ppclist))
|
||||
{
|
||||
push @update_list, $value;
|
||||
}
|
||||
}
|
||||
} elsif ( $ttype eq 'frame' )
|
||||
{
|
||||
foreach my $vpdent (@vpdlist) {
|
||||
my $type = xCAT::DBobjUtils::getnodetype($vpdent->{node});
|
||||
if ( $vpdent->{mtm} eq $tmtm && $vpdent->{serial} eq $tsn && $type eq 'bpa' ) {
|
||||
my $newname = $vpdent->{node};
|
||||
if ( $vpdent->{node} eq $tname ) {
|
||||
if ( $vpdent->{side} =~ /^(A|B)$/ ) {
|
||||
$newname = $tname . "-" . $vpdent->{side};
|
||||
}
|
||||
}
|
||||
|
||||
my $pparent = $cec_frame_hash{$tmtm*$tsn};
|
||||
if ( update_node_attribs($hwtype, $type, $newname, $tid, $tmtm, $tsn, $tside,
|
||||
$server, $pprofile, $pparent, $ips, \%db, $vpdent->{node}, 1, \@ppclist))
|
||||
{
|
||||
push @update_list, $value;
|
||||
}
|
||||
my $hostname = xCAT_plugin::lsslp::gethost_from_url_or_old($tname, "BPA", $tmtm, $tsn, "", "", $tid, "","");
|
||||
if ($hostname ne $tname)
|
||||
{
|
||||
$hostname =~ /\-(\w)$/;
|
||||
if ($1 =~ /^(A|B)$/)
|
||||
{
|
||||
$tside = $1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( update_node_attribs($hwtype, $ttype, $hostname, $tid, $tmtm, $tsn, $tside,
|
||||
$server, $pprofile, $parent, $ips, \%db, $tname, \@ppclist))
|
||||
{
|
||||
push @update_list, $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
###################################
|
||||
# Add the CEC/Frame object if they
|
||||
# are not existing.
|
||||
# Update CEC in tables
|
||||
###################################
|
||||
add_ppc($hwtype, \@create_list);
|
||||
foreach my $value ( @$values ) {
|
||||
my ($type,
|
||||
$name,
|
||||
$id,
|
||||
$model,
|
||||
$serial,
|
||||
$side,
|
||||
$server,
|
||||
$pprofile,
|
||||
$parent,
|
||||
$ips ) = split /,/, $value;
|
||||
|
||||
next if ( $type ne 'cec' );
|
||||
|
||||
my $predefined_node = undef;
|
||||
foreach my $vpdent (@vpdlist)
|
||||
{
|
||||
if ( $vpdent->{mtm} eq $model && $vpdent->{serial} eq $serial )
|
||||
{
|
||||
$predefined_node = $vpdent->{node};
|
||||
if ( update_node_attribs($hwtype, $type, $name, $id, $model, $serial, $side,
|
||||
$server, $pprofile, $parent, $ips,
|
||||
\%db, $predefined_node, \@ppclist))
|
||||
{
|
||||
push @update_list, $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
# ###################################
|
||||
# # Update CEC in tables
|
||||
# ###################################
|
||||
# foreach my $value ( @$values ) {
|
||||
# my ($type,
|
||||
# $name,
|
||||
# $id,
|
||||
# $model,
|
||||
# $serial,
|
||||
# $side,
|
||||
# $server,
|
||||
# $pprofile,
|
||||
# $parent,
|
||||
# $ips ) = split /,/, $value;
|
||||
#
|
||||
# next if ( $type ne 'cec' );
|
||||
my @newppclist = $db{ppc}->getAllNodeAttribs(['node','hcp','id',
|
||||
'pprofile','parent','supernode',
|
||||
'comments', 'disable']);
|
||||
###################################
|
||||
# Update FRAME in tables
|
||||
###################################
|
||||
foreach my $value ( @$values ) {
|
||||
my ($type,
|
||||
$name,
|
||||
$id,
|
||||
$model,
|
||||
$serial,
|
||||
$side,
|
||||
$server,
|
||||
$pprofile,
|
||||
$parent,
|
||||
$ips ) = split /,/, $value;
|
||||
|
||||
next if ( $type ne 'frame');
|
||||
|
||||
# my $predefined_node = undef;
|
||||
# foreach my $vpdent (@vpdlist)
|
||||
# {
|
||||
# if ( $vpdent->{mtm} eq $model && $vpdent->{serial} eq $serial )
|
||||
# {
|
||||
# $predefined_node = $vpdent->{node};
|
||||
# if ( update_node_attribs($hwtype, $type, $name, $id, $model, $serial, $side,
|
||||
# $server, $pprofile, $parent, $ips,
|
||||
# \%db, $predefined_node, 0, \@ppclist))
|
||||
# {
|
||||
# push @update_list, $value;
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
|
||||
# }
|
||||
|
||||
# my @newppclist = $db{ppc}->getAllNodeAttribs(['node','hcp','id',
|
||||
# 'pprofile','parent','supernode',
|
||||
# 'comments', 'disable']);
|
||||
# ###################################
|
||||
# # Update FRAME in tables
|
||||
# ###################################
|
||||
# foreach my $value ( @$values ) {
|
||||
# my ($type,
|
||||
# $name,
|
||||
# $id,
|
||||
# $model,
|
||||
# $serial,
|
||||
# $side,
|
||||
# $server,
|
||||
# $pprofile,
|
||||
# $parent,
|
||||
# $ips ) = split /,/, $value;
|
||||
#
|
||||
# next if ( $type ne 'frame');
|
||||
|
||||
# my $predefined_node = undef;
|
||||
# foreach my $vpdent (@vpdlist)
|
||||
# {
|
||||
# if ( $vpdent->{mtm} eq $model && $vpdent->{serial} eq $serial && $vpdent->{side} eq $side )
|
||||
# {
|
||||
# $predefined_node = $vpdent->{node};
|
||||
my $predefined_node = undef;
|
||||
foreach my $vpdent (@vpdlist)
|
||||
{
|
||||
if ( $vpdent->{mtm} eq $model && $vpdent->{serial} eq $serial && $vpdent->{side} eq $side )
|
||||
{
|
||||
$predefined_node = $vpdent->{node};
|
||||
|
||||
# if (update_node_attribs($hwtype, $type, $name, $id, $model, $serial, $side,
|
||||
# $server, $pprofile, $parent, $ips,
|
||||
# \%db, $predefined_node, 0, \@newppclist))
|
||||
# {
|
||||
# push @update_list, $value;
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
if (update_node_attribs($hwtype, $type, $name, $id, $model, $serial, $side,
|
||||
$server, $pprofile, $parent, $ips,
|
||||
\%db, $predefined_node, \@newppclist))
|
||||
{
|
||||
push @update_list, $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# }
|
||||
}
|
||||
|
||||
###################################
|
||||
# Commit changes
|
||||
@@ -473,7 +414,6 @@ sub update_node_attribs
|
||||
my $ips = shift;
|
||||
my $db = shift;
|
||||
my $predefined_node = shift;
|
||||
my $hidden = shift;
|
||||
my $ppclist = shift;
|
||||
|
||||
my $updated = undef;
|
||||
@@ -483,12 +423,9 @@ sub update_node_attribs
|
||||
#############################
|
||||
# update vpd table
|
||||
#############################
|
||||
my $vpdhash = $db->{vpd}->getNodeAttribs( $predefined_node, [qw(mtm serial side)]);
|
||||
my $vpdhash = $db->{vpd}->getNodeAttribs( $predefined_node, [qw(mtm serial)]);
|
||||
if ( $model ne $vpdhash->{mtm} or $serial ne $vpdhash->{serial} or $namediff)
|
||||
{
|
||||
if ( !$side ) {
|
||||
$side = $vpdhash->{side};
|
||||
}
|
||||
$db->{vpd}->delEntries( $key_col) if ( $namediff);
|
||||
$db->{vpd}->setNodeAttribs( $name, { mtm=>$model, serial=>$serial, side=>$side});
|
||||
$db->{vpd}->{commit} = 1;
|
||||
@@ -519,17 +456,17 @@ sub update_node_attribs
|
||||
#############################
|
||||
# update ppc table
|
||||
#############################
|
||||
my $ppchash = $db->{ppc}->getNodeAttribs( $predefined_node, [qw(hcp id pprofile parent nodetype)]);
|
||||
my $ppchash = $db->{ppc}->getNodeAttribs( $predefined_node, [qw(hcp id pprofile parent)]);
|
||||
if ( $ppchash->{parent} ne $predefined_node )
|
||||
{
|
||||
$parent = $ppchash->{parent};
|
||||
}
|
||||
|
||||
# if ( $ppchash->{parent} ne $predefined_node )
|
||||
# {
|
||||
# $parent = $ppchash->{parent};
|
||||
# }
|
||||
#
|
||||
if ( $server ne $ppchash->{hcp} or
|
||||
$id ne $ppchash->{id} or
|
||||
$pprofile ne $ppchash->{pprofile} or
|
||||
$parent ne $ppchash->{parent} or
|
||||
$type ne $ppchash->{nodetype} or
|
||||
$namediff)
|
||||
{
|
||||
$db->{ppc}->delEntries( $key_col) if ( $namediff);
|
||||
@@ -538,6 +475,7 @@ sub update_node_attribs
|
||||
id=>$id,
|
||||
pprofile=>$pprofile,
|
||||
parent=>$parent,
|
||||
nodetype=>$globlehwtype{$type},
|
||||
});
|
||||
if ( $namediff)
|
||||
{
|
||||
@@ -546,12 +484,7 @@ sub update_node_attribs
|
||||
next if ($ppcent->{node} eq $predefined_node);
|
||||
if ($ppcent->{parent} eq $predefined_node)
|
||||
{
|
||||
my $type = xCAT::DBobjUtils->getnodetype($predefined_node);
|
||||
if ($type eq 'fsp' or $type eq 'bpa') {
|
||||
$db->{ppc}->setNodeAttribs( $ppcent->{node}, {parent=>$parent});
|
||||
} else {
|
||||
$db->{ppc}->setNodeAttribs( $ppcent->{node}, {parent=>$name});
|
||||
}
|
||||
$db->{ppc}->setNodeAttribs( $ppcent->{node}, {parent=>$name});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -578,7 +511,7 @@ sub update_node_attribs
|
||||
if ( $type ne $nodetypehash->{nodetype} or $namediff)
|
||||
{
|
||||
$db->{nodetype}->delEntries( $key_col) if ( $namediff);
|
||||
$db->{nodetype}->setNodeAttribs( $name,{nodetype=>$type} );
|
||||
$db->{nodetype}->setNodeAttribs( $name,{nodetype=>$globalnodetype{$type}} );
|
||||
$db->{nodetype}->{commit} = 1;
|
||||
$updated = 1;
|
||||
}
|
||||
@@ -586,7 +519,7 @@ sub update_node_attribs
|
||||
###########################
|
||||
# Update nodelist table
|
||||
###########################
|
||||
my $nodelisthash = $db->{nodelist}->getNodeAttribs( $predefined_node, [qw(groups status appstatus primarysn hidden comments disable)]);
|
||||
my $nodelisthash = $db->{nodelist}->getNodeAttribs( $predefined_node, [qw(groups status appstatus primarysn comments disable)]);
|
||||
if ( $namediff)
|
||||
{
|
||||
updategroups( $name, $db->{nodelist}, $type );
|
||||
@@ -594,18 +527,11 @@ sub update_node_attribs
|
||||
appstatus=>$nodelisthash->{appstatus},
|
||||
primarysn=>$nodelisthash->{primarysn},
|
||||
comments=>$nodelisthash->{comments},
|
||||
hidden=>$nodelisthash->{hidden},
|
||||
disable=>$nodelisthash->{disable}
|
||||
});
|
||||
$db->{nodelist}->delEntries( $key_col);
|
||||
$db->{nodelist}->{commit} = 1;
|
||||
$updated = 1;
|
||||
}
|
||||
if ( $hidden ne $nodelisthash->{hidden} )
|
||||
{
|
||||
$db->{nodelist}->setNodeAttribs( $name, {hidden=>$hidden});
|
||||
$db->{nodelist}->{commit} = 1;
|
||||
$updated = 1;
|
||||
}
|
||||
|
||||
###########################
|
||||
@@ -614,7 +540,6 @@ sub update_node_attribs
|
||||
my $hostslisthash = $db->{hosts}->getNodeAttribs( $predefined_node, [qw(ip otherinterfaces)]);
|
||||
if ( $namediff )
|
||||
{
|
||||
$ips = $hostslisthash->{ip} if (!$ips);
|
||||
$db->{hosts}->delEntries( $key_col);
|
||||
$db->{hosts}->setNodeAttribs( $name,{ip=>$ips,
|
||||
otherinterfaces=>$hostslisthash->{otherinterfaces}
|
||||
@@ -677,7 +602,7 @@ sub add_ppchcp {
|
||||
|
||||
my $hwtype = shift;
|
||||
my $values = shift;
|
||||
my @tabs = qw(ppchcp nodehm nodelist nodetype mac);
|
||||
my @tabs = qw(ppchcp nodehm nodelist nodetype mac ppc);
|
||||
my %db = ();
|
||||
|
||||
my ($name, $mac) = split ',', $values;
|
||||
@@ -709,7 +634,8 @@ sub add_ppchcp {
|
||||
###################################
|
||||
# Update nodetype table
|
||||
###################################
|
||||
$db{nodetype}->setNodeAttribs( $name, {nodetype=>lc($hwtype)});
|
||||
$db{nodetype}->setNodeAttribs( $name, {nodetype=>$globalnodetype{$hwtype}});
|
||||
$db{ppc}->setNodeAttribs( $name, {nodetype=>$globlehwtype{$hwtype}});
|
||||
|
||||
###################################
|
||||
# Update mac table
|
||||
|
||||
+23
-10
@@ -22,6 +22,13 @@ use xCAT::DBobjUtils;
|
||||
'CPUspeed' => 1,
|
||||
'syssbpower' => 1,
|
||||
'sysIPLtime' => 1,
|
||||
# for FFO, only supported when communicating to fsp directly
|
||||
'ffoMin' => 1,
|
||||
'ffoVmin' => 1,
|
||||
'ffoTurbo' => 1,
|
||||
'ffoNorm' => 1,
|
||||
'fsavingstatus' => 1,
|
||||
'ffovalue' => 1,
|
||||
);
|
||||
|
||||
%::SET_ATTRS = (
|
||||
@@ -30,6 +37,9 @@ use xCAT::DBobjUtils;
|
||||
'cappingstatus' => 1,
|
||||
'cappingwatt' => 1,
|
||||
'cappingperc' => 1,
|
||||
# for FFO
|
||||
'fsavingstatus' => 1,
|
||||
'ffovalue' => 1,
|
||||
);
|
||||
|
||||
$::CIM_CLIENT_PATH = "$::XCATROOT/sbin/xCAT_cim_client";
|
||||
@@ -84,7 +94,7 @@ sub parse_args {
|
||||
return (&usage());
|
||||
}
|
||||
|
||||
if ($set_attr eq "savingstatus"
|
||||
if (($set_attr eq "savingstatus" || $set_attr eq "fsavingstatus")
|
||||
&& ($set_value ne "on" && $set_value ne "off")) {
|
||||
return (&usage());
|
||||
} elsif ($set_attr eq "dsavingstatus"
|
||||
@@ -95,7 +105,7 @@ sub parse_args {
|
||||
&& ($set_value ne "on" && $set_value ne "off")) {
|
||||
return (&usage());
|
||||
} elsif ( ($set_attr eq "cappingwatt"
|
||||
|| $set_attr eq "cappingperc")
|
||||
|| $set_attr eq "cappingperc" || $set_attr eq "ffovalue")
|
||||
&& $set_value =~ /\D/) {
|
||||
return (&usage());
|
||||
}
|
||||
@@ -160,19 +170,22 @@ sub parse_args {
|
||||
}
|
||||
|
||||
# Check whether the hardware type of nodes are fsp or cec
|
||||
my $nodetype_tb = xCAT::Table->new('nodetype');
|
||||
unless ($nodetype_tb) {
|
||||
return ([undef, "Error: Cannot open the nodetype table"]);
|
||||
}
|
||||
#my $nodetype_tb = xCAT::Table->new('nodetype');
|
||||
#unless ($nodetype_tb) {
|
||||
# return ([undef, "Error: Cannot open the nodetype table"]);
|
||||
#}
|
||||
|
||||
my $nodetype_v = $nodetype_tb->getNodesAttribs($nodes, ['nodetype']);
|
||||
#my $nodetype_v = $nodetype_tb->getNodesAttribs($nodes, ['nodetype']);
|
||||
my $nodetyperef = xCAT::DBobjUtils->getnodetype($nodes);
|
||||
my $i = 0;
|
||||
foreach my $node (@{$nodes}) {
|
||||
if ($nodetype_v->{$node}->[0]->{'nodetype'} ne 'fsp' &&
|
||||
$nodetype_v->{$node}->[0]->{'nodetype'} ne 'cec') {
|
||||
if (@$nodetyperef[$i] ne 'fsp' &&
|
||||
@$nodetyperef[$i] ne 'cec') {
|
||||
push @notfspnodes, $node;
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
$nodetype_tb->close();
|
||||
#$nodetype_tb->close();
|
||||
|
||||
if (@notfspnodes) {
|
||||
return ([undef, "Error: The hardware type of following nodes are not fsp or cec: ".join(',', @notfspnodes)]);
|
||||
|
||||
+125
-10
@@ -9,6 +9,7 @@ use HTML::Form;
|
||||
use xCAT::PPCcli qw(SUCCESS EXPECT_ERROR RC_ERROR NR_ERROR);
|
||||
use xCAT::Usage;
|
||||
use Socket;
|
||||
use xCAT::PPCdb;
|
||||
|
||||
|
||||
##########################################
|
||||
@@ -35,7 +36,9 @@ my %cmds = (
|
||||
autopower => ["Auto Power Restart", \&autopower],
|
||||
sysdump => ["System Dump", \&sysdump],
|
||||
spdump => ["Service Processor Dump", \&spdump],
|
||||
network => ["Network Configuration", \&netcfg]},
|
||||
network => ["Network Configuration", \&netcfg],
|
||||
dev => ["Service Processor Command Line", \&devenable],
|
||||
celogin1 => ["Service Processor Command Line", \&ce1enable]},
|
||||
);
|
||||
|
||||
|
||||
@@ -62,8 +65,9 @@ sub handler {
|
||||
|
||||
foreach ( @$result ) {
|
||||
my %output;
|
||||
$output{node}->[0]->{name}->[0] = $server;
|
||||
$output{node}->[0]->{data}->[0]->{contents}->[0] = @$_[1];
|
||||
$output{node}->[0]->{name}->[0] = $request->{host};
|
||||
$output{node}->[0]->{data}->[0]->{contents}->[0] = $server. ": ".@$_[1];
|
||||
$output{node}->[0]->{cmd}->[0] = @$_[2];
|
||||
$output{errorcode} = @$_[0];
|
||||
push @outhash, \%output;
|
||||
}
|
||||
@@ -96,8 +100,13 @@ sub connect {
|
||||
##################################
|
||||
# Get userid/password
|
||||
##################################
|
||||
my $cred = $req->{$server}{cred};
|
||||
|
||||
my $cred = undef;
|
||||
if (($req->{dev} eq '1') or ($req->{command} eq 'rpower')) {
|
||||
my @cred_array = xCAT::PPCdb::credentials($server, $req->{hwtype}, "celogin");
|
||||
$cred = \@cred_array;
|
||||
} else {
|
||||
$cred = $req->{$server}{cred};
|
||||
}
|
||||
##################################
|
||||
# Redirect STDERR to variable
|
||||
##################################
|
||||
@@ -132,7 +141,7 @@ sub connect {
|
||||
##################################
|
||||
my $hosttab = xCAT::Table->new( 'hosts' );
|
||||
if ( $hosttab) {
|
||||
my $hostshash = $hosttab->getNodeAttribs( $server, [qw(otherinterfaces)]);
|
||||
my $hostshash = $hosttab->getNodeAttribs( $server, [qw(ip otherinterfaces)]);
|
||||
if ( $hostshash ) {
|
||||
$server = $hostshash->{ip};
|
||||
}
|
||||
@@ -196,11 +205,116 @@ sub connect {
|
||||
return( $lwp_log."Logon failure" );
|
||||
|
||||
}
|
||||
sub ce1enable {
|
||||
return &loginenable($_[0], $_[1], $_[2], "celogin1");
|
||||
}
|
||||
|
||||
sub devenable {
|
||||
return &loginenable($_[0], $_[1], $_[2], "dev");
|
||||
}
|
||||
my %cmdline_for_log = (
|
||||
dev => {
|
||||
enable => "registry -Hw nets/DevEnabled 1",
|
||||
disable => "registry -Hw nets/DevEnabled 0",
|
||||
check_pwd => "registry -l DevPwdFile",
|
||||
create_pwd => "netsDynPwdTool --create dev FipSdev",
|
||||
password => "FipSdev"
|
||||
},
|
||||
celogin1 => {
|
||||
enable => "registry -Hw nets/CE1Enabled 1",
|
||||
disable => "registry -Hw nets/CE1Enabled 0",
|
||||
check_pwd => "registry -l Ce1PwdFile",
|
||||
create_pwd => "netsDynPwdTool --create celogin1 FipSce1",
|
||||
password => "FipSce1"
|
||||
},
|
||||
);
|
||||
sub send_command {
|
||||
my $ua = shift;
|
||||
my $server = shift;
|
||||
my $id = shift;
|
||||
my $log_name = shift;
|
||||
my $cmd = shift;
|
||||
my $cmd_line = $cmdline_for_log{$log_name}{$cmd};
|
||||
if (!defined($cmd_line)) {
|
||||
return undef;
|
||||
}
|
||||
my $res = $ua->post( "https://$server/cgi-bin/cgi",
|
||||
[ form => $id,
|
||||
cmd => $cmd_line,
|
||||
submit => "Execute" ]
|
||||
);
|
||||
|
||||
##########################################################################
|
||||
# Logoff through remote FSP HTTP-interface
|
||||
##########################################################################
|
||||
if ( !$res->is_success() ) {
|
||||
return undef;
|
||||
}
|
||||
if ( $res->content =~ /(not allowed.*\.|Invalid entry)/ ) {
|
||||
return undef;
|
||||
}
|
||||
return $res->content;
|
||||
}
|
||||
sub loginstate {
|
||||
my $ua = shift;
|
||||
my $server = shift;
|
||||
my $log_name = shift;
|
||||
my $url = "https://$server/cgi-bin/cgi?form=4";
|
||||
my $res = $ua->get($url);
|
||||
if (!$res->is_success()) {
|
||||
return ([RC_ERROR, $res->status_line]);
|
||||
}
|
||||
if ($res->content =~ m#[\d\D]+Status[\d\D]+$log_name</td><td[^\>]*>(\w+)</td>#) {
|
||||
my $out = sprintf("%9s: %8s", $log_name, $1);
|
||||
return ( [SUCCESS, $out]);
|
||||
} else {
|
||||
return ( [RC_ERROR, "not found status for $log_name"]);
|
||||
}
|
||||
}
|
||||
|
||||
sub loginenable {
|
||||
my $exp = shift;
|
||||
my $request = shift;
|
||||
my $id = shift;
|
||||
my $log_name = shift;
|
||||
my $ua = @$exp[0];
|
||||
my $server = @$exp[1];
|
||||
|
||||
my $value = $request->{method}{$log_name};
|
||||
if (!defined($value)) {
|
||||
return &loginstate($ua, $server, $log_name);
|
||||
}
|
||||
my $url = "https://$server/cgi-bin/cgi?form=$id";
|
||||
my $res = $ua->get( $url );
|
||||
if (!$res->is_success()) {
|
||||
return( [RC_ERROR,$res->status_line] );
|
||||
}
|
||||
|
||||
$res = &send_command($ua, $server, $id, $log_name, $value);
|
||||
if (!defined($res)) {
|
||||
return ([RC_ERROR, "Send command Failed"]);
|
||||
}
|
||||
if ( $value =~ m/^disable$/ ) {
|
||||
my $out = sprintf("%9s: Disabled", $log_name);
|
||||
return( [SUCCESS, $out] );
|
||||
}
|
||||
#check password#
|
||||
$res = &send_command($ua, $server, $id, $log_name, "check_pwd");
|
||||
if (!defined($res)) {
|
||||
return ([RC_ERROR, "Send command Failed"]);
|
||||
}
|
||||
my $password = undef;
|
||||
if ($res =~ m/\[\d+([a-zA-Z]+)\d+\]/) {
|
||||
$password = $1;
|
||||
} else {
|
||||
# create password #
|
||||
$res = &send_command($ua, $server, $id, $log_name, "create_pwd");
|
||||
if (!defined($res)) {
|
||||
return ([RC_ERROR, "Send command Failed"]);
|
||||
}
|
||||
$password = $cmdline_for_log{$log_name}{password};
|
||||
print "create password for $log_name is '$cmdline_for_log{$log_name}{password}'\n";
|
||||
}
|
||||
my $out = sprintf("%9s: Enabled, password: $password", $log_name);
|
||||
return( [SUCCESS, $out] );
|
||||
}
|
||||
sub disconnect {
|
||||
|
||||
my $exp = shift;
|
||||
@@ -276,6 +390,7 @@ sub process_cmd {
|
||||
# Run command
|
||||
##################################
|
||||
my $res = $cmds{$command}{$_}[1]($exp, $request, $form, \%menu);
|
||||
push @$res, $_;
|
||||
push @result, $res;
|
||||
}
|
||||
return( \@result );
|
||||
@@ -1873,7 +1988,7 @@ sub set_netcfg
|
||||
}
|
||||
|
||||
#Go to the confirm page
|
||||
if ( $res->content !~ /\Q<input type=\'submit\'\E/) #If there is no submit button,get the error message and return
|
||||
if ( $res->content !~ /<input type=\'submit\'/) #If there is no submit button,get the error message and return
|
||||
{
|
||||
my @page_lines = split /\n/, $res->content;
|
||||
my @lines_to_print;
|
||||
|
||||
@@ -142,7 +142,8 @@ sub parse_args {
|
||||
$client_nethash{@$node[0]} = $client_nethash{$tmpll};
|
||||
}
|
||||
} else {
|
||||
return( [RC_ERROR,"Cannot get network information for node"] );
|
||||
my $nodes = join( ",", @$node);
|
||||
return( [RC_ERROR,"Cannot get network information for $nodes, check networks table and IP address for this node to make sure there is correct network in networks table"] );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ sub parse_args {
|
||||
my $command = $request->{command};
|
||||
my $args = $request->{arg};
|
||||
my %opt = ();
|
||||
my @rpower = qw(on onstandby off softoff stat state reset boot of sms rackstandby exit_rackstandby lowpower);
|
||||
my @rpower = qw(on onstandby off softoff stat state reset boot of sms rackstandby exit_rackstandby lowpower resetsp);
|
||||
|
||||
#############################################
|
||||
# Responds with usage statement
|
||||
|
||||
+14
-13
@@ -256,13 +256,14 @@ sub noderange_validate {
|
||||
###########################################
|
||||
foreach my $node ( @$noderange ) {
|
||||
my $type = undef;
|
||||
my $sitetab = xCAT::Table->new( 'nodetype' );
|
||||
if ( defined( $sitetab )) {
|
||||
my ($ent) = $sitetab->getAttribs({ node=>$node},'nodetype');
|
||||
if ( defined($ent) ) {
|
||||
$type = $ent->{nodetype};
|
||||
}
|
||||
}
|
||||
#my $sitetab = xCAT::Table->new( 'nodetype' );
|
||||
#if ( defined( $sitetab )) {
|
||||
# my ($ent) = $sitetab->getAttribs({ node=>$node},'nodetype');
|
||||
# if ( defined($ent) ) {
|
||||
# $type = $ent->{nodetype};
|
||||
# }
|
||||
#}
|
||||
$type = xCAT::DBobjUtils->getnodetype($node);
|
||||
#print "type:$type\n";
|
||||
if( $type =~/(fsp|lpar|cec)/) {
|
||||
$f1 = 1;
|
||||
@@ -271,11 +272,11 @@ sub noderange_validate {
|
||||
my $exargs=$request->{arg};
|
||||
#my $t = print_var($exargs, "exargs");
|
||||
#print $t;
|
||||
if ( grep(/commit/,@$exargs) != 0 || grep(/recover/,@$exargs) != 0) {
|
||||
send_msg( $request, 1, "When run \"rflash\" with the \"commit\" or \"recover\" operation, the noderange cannot be BPA and can only be CEC or LPAR.");
|
||||
send_msg( $request, 1, "And then, it will do the operation for both managed systems and power subsystems.");
|
||||
return -1;
|
||||
}
|
||||
#if ( grep(/commit/,@$exargs) != 0 || grep(/recover/,@$exargs) != 0) {
|
||||
# send_msg( $request, 1, "When run \"rflash\" with the \"commit\" or \"recover\" operation, the noderange cannot be BPA and can only be CEC or LPAR.");
|
||||
# send_msg( $request, 1, "And then, it will do the operation for both managed systems and power subsystems.");
|
||||
# return -1;
|
||||
# }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -634,7 +635,7 @@ sub rflash {
|
||||
} else {
|
||||
while(my ($name, $d) = each(%$h)) {
|
||||
if ( @$d[4] !~ /^(fsp|bpa|lpar|cec|frame)$/ ) {
|
||||
push @value, [$name,"Information only available for LPAR/CEC/BPA",RC_ERROR];
|
||||
push @value, [$name,"Information only available for LPAR/CEC/BPA/Frame",RC_ERROR];
|
||||
next;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,11 +24,20 @@ my @header = (
|
||||
["serial-number", "%-15s" ],
|
||||
["side", "%-6s\n" ]);
|
||||
|
||||
my @attribs = qw(nodetype node id mtm serial side hcp pprofile parent groups mgt cons);
|
||||
my %nodetype = (
|
||||
my @attribs = qw(nodetype node id mtm serial side hcp pprofile parent groups mgt cons hwtype);
|
||||
my %globalnodetype = (
|
||||
fsp => $::NODETYPE_PPC,
|
||||
bpa => $::NODETYPE_PPC,
|
||||
cec => $::NODETYPE_PPC,
|
||||
frame=> $::NODETYPE_PPC,
|
||||
lpar =>"$::NODETYPE_PPC,$::NODETYPE_OSI"
|
||||
);
|
||||
my %globalhwtype = (
|
||||
fsp => $::NODETYPE_FSP,
|
||||
bpa => $::NODETYPE_BPA,
|
||||
lpar =>"$::NODETYPE_LPAR,$::NODETYPE_OSI"
|
||||
lpar => $::NODETYPE_LPAR,
|
||||
cec => $::NODETYPE_CEC,
|
||||
frame=> $::NODETYPE_FRAME,
|
||||
);
|
||||
|
||||
|
||||
@@ -538,7 +547,9 @@ sub format_stanza {
|
||||
if ( /^node$/ ) {
|
||||
next;
|
||||
} elsif ( /^nodetype$/ ) {
|
||||
$d = $type;
|
||||
$d = $globalnodetype{$type};
|
||||
} elsif ( /^hwtype$/ ) {
|
||||
$d = $globalhwtype{$type};
|
||||
} elsif ( /^groups$/ ) {
|
||||
$d = "$type,all";
|
||||
} elsif ( /^mgt$/ ) {
|
||||
@@ -554,6 +565,10 @@ sub format_stanza {
|
||||
if ( $type eq "lpar" ) {
|
||||
$d = undef;
|
||||
}
|
||||
} elsif (/^side$/) {
|
||||
unless ( $type =~ /^fsp|bpa$/ ) {
|
||||
next;
|
||||
}
|
||||
}
|
||||
$result .= "\t$_=$d\n";
|
||||
}
|
||||
@@ -608,7 +623,9 @@ sub format_xml {
|
||||
my $d = $data[$i++];
|
||||
|
||||
if ( /^nodetype$/ ) {
|
||||
$d = $nodetype{$d};
|
||||
$d = $globalnodetype{$type};
|
||||
} elsif ( /^hwtype$/ ) {
|
||||
$d = $globalhwtype{$type};
|
||||
} elsif ( /^groups$/ ) {
|
||||
$d = "$type,all";
|
||||
} elsif ( /^mgt$/ ) {
|
||||
@@ -623,6 +640,10 @@ sub format_xml {
|
||||
if ( $type eq "lpar" ) {
|
||||
$d = undef;
|
||||
}
|
||||
} elsif (/^side$/) {
|
||||
unless ( $type =~ /^fsp|bpa$/ ) {
|
||||
next;
|
||||
}
|
||||
}
|
||||
$href->{Node}->{$_} = $d;
|
||||
}
|
||||
|
||||
@@ -56,6 +56,13 @@ sub parse_args {
|
||||
if ( !defined( $cmd )) {
|
||||
return(usage( "Invalid command: $ARGV[0]" ));
|
||||
}
|
||||
|
||||
if($ARGV[0] =~ /^rackenv$/) {
|
||||
if($request->{hwtype} =~ /^hmc$/) {
|
||||
return(usage( "Command $ARGV[0] is not valid when the nodes' hcp is hmc" ));
|
||||
}
|
||||
}
|
||||
|
||||
####################################
|
||||
# Check for an extra argument
|
||||
####################################
|
||||
|
||||
+38
-6
@@ -7,6 +7,7 @@ use xCAT::PPCcli qw(SUCCESS EXPECT_ERROR RC_ERROR NR_ERROR);
|
||||
use xCAT::PPCdb;
|
||||
use xCAT::Usage;
|
||||
use xCAT::NodeRange;
|
||||
use Data::Dumper;
|
||||
|
||||
|
||||
##############################################
|
||||
@@ -56,7 +57,7 @@ sub chvm_parse_args {
|
||||
#############################################
|
||||
# Process command-line arguments
|
||||
#############################################
|
||||
if ( !defined( $args )) {
|
||||
if ( !defined( $args ) && !defined( $request->{stdin} ) ) {
|
||||
$request->{method} = $cmd;
|
||||
return( usage() );
|
||||
}
|
||||
@@ -65,7 +66,8 @@ sub chvm_parse_args {
|
||||
# to be grouped (e.g. -vx), and terminates
|
||||
# at the first unrecognized option.
|
||||
#############################################
|
||||
@ARGV = @$args;
|
||||
if ($args) { @ARGV = @$args; }
|
||||
else { @ARGV = (); }
|
||||
$Getopt::Long::ignorecase = 0;
|
||||
Getopt::Long::Configure( "bundling" );
|
||||
|
||||
@@ -663,7 +665,7 @@ sub remove {
|
||||
# Remove the LPARs
|
||||
####################################
|
||||
foreach ( @lpars ) {
|
||||
my $lparinfo = shift(@lpars);
|
||||
my $lparinfo = $_; # shift(@lpars);
|
||||
my ($name,$id) = split /,/, $lparinfo;
|
||||
my $mtms = @$d[2];
|
||||
|
||||
@@ -708,7 +710,7 @@ sub remove {
|
||||
# Remove LPAR from database
|
||||
################################
|
||||
if ( $Rc == SUCCESS and !exists( $opt->{r} ) ) {
|
||||
my $err = xCATdB( "rmvm", $name );
|
||||
my $err = xCATdB( "rmvm", $name,"", $id,"", $type,"" , $lpar );
|
||||
if ( defined( $err )) {
|
||||
push @values, [$lpar,$err,RC_ERROR];
|
||||
next;
|
||||
@@ -1215,7 +1217,24 @@ sub list {
|
||||
$count++;
|
||||
}
|
||||
} else {
|
||||
$pprofile .= "@$prof[0]\n\n";
|
||||
#$pprofile .= "@$prof[0]\n\n";
|
||||
my $lparprof = xCAT::PPCcli::lssyscfg(
|
||||
$exp,
|
||||
"lpar2",
|
||||
$mtms,
|
||||
"lpar_ids=$id" );
|
||||
my $Rc = shift(@$lparprof);
|
||||
if ( $Rc != SUCCESS ) {
|
||||
$pprofile .= "@$lparprof[0]\n\n";
|
||||
} else {
|
||||
@$lparprof[0] =~ /curr_profile=(\w+)/;
|
||||
my $pname = $1;
|
||||
foreach my $pr (@$prof) {
|
||||
if ($pr =~ /name=$pname/) {
|
||||
$pprofile .= "$pr\n\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$values->{$lpar} = [$lpar, $pprofile, SUCCESS];
|
||||
@@ -1780,7 +1799,20 @@ sub xCATdB {
|
||||
# Remove entry
|
||||
#######################################
|
||||
if ( $cmd eq "rmvm" ) {
|
||||
return( xCAT::PPCdb::rm_ppc( $name ));
|
||||
|
||||
my $ppctab = xCAT::Table->new('ppc');
|
||||
unless ($ppctab) { # no ppc table
|
||||
return( "Error opening 'ppc' database" );
|
||||
}
|
||||
|
||||
my @nodes = $ppctab->getAllNodeAttribs(['node','id','parent']);
|
||||
|
||||
foreach my $node (@nodes) {
|
||||
my $type = xCAT::DBobjUtils->getnodetype($node->{node});
|
||||
if ( $type =~ /lpar/ and $lparid eq $node->{id} and $parent eq $node->{parent} ) {
|
||||
return( xCAT::PPCdb::rm_ppc( $node->{node} ));
|
||||
}
|
||||
}
|
||||
}
|
||||
#######################################
|
||||
# Change entry
|
||||
|
||||
+133
-47
@@ -167,7 +167,7 @@ vmmaster => {
|
||||
#storagemodel to allow chvm on a clone to be consistent with the master by default
|
||||
#nics to track the network mapping that may not be preserved by the respective plugin's specific cfg info
|
||||
#nicmodel same as storagemodel, except omitting for now until chvm actually does nics...
|
||||
cols => [qw(name os arch profile storage storagemodel nics vintage originator comments disable)],
|
||||
cols => [qw(name os arch profile storage storagemodel nics vintage originator virttype comments disable)],
|
||||
keys => [qw(name)],
|
||||
nodecol => 'name', #well what do you know, I used it...
|
||||
table_desc => 'Inventory of virtualization images for use with clonevm. Manual intervention in this table is not intended.',
|
||||
@@ -265,6 +265,7 @@ boottarget => {
|
||||
bootparams => {
|
||||
cols => [qw(node kernel initrd kcmdline addkcmdline dhcpstatements adddhcpstatements comments disable)],
|
||||
keys => [qw(node)],
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => 'Current boot settings to be sent to systems attempting network boot for deployment, stateless, or other reasons. Mostly automatically manipulated by xCAT.',
|
||||
descriptions => {
|
||||
'node' => 'The node or group name',
|
||||
@@ -348,6 +349,7 @@ ipmi => {
|
||||
iscsi => {
|
||||
cols => [qw(node server target lun iname file userid passwd kernel kcmdline initrd comments disable)],
|
||||
keys => [qw(node)],
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => 'Contains settings that control how to boot a node from an iSCSI target',
|
||||
descriptions => {
|
||||
node => 'The node name or group name.',
|
||||
@@ -368,6 +370,7 @@ iscsi => {
|
||||
mac => {
|
||||
cols => [qw(node interface mac comments disable)],
|
||||
keys => [qw(node)],
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => "The MAC address of the node's install adapter. Normally this table is populated by getmacs or node discovery, but you can also add entries to it manually.",
|
||||
descriptions => {
|
||||
node => 'The node name or group name.',
|
||||
@@ -428,7 +431,7 @@ mpa => {
|
||||
},
|
||||
},
|
||||
networks => {
|
||||
cols => [qw(netname net mask mgtifname gateway dhcpserver tftpserver nameservers ntpservers logservers dynamicrange nodehostname ddnsdomain vlanid comments disable)],
|
||||
cols => [qw(netname net mask mgtifname gateway dhcpserver tftpserver nameservers ntpservers logservers dynamicrange nodehostname ddnsdomain vlanid domain comments disable)],
|
||||
keys => [qw(net mask)],
|
||||
table_desc => 'Describes the networks in the cluster and info necessary to set up nodes on that network.',
|
||||
descriptions => {
|
||||
@@ -439,13 +442,14 @@ networks => {
|
||||
gateway => 'The network gateway. It can be set to an ip address or the keyword <xcatmaster>, the keyword <xcatmaster> indicates the cluster-facing ip address configured on this management node or service node. Leaving this field blank means that there is no gateway for this network.',
|
||||
dhcpserver => 'The DHCP server that is servicing this network. Required to be explicitly set for pooled service node operation.',
|
||||
tftpserver => 'The TFTP server that is servicing this network. If not set, the DHCP server is assumed.',
|
||||
nameservers => 'The nameservers for this network. Used in creating the DHCP network definition, and DNS configuration.',
|
||||
nameservers => 'A comma delimited list of DNS servers that each node in this network should use. This value will end up in the nameserver settings of the /etc/resolv.conf on each node in this network. If this attribute value is set to the IP address of an xCAT node, make sure DNS is running on it. In a hierarchical cluster, you can also set this attribute to "<xcatmaster>" to mean the DNS server for each node in this network should be the node that is managing it (either its service node or the management node). Used in creating the DHCP network definition, and DNS configuration.',
|
||||
ntpservers => 'The ntp servers for this network. Used in creating the DHCP network definition. Assumed to be the DHCP server if not set.',
|
||||
logservers => 'The log servers for this network. Used in creating the DHCP network definition. Assumed to be the DHCP server if not set.',
|
||||
dynamicrange => 'The IP address range used by DHCP to assign dynamic IP addresses for requests on this network. This should not overlap with entities expected to be configured with static host declarations, i.e. anything ever expected to be a node with an address registered in the mac table.',
|
||||
nodehostname => 'A regular expression used to specify node name to network-specific hostname. i.e. "/\z/-secondary/" would mean that the hostname of "n1" would be n1-secondary on this network. By default, the nodename is assumed to equal the hostname, followed by nodename-interfacename.',
|
||||
ddnsdomain => 'A domain to be combined with nodename to construct FQDN for DDNS updates induced by DHCP. This is not passed down to the client as "domain"',
|
||||
vlanid => 'The vlan ID if this network is within a vlan.',
|
||||
domain => 'The DNS domain name (ex. cluster.com).',
|
||||
comments => 'Any user-written notes.',
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
},
|
||||
@@ -466,6 +470,7 @@ nodegroup => {
|
||||
nodehm => {
|
||||
cols => [qw(node power mgt cons termserver termport conserver serialport serialspeed serialflow getmac comments disable)],
|
||||
keys => [qw(node)],
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => "Settings that control how each node's hardware is managed. Typically, an additional table that is specific to the hardware type of the node contains additional info. E.g. the ipmi, mp, and ppc tables.",
|
||||
descriptions => {
|
||||
node => 'The node name or group name.',
|
||||
@@ -486,6 +491,7 @@ nodehm => {
|
||||
nodelist => {
|
||||
cols => [qw(node groups status statustime appstatus appstatustime primarysn hidden comments disable)],
|
||||
keys => [qw(node)],
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => "The list of all the nodes in the cluster, including each node's current status and what groups it is in.",
|
||||
descriptions => {
|
||||
node => 'The hostname of a node in the cluster.',
|
||||
@@ -503,6 +509,7 @@ nodelist => {
|
||||
nodepos => {
|
||||
cols => [qw(node rack u chassis slot room comments disable)],
|
||||
keys => [qw(node)],
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => 'Contains info about the physical location of each node. Currently, this info is not used by xCAT, and therefore can be in whatevery format you want. It will likely be used in xCAT in the future.',
|
||||
descriptions => {
|
||||
node => 'The node name or group name.',
|
||||
@@ -518,6 +525,7 @@ nodepos => {
|
||||
noderes => {
|
||||
cols => [qw(node servicenode netboot tftpserver nfsserver monserver nfsdir installnic primarynic discoverynics cmdinterface xcatmaster current_osimage next_osimage nimserver routenames comments disable)],
|
||||
keys => [qw(node)],
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => 'Resources and settings to use when installing nodes.',
|
||||
descriptions => {
|
||||
node => 'The node name or group name.',
|
||||
@@ -559,15 +567,16 @@ noderes => {
|
||||
nodetype => {
|
||||
cols => [qw(node os arch profile provmethod supportedarchs nodetype comments disable)],
|
||||
keys => [qw(node)],
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => 'A few hardware and software characteristics of the nodes.',
|
||||
descriptions => {
|
||||
node => 'The node name or group name.',
|
||||
os => 'The operating system deployed on this node. Valid values: AIX, rh*, centos*, SL*, fedora*, sles* (where * is the version #). As a special case, if this is set to "boottarget", then it will use the initrd/kernel/parameters specified in the row in the boottarget table in which boottarget.bprofile equals nodetype.profile.',
|
||||
os => 'The operating system deployed on this node. Valid values: AIX, rhels*,rhelc*, rhas*,centos*,SL*, fedora*, sles* (where * is the version #). As a special case, if this is set to "boottarget", then it will use the initrd/kernel/parameters specified in the row in the boottarget table in which boottarget.bprofile equals nodetype.profile.',
|
||||
arch => 'The hardware architecture of this node. Valid values: x86_64, ppc64, x86, ia64.',
|
||||
profile => 'The string to use to locate a kickstart or autoyast template to use for OS deployment of this node. If the provmethod attribute is set to an osimage name, that takes precendence. Otherwise, the os, profile, and arch are used to search for the files in /install/custom first, and then in /opt/xcat/share/xcat.',
|
||||
provmethod => 'The provisioning method for node deployment. The valid values are install, netboot, statelite or an os image name from the osimage table. If an image name is specified, the osimage definition stored in the osimage table and the linuximage table (for Linux) or nimimage table (for AIX) are used to locate the files for templates, pkglists, syncfiles, etc. On Linux, if install, netboot or statelite is specified, the os, profile, and arch are used to search for the files in /install/custom first, and then in /opt/xcat/share/xcat.',
|
||||
supportedarchs => 'Comma delimited list of architectures this node can execute.',
|
||||
nodetype => 'A comma-delimited list of characteristics of this node. Valid values: blade, vm (virtual machine), lpar, osi (OS image), hmc, fsp, ivm, bpa, mm, rsa, switch.',
|
||||
nodetype => 'A comma-delimited list of characteristics of this node. Valid values: blade, vm (virtual machine), osi (OS image), mm, rsa, switch.',
|
||||
comments => 'Any user-written notes.',
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
},
|
||||
@@ -585,20 +594,20 @@ notification => {
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
},
|
||||
},
|
||||
osimage => {
|
||||
osimage => {
|
||||
cols => [qw(imagename profile imagetype provmethod rootfstype osname osvers osdistro osarch synclists postscripts postbootscripts comments disable)],
|
||||
keys => [qw(imagename)],
|
||||
table_desc => 'Basic information about an operating system image that can be used to deploy cluster nodes.',
|
||||
descriptions => {
|
||||
imagename => 'The name of this xCAT OS image definition.',
|
||||
imagetype => 'The type of operating system image this definition represents.',
|
||||
imagetype => 'The type of operating system image this definition represents (linux,AIX).',
|
||||
provmethod => 'The provisioning method for node deployment. The valid values are install, netboot or statelite. It is not used by AIX.',
|
||||
rootfstype => 'The filesystem type for the rootfs is used when the provmethod is statelite. The valid values are nfs or ramdisk. The default value is nfs',
|
||||
profile => 'The node usage category. For example compute, service.',
|
||||
osname => 'Operating system name- AIX or Linux.',
|
||||
osvers => 'Not used.',
|
||||
osvers => 'The Linux operating system deployed on this node. Valid values: rhels*,rhelc*, rhas*,centos*,SL*, fedora*, sles* (where * is the version #).',
|
||||
osdistro => 'Not used.',
|
||||
osarch => 'Not used.',
|
||||
osarch => 'The hardware architecture of this node. Valid values: x86_64, ppc64, x86, ia64.',
|
||||
synclists => 'The fully qualified name of a file containing a list of files to synchronize on the nodes.',
|
||||
postscripts => 'Comma separated list of scripts that should be run on this image after diskfull installation or diskless boot. For installation of RedHat, CentOS, Fedora, the scripts will be run before the reboot. For installation of SLES, the scripts will be run after the reboot but before the init.d process. For diskless deployment, the scripts will be run at the init.d time, and xCAT will automatically add the list of scripts from the postbootscripts attribute to run after postscripts list. For installation of AIX, the scripts will run after the reboot and acts the same as the postbootscripts attribute. For AIX, use the postbootscripts attribute. Support will be added in the future for the postscripts attribute to run the scripts before the reboot in AIX. ',
|
||||
postbootscripts => 'Comma separated list of scripts that should be run on this after diskfull installation or diskless boot. On AIX these scripts are run during the processing of /etc/inittab. On Linux they are run at the init.d time. xCAT automatically adds the scripts in the xcatdefaults.postbootscripts attri bute to run first in the list.',
|
||||
@@ -607,7 +616,7 @@ osimage => {
|
||||
},
|
||||
},
|
||||
linuximage => {
|
||||
cols => [qw(imagename template pkglist pkgdir otherpkglist otherpkgdir exlist postinstall rootimgdir kerneldir nodebootif otherifce netdrivers kernelver permission dump comments disable)],
|
||||
cols => [qw(imagename template pkglist pkgdir otherpkglist otherpkgdir exlist postinstall rootimgdir kerneldir nodebootif otherifce netdrivers kernelver krpmver permission dump crashkernelsize comments disable)],
|
||||
keys => [qw(imagename)],
|
||||
table_desc => 'Information about a Linux operating system image that can be used to deploy cluster nodes.',
|
||||
descriptions => {
|
||||
@@ -623,10 +632,12 @@ linuximage => {
|
||||
kerneldir => 'The directory name where the 3rd-party kernel is stored. It is used for diskless image only.',
|
||||
nodebootif => 'The network interface the stateless/statelite node will boot over (e.g. eth0)',
|
||||
otherifce => 'Other network interfaces (e.g. eth1) in the image that should be configured via DHCP',
|
||||
netdrivers => 'the ethernet device drivers of the nodes which will use this linux image, at least the device driver for the nodes\' installnic should be included',
|
||||
kernelver => 'the version of linux kernel used in the linux image. If the kernel version is not set, the default kernel in rootimgdir will be used',
|
||||
permission => 'the mount permission of /.statelite directory is used, its default value is 755',
|
||||
netdrivers => 'The ethernet device drivers of the nodes which will use this linux image, at least the device driver for the nodes\' installnic should be included',
|
||||
kernelver => 'The version of linux kernel used in the linux image. If the kernel version is not set, the default kernel in rootimgdir will be used',
|
||||
krpmver => 'The rpm version of kernel packages (for SLES only). If it is not set, the default rpm version of kernel packages will be used.',
|
||||
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.',
|
||||
comments => 'Any user-written notes.',
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
},
|
||||
@@ -636,7 +647,7 @@ passwd => {
|
||||
keys => [qw(key username)],
|
||||
table_desc => 'Contains default userids and passwords for xCAT to access cluster components. In most cases, xCAT will also actually set the userid/password in the relevant component when it is being configured or installed. Userids/passwords for specific cluster components can be overidden in other tables, e.g. mpa, ipmi, ppchcp, etc.',
|
||||
descriptions => {
|
||||
key => 'The type of component this user/pw is for. Valid values: blade (management module), ipmi (BMC), system (nodes), omapi (DHCP), hmc, ivm, fsp, bpa.',
|
||||
key => 'The type of component this user/pw is for. Valid values: blade (management module), ipmi (BMC), system (nodes), omapi (DHCP), hmc, ivm, cec, frame.',
|
||||
username => 'The default userid for this type of component',
|
||||
password => 'The default password for this type of component',
|
||||
cryptmethod => 'Indicates the method that was used to encrypt the password attribute. On AIX systems, if a value is provided for this attribute it indicates that the passwword attribute is encrypted. If the cryptmethod value is not set it indicates the password is a simple string value. On Linux systems, the cryyptmethod is not supported however the code attempts to auto-discover MD5 encrypted passowrds.',
|
||||
@@ -655,7 +666,7 @@ policy => {
|
||||
commands => 'The list of commands that this rule applies to. Default is "*" (all commands).',
|
||||
noderange => 'The Noderange that this rule applies to. Default is "*" (all nodes).',
|
||||
parameters => 'A regular expression that matches the command parameters (everything except the noderange) that this rule applies to. Default is "*" (all parameters).',
|
||||
time => 'Time ranges that this command may be executed in. Default is any time.',
|
||||
time => 'Time ranges that this command may be executed in. This is not supported.',
|
||||
rule => 'Specifies how this rule should be applied. Valid values are: allow, accept, trusted. Allow or accept will allow the user to run the commands. Any other value will deny the user access to the commands. Trusted means that once this client has been authenticated via the certificate, all other information that is sent (e.g. the username) is believed without question. This authorization should only be given to the xcatd on the management node at this time.',
|
||||
comments => 'Any user-written notes.',
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
@@ -664,6 +675,7 @@ policy => {
|
||||
postscripts => {
|
||||
cols => [qw(node postscripts postbootscripts comments disable)],
|
||||
keys => [qw(node)],
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => ' The scripts that should be run on each node after installation or diskless boot.',
|
||||
descriptions => {
|
||||
node => 'The node name or group name.',
|
||||
@@ -676,16 +688,17 @@ postscripts => {
|
||||
ppc => {
|
||||
cols => [qw(node hcp id pprofile parent nodetype supernode sfp comments disable)],
|
||||
keys => [qw(node)],
|
||||
table_desc => 'List of system p hardware: HMCs, IVMs, FSPs, BPCs.',
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => 'List of system p hardware: HMCs, IVMs, FSPs, BPCs, CECs, Frames.',
|
||||
descriptions => {
|
||||
node => 'The node name or group name.',
|
||||
hcp => 'The hardware control point for this node (HMC or IVM).',
|
||||
id => 'For LPARs: the LPAR numeric id; for FSPs: the cage number; for BPAs: the frame number.',
|
||||
pprofile => 'The LPAR profile that will be used the next time the LPAR is powered on with rpower.',
|
||||
parent => 'For LPARs: the FSP/CEC; for FSPs: the BPA (if one exists); for BPAs: the building block (BB) which consists 1 or more service nodes and compute/storage nodes that are serviced by them.',
|
||||
nodetype => 'The hardware type of the node. Only can be one of fsp, bpa, cec, frame, hmc and lpar',
|
||||
supernode => 'Comma separated list of 2 ids. The first one is the id of the supernode the FSP resides in. The second one is the logic location number (0-3) within the supernode for the FSP.',
|
||||
sfp => ' The Service Focal Point of the Frame. It should be the name of HMC.',
|
||||
hcp => 'The hardware control point for this node (HMC, IVM, Frame or CEC). Do not need to set for BPAs and FSPs.',
|
||||
id => 'For LPARs: the LPAR numeric id; for CECs: the cage number; for Frames: the frame number.',
|
||||
pprofile => 'The LPAR profile that will be used the next time the LPAR is powered on with rpower. For DFM, the pprofile attribute should be set to blank ',
|
||||
parent => 'For LPARs: the CEC; for FSPs: the CEC; for CEC: the frame (if one exists); for BPA: the frame; for frame: the building block number (which consists 1 or more service nodes and compute/storage nodes that are serviced by them - optional).',
|
||||
nodetype => 'The hardware type of the node. Only can be one of fsp, bpa, cec, frame, ivm, hmc and lpar',
|
||||
supernode => 'Indicates the connectivity of this CEC in the HFI network. A comma separated list of 2 ids. The first one is the supernode number the CEC is part of. The second one is the logical location number (0-3) of this CEC within the supernode.',
|
||||
sfp => 'The Service Focal Point of this Frame. This is the name of the HMC that is responsible for collecting hardware service events for this frame and all of the CECs within this frame.',
|
||||
comments => 'Any user-written notes.',
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
},
|
||||
@@ -694,11 +707,11 @@ ppcdirect => {
|
||||
cols => [qw(hcp username password comments disable)],
|
||||
keys => [qw(hcp username)],
|
||||
nodecol => "hcp",
|
||||
table_desc => 'Info necessary to use FSPs to control system p CECs.',
|
||||
table_desc => 'Info necessary to use FSPs/BPAs to control system p CECs/Frames.',
|
||||
descriptions => {
|
||||
hcp => 'Hostname of the FSP.',
|
||||
username => 'Userid of the FSP. If not filled in, xCAT will look in the passwd table for key=fsp. If not in the passwd table, the default used is admin.',
|
||||
password => 'Password of the FSP. If not filled in, xCAT will look in the passwd table for key=fsp. If not in the passwd table, the default used is admin.',
|
||||
hcp => 'Hostname of the FSPs/BPAs(for ASMI) and CECs/Frames(for DFM).',
|
||||
username => 'Userid of the FSP/BPA(for ASMI) and CEC/Frame(for DFM). If not filled in, xCAT will look in the passwd table for key=fsp. If not in the passwd table, the default used is admin.',
|
||||
password => 'Password of the FSP/BPA(for ASMI) and CEC/Frame(for DFM). If not filled in, xCAT will look in the passwd table for key=fsp. If not in the passwd table, the default used is admin.',
|
||||
comments => 'Any user-written notes.',
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
},
|
||||
@@ -722,17 +735,17 @@ servicenode => {
|
||||
table_desc => 'List of all Service Nodes and services that will be set up on the Service Node.',
|
||||
descriptions => {
|
||||
node => 'The hostname of the service node as known by the Management Node.',
|
||||
nameserver => 'Do we set up DNS on this service node? Valid values:yes or 1, no or 0.',
|
||||
dhcpserver => 'Do we set up DHCP on this service node? Valid values:yes or 1, no or 0.',
|
||||
tftpserver => 'Do we set up TFTP on this service node? Valid values:yes or 1, no or 0.',
|
||||
nfsserver => 'Do we set up file services (HTTP,FTP,or NFS) on this service node? Valid values:yes or 1, no or 0.',
|
||||
conserver => 'Do we set up Conserver on this service node? Valid values:yes or 1, no or 0.',
|
||||
monserver => 'Is this a monitoring event collection point? Valid values:yes or 1, no or 0.',
|
||||
ldapserver => 'Do we set up ldap caching proxy on this service node? Valid values:yes or 1, no or 0.',
|
||||
ntpserver => 'Not used presently. Do we set up a ntp server on this service node? Valid values:yes or 1, no or 0.',
|
||||
ftpserver => 'Do we set up a ftp server on this service node? Valid values:yes or 1, no or 0.',
|
||||
nimserver => 'Do we set up a NIM server on this service node? Valid values:yes or 1, no or 0.',
|
||||
ipforward => 'Do we set up ip forwarding on this service node? Valid values:yes or 1, no or 0.',
|
||||
nameserver => 'Do we set up DNS on this service node? Valid values:yes or 1, no or 0. If yes, creates named.conf file with forwarding to the management node and starts named. If no or 0, it does not change the current state of the service. ',
|
||||
dhcpserver => 'Do we set up DHCP on this service node? Not supported on AIX. Valid values:yes or 1, no or 0. If yes, runs makedhcp -n. If no or 0, it does not change the current state of the service. ',
|
||||
tftpserver => 'Do we set up TFTP on this service node? Not supported on AIX. Valid values:yes or 1, no or 0. If yes, configures and starts atftp. If no or 0, it does not change the current state of the service. ',
|
||||
nfsserver => 'Do we set up file services (HTTP,FTP,or NFS) on this service node? For AIX will only setup NFS, not HTTP or FTP. Valid values:yes or 1, no or 0.If no or 0, it does not change the current state of the service. ',
|
||||
conserver => 'Do we set up Conserver on this service node? Valid values:yes or 1, no or 0. If yes, configures and starts conserver daemon. If no or 0, it does not change the current state of the service.',
|
||||
monserver => 'Is this a monitoring event collection point? Valid values:yes or 1, no or 0. If no or 0, it does not change the current state of the service.',
|
||||
ldapserver => 'Do we set up ldap caching proxy on this service node? Not supported on AIX. Valid values:yes or 1, no or 0. If no or 0, it does not change the current state of the service.',
|
||||
ntpserver => 'Not used. Use setupntp postscript to setup a ntp server on this service node? Valid values:yes or 1, no or 0. If no or 0, it does not change the current state of the service.',
|
||||
ftpserver => 'Do we set up a ftp server on this service node? Not supported on AIX Valid values:yes or 1, no or 0. If yes, configure and start vsftpd. If no or 0, it does not change the current state of the service.',
|
||||
nimserver => 'Not used. Do we set up a NIM server on this service node? Valid values:yes or 1, no or 0. If no or 0, it does not change the current state of the service.',
|
||||
ipforward => 'Do we set up ip forwarding on this service node? Valid values:yes or 1, no or 0. If no or 0, it does not change the current state of the service.',
|
||||
|
||||
comments => 'Any user-written notes.',
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
@@ -752,6 +765,9 @@ site => {
|
||||
" For example: tabdump,nodels,lsdef will not log those cmds.\n".
|
||||
" ALL will not log any cmds.\n\n".
|
||||
" blademaxp: The maximum number of processes for blade hardware control.\n\n".
|
||||
" cleanupxcatpost: (yes/1 or no/0). Set to 'yes' or '1' to clean up the /xcatpost directory\n".
|
||||
" on the stateless and statelite nodes after the postscripts are run.\n".
|
||||
" Default is no.\n\n".
|
||||
" consoleondemand: When set to 'yes', conserver connects and creates the console\n".
|
||||
" output only when the user opens the console. Default is no on\n".
|
||||
" Linux, yes on AIX.\n\n".
|
||||
@@ -768,6 +784,7 @@ site => {
|
||||
" mn|eth1,eth2;service|bond0.\n\n".
|
||||
" dhcpsetup: If set to 'n', it will skip the dhcp setup process in the nodeset cmd.\n\n".
|
||||
" disjointdhcps: If set to '1', the .leases file on a service node only contains\n".
|
||||
" dnshandler: Name of plugin that handles DNS setup for makedns.\n".
|
||||
" the nodes it manages. The default value is '0'.\n\n".
|
||||
" domain: The DNS domain name used for the cluster.\n\n".
|
||||
" ea_primary_hmc: The hostname of the HMC that the Integrated Switch Network\n".
|
||||
@@ -783,8 +800,10 @@ site => {
|
||||
" failed nodes for any xCAT commands. See the 'noderange' manpage for\n".
|
||||
" details on supported formats.\n\n".
|
||||
" forwarders: The DNS servers at your site that can provide names outside of the\n".
|
||||
" cluster. The DNS on the management node will forward requests it\n".
|
||||
" does not know to these servers.\n\n".
|
||||
" cluster. The makedns command will configuire the DNS on the management node\n".
|
||||
" to forward requests it does not know to these servers.\n".
|
||||
" Note that the DNS servers on the service nodes will ignore this value\n".
|
||||
" and always be configured to forward requests to the management node.\n\n".
|
||||
" fsptimeout: The timeout, in milliseconds, to use when communicating with FSPs.\n\n".
|
||||
" genmacprefix: When generating mac addresses automatically, use this manufacturing\n".
|
||||
" prefix (e.g. 00:11:aa)\n\n".
|
||||
@@ -806,7 +825,13 @@ site => {
|
||||
" mnroutenames: The name of the routes to be setup on the management node.\n\n".
|
||||
" It is a comma separated list of route names that are defined in the routes table.\n\n".
|
||||
" nameservers: A comma delimited list of DNS servers that each node in the cluster\n".
|
||||
" should use - often the xCAT management node.\n\n".
|
||||
" should use. This value will end up in the nameserver settings of the\n".
|
||||
" /etc/resolv.conf on each node. It is common (but not required) to set\n".
|
||||
" this attribute value to the IP address of the xCAT management node, if you have\n".
|
||||
" set up the DNS on the management node by running makedns.\n".
|
||||
" In a hierarchical cluster, you can also set this attribute to \"<xcatmaster>\"\n".
|
||||
" to mean the DNS server for each node should be the node that is managing it\n".
|
||||
" (either its service node or the management node).\n\n".
|
||||
" nodestatus: If set to 'n', the nodelist.status column will not be updated during\n".
|
||||
" the node deployment, node discovery and power operations.\n\n".
|
||||
" ntpservers: A comma delimited list of NTP servers for the cluster - often the\n".
|
||||
@@ -822,10 +847,11 @@ site => {
|
||||
" removing DHCP entries when noderm is executed)\n\n".
|
||||
" rsh: This is no longer used. path to remote shell command for xdsh.\n\n".
|
||||
" rcp: This is no longer used. path to remote copy command for xdcp.\n\n".
|
||||
" sharedtftp: Set to 0 or no, if xCAT should not assume the directory\n".
|
||||
" sharedtftp: Set to 0 or no, xCAT should not assume the directory\n".
|
||||
" in tftpdir is mounted on all on Service Nodes. Default is 1/yes.\n".
|
||||
" If value is set to a hostname, the directory in tftpdir\n".
|
||||
" will be mounted from that hostname on the SN\n\n".
|
||||
" skiptables: Comma separated list of tables to be skipped by dumpxCATdb\n".
|
||||
" SNsyncfiledir: The directory on the Service Node, where xdcp will copy the files\n".
|
||||
" from the MN that will eventually be copied to the compute nodes.\n\n".
|
||||
" snmpc: The snmp community string that xcat should use when communicating with the\n".
|
||||
@@ -885,7 +911,7 @@ vpd => {
|
||||
node => 'The node name or group name.',
|
||||
serial => 'The serial number of the node.',
|
||||
mtm => 'The machine type and model number of the node. E.g. 7984-6BU',
|
||||
side => 'The side information for the BPA/FSP',
|
||||
side => '<BPA>-<port> or <FSP>-<port>. The side information for the BPA/FSP. The side attribute refers to which BPA/FSP, A or B, which is determined by the slot value returned from lsslp command. It also lists the physical port within each BPA/FSP which is determined by the IP address order from the lsslp response. This information is used internally when communicating with the BPAs/FSPs',
|
||||
asset => 'A field for administators to use to correlate inventory numbers they may have to accomodate',
|
||||
uuid => 'The UUID applicable to the node',
|
||||
comments => 'Any user-written notes.',
|
||||
@@ -942,6 +968,7 @@ eventlog => {
|
||||
types => {
|
||||
recid => 'INTEGER AUTO_INCREMENT',
|
||||
},
|
||||
tablespace =>'XCATTBS32K',
|
||||
table_desc => 'Stores the events occurred.',
|
||||
descriptions => {
|
||||
recid => 'The record id.',
|
||||
@@ -967,6 +994,8 @@ auditlog => {
|
||||
types => {
|
||||
recid => 'INTEGER AUTO_INCREMENT',
|
||||
},
|
||||
compress =>'YES',
|
||||
tablespace =>'XCATTBS32K',
|
||||
table_desc => ' Audit Data log.',
|
||||
descriptions => {
|
||||
recid => 'The record id.',
|
||||
@@ -986,6 +1015,7 @@ auditlog => {
|
||||
prescripts => {
|
||||
cols => [qw(node begin end comments disable)],
|
||||
keys => [qw(node)],
|
||||
tablespace =>'XCATTBS16K',
|
||||
table_desc => 'The scripts that will be run at the beginning and the end of the nodeset(Linux), nimnodeset(AIX) or mkdsklsnode(AIX) command.',
|
||||
descriptions => {
|
||||
node => 'The node name or group name.',
|
||||
@@ -1039,13 +1069,15 @@ routes => {
|
||||
},
|
||||
|
||||
zvm => {
|
||||
cols => [qw(node hcp userid comments disable)],
|
||||
cols => [qw(node hcp userid nodetype parent comments disable)],
|
||||
keys => [qw(node)],
|
||||
table_desc => 'List of z/VM virtual servers.',
|
||||
descriptions => {
|
||||
node => 'The node name.',
|
||||
hcp => 'The hardware control point for this node.',
|
||||
userid => 'The z/VM userID of this node.',
|
||||
nodetype => 'The node type. Valid values: cec (Central Electronic Complex), lpar (logical partition), zvm (z/VM host operating system), and vm (virtual machine).',
|
||||
parent => 'The parent node. For LPAR, this specifies the CEC. For z/VM, this specifies the LPAR. For VM, this specifies the z/VM host operating system.',
|
||||
comments => 'Any user provided notes.',
|
||||
disable => "Set to 'yes' or '1' to comment out this row.",
|
||||
},
|
||||
@@ -1451,6 +1483,17 @@ my @nodeattrs = (
|
||||
tabentry => 'ppchcp.password',
|
||||
access_tabentry => 'ppchcp.hcp=attr:node',
|
||||
},
|
||||
{attr_name => 'username',
|
||||
only_if => 'nodetype=ppc',
|
||||
tabentry => 'ppchcp.username',
|
||||
access_tabentry => 'ppchcp.hcp=attr:node',
|
||||
},
|
||||
{attr_name => 'password',
|
||||
only_if => 'nodetype=ppc',
|
||||
tabentry => 'ppchcp.password',
|
||||
access_tabentry => 'ppchcp.hcp=attr:node',
|
||||
},
|
||||
|
||||
####################
|
||||
# ppc table #
|
||||
####################
|
||||
@@ -1498,16 +1541,36 @@ my @nodeattrs = (
|
||||
tabentry => 'ppc.parent',
|
||||
access_tabentry => 'ppc.node=attr:node',
|
||||
},
|
||||
{attr_name => 'nodetype',
|
||||
{attr_name => 'hwtype',
|
||||
only_if => 'mgt=fsp',
|
||||
tabentry => 'ppc.nodetype',
|
||||
access_tabentry => 'ppc.node=attr:node',
|
||||
},
|
||||
},
|
||||
{attr_name => 'hwtype',
|
||||
only_if => 'mgt=bpa',
|
||||
tabentry => 'ppc.nodetype',
|
||||
access_tabentry => 'ppc.node=attr:node',
|
||||
},
|
||||
{attr_name => 'hwtype',
|
||||
only_if => 'mgt=ivm',
|
||||
tabentry => 'ppc.nodetype',
|
||||
access_tabentry => 'ppc.node=attr:node',
|
||||
},
|
||||
{attr_name => 'hwtype',
|
||||
only_if => 'mgt=hmc',
|
||||
tabentry => 'ppc.nodetype',
|
||||
access_tabentry => 'ppc.node=attr:node',
|
||||
},
|
||||
{attr_name => 'hwtype',
|
||||
only_if => 'mgt=zvm',
|
||||
tabentry => 'zvm.nodetype',
|
||||
access_tabentry => 'ppc.node=attr:node',
|
||||
},
|
||||
{attr_name => 'supernode',
|
||||
tabentry => 'ppc.supernode',
|
||||
access_tabentry => 'ppc.node=attr:node',
|
||||
},
|
||||
{attr_name => 'sfp',
|
||||
only_if => 'nodetype=frame',
|
||||
tabentry => 'ppc.sfp',
|
||||
access_tabentry => 'ppc.node=attr:node',
|
||||
},
|
||||
@@ -1533,6 +1596,15 @@ my @nodeattrs = (
|
||||
only_if => 'mgt=fsp',
|
||||
tabentry => 'ppcdirect.password',
|
||||
access_tabentry => 'ppcdirect.hcp=attr:node::ppcdirect.username=str:general',
|
||||
},
|
||||
{attr_name => 'passwd.celogin',
|
||||
only_if => 'mgt=fsp',
|
||||
tabentry => 'ppcdirect.password',
|
||||
access_tabentry => 'ppcdirect.hcp=attr:node::ppcdirect.username=str:celogin',
|
||||
}, {attr_name => 'passwd.celogin',
|
||||
only_if => 'mgt=bpa',
|
||||
tabentry => 'ppcdirect.password',
|
||||
access_tabentry => 'ppcdirect.hcp=attr:node::ppcdirect.username=str:celogin',
|
||||
},
|
||||
{attr_name => 'passwd.HMC',
|
||||
only_if => 'mgt=bpa',
|
||||
@@ -1936,6 +2008,11 @@ push(@{$defspec{node}->{'attrs'}}, @nodeattrs);
|
||||
tabentry => 'linuximage.kernelver',
|
||||
access_tabentry => 'linuximage.imagename=attr:imagename',
|
||||
},
|
||||
{attr_name => 'krpmver',
|
||||
only_if => 'imagetype=linux',
|
||||
tabentry => 'linuximage.krpmver',
|
||||
access_tabentry => 'linuximage.imagename=attr:imagename',
|
||||
},
|
||||
{attr_name => 'permission',
|
||||
only_if => 'imagetype=linux',
|
||||
tabentry => 'linuximage.permission',
|
||||
@@ -1946,6 +2023,11 @@ push(@{$defspec{node}->{'attrs'}}, @nodeattrs);
|
||||
tabentry => 'linuximage.dump',
|
||||
access_tabentry => 'linuximage.imagename=attr:imagename',
|
||||
},
|
||||
{attr_name => 'crashkernelsize',
|
||||
only_if => 'imagetype=linux',
|
||||
tabentry => 'linuximage.crashkernelsize',
|
||||
access_tabentry => 'linuximage.imagename=attr:imagename',
|
||||
},
|
||||
####################
|
||||
# nimimage table#
|
||||
####################
|
||||
@@ -2104,6 +2186,10 @@ push(@{$defspec{node}->{'attrs'}}, @nodeattrs);
|
||||
{attr_name => 'vlanid',
|
||||
tabentry => 'networks.vlanid',
|
||||
access_tabentry => 'networks.netname=attr:netname',
|
||||
},
|
||||
{attr_name => 'domain',
|
||||
tabentry => 'networks.domain',
|
||||
access_tabentry => 'networks.netname=attr:netname',
|
||||
},
|
||||
{attr_name => 'usercomment',
|
||||
tabentry => 'networks.comments',
|
||||
|
||||
+250
-11
@@ -108,11 +108,12 @@ sub dbc_submit {
|
||||
print $clisock $data;
|
||||
$data="";
|
||||
my $lastline="";
|
||||
while ($lastline ne "ENDOFFREEZEQFVyo4Cj6Q0j\n" and $lastline ne "*XCATBUGDETECTED*76e9b54341\n") { #index($lastline,"ENDOFFREEZEQFVyo4Cj6Q0j") < 0) {
|
||||
$lastline = <$clisock>;
|
||||
while (read($clisock,$lastline,32768)) { #$lastline ne "ENDOFFREEZEQFVyo4Cj6Q0j\n" and $lastline ne "*XCATBUGDETECTED*76e9b54341\n") { #index($lastline,"ENDOFFREEZEQFVyo4Cj6Q0j") < 0) {
|
||||
# $lastline = <$clisock>;
|
||||
$data .= $lastline;
|
||||
}
|
||||
if ($lastline eq "*XCATBUGDETECTED*76e9b54341\n") { #if it was an error
|
||||
close($clisock);
|
||||
if ($lastline =~ m/\*XCATBUGDETECTED\*76e9b54341\n\z/) { #if it was an error
|
||||
#in the midst of the operation, die like it used to die
|
||||
my $err;
|
||||
$data =~ /\*XCATBUGDETECTED\*:(.*):\*XCATBUGDETECTED\*/s;
|
||||
@@ -241,8 +242,10 @@ sub handle_dbc_conn {
|
||||
@returndata = (scalar(handle_dbc_request($request)));
|
||||
}
|
||||
$response = freeze(\@returndata);
|
||||
$response .= "\nENDOFFREEZEQFVyo4Cj6Q0j\n";
|
||||
# $response .= "\nENDOFFREEZEQFVyo4Cj6Q0j\n";
|
||||
print $client $response;
|
||||
$clientset->remove($client);
|
||||
close($client);
|
||||
} else { #Connection terminated, clean up
|
||||
$clientset->remove($client);
|
||||
close($client);
|
||||
@@ -310,8 +313,12 @@ sub handle_dbc_request {
|
||||
return $opentables{$tablename}->{$autocommit}->getAllNodeAttribs(@args);
|
||||
} elsif ($functionname eq 'getAllEntries') {
|
||||
return $opentables{$tablename}->{$autocommit}->getAllEntries(@args);
|
||||
} elsif ($functionname eq 'writeAllEntries') {
|
||||
return $opentables{$tablename}->{$autocommit}->writeAllEntries(@args);
|
||||
} elsif ($functionname eq 'getAllAttribsWhere') {
|
||||
return $opentables{$tablename}->{$autocommit}->getAllAttribsWhere(@args);
|
||||
} elsif ($functionname eq 'writeAllAttribsWhere') {
|
||||
return $opentables{$tablename}->{$autocommit}->writeAllAttribsWhere(@args);
|
||||
} elsif ($functionname eq 'addAttribs') {
|
||||
return $opentables{$tablename}->{$autocommit}->addAttribs(@args);
|
||||
} elsif ($functionname eq 'setAttribs') {
|
||||
@@ -346,7 +353,12 @@ sub _set_use_cache {
|
||||
if ($dbworkerpid) {
|
||||
return dbc_call($self,'_set_use_cache',@_);
|
||||
}
|
||||
$self->{_use_cache} = shift;
|
||||
|
||||
my $usecache = shift;
|
||||
if ($usecache and not $self->{_tablecache}) {
|
||||
return; #do not allow cache to be enabled while the cache is broken
|
||||
}
|
||||
$self->{_use_cache} = $usecache;
|
||||
}
|
||||
#--------------------------------------------------------------------------------
|
||||
|
||||
@@ -480,6 +492,18 @@ sub buildcreatestmt
|
||||
if ($xcatcfg =~ /^mysql:/) { #for mysql
|
||||
$retv .= " ENGINE=$descr->{engine} ";
|
||||
}
|
||||
}
|
||||
# allow compression for DB2
|
||||
if ($descr->{compress}) {
|
||||
if ($xcatcfg =~ /^DB2:/) { #for DB2
|
||||
$retv .= " compress $descr->{compress} ";
|
||||
}
|
||||
}
|
||||
# allow tablespace change for DB2
|
||||
if ($descr->{tablespace}) {
|
||||
if ($xcatcfg =~ /^DB2:/) { #for DB2
|
||||
$retv .= " in $descr->{tablespace} ";
|
||||
}
|
||||
}
|
||||
#print "retv=$retv\n";
|
||||
return $retv;
|
||||
@@ -2028,7 +2052,7 @@ sub getNodesAttribs {
|
||||
push @locattribs,'node';
|
||||
}
|
||||
unless (grep(/^groups$/,@locattribs)) {
|
||||
push @locattribs,'node';
|
||||
push @locattribs,'groups';
|
||||
}
|
||||
$self->_build_cache(\@locattribs);
|
||||
} else {
|
||||
@@ -2045,8 +2069,10 @@ sub getNodesAttribs {
|
||||
}
|
||||
$self->_clear_cache;
|
||||
$self->{_use_cache} = 0;
|
||||
$self->{nodelist}->_clear_cache;
|
||||
$self->{nodelist}->{_use_cache} = 0;
|
||||
if ($self->{tabname} ne 'nodelist') { #avoid calling clear_cache on nodelist twice
|
||||
$self->{nodelist}->_clear_cache;
|
||||
$self->{nodelist}->{_use_cache} = 0;
|
||||
}
|
||||
return $rethash;
|
||||
}
|
||||
|
||||
@@ -2083,6 +2109,7 @@ sub _clear_cache { #PRIVATE FUNCTION TO EXPIRE CACHED DATA EXPLICITLY
|
||||
}
|
||||
#it shouldn't have been zero, but whether it was 0 or 1, ensure that the cache is gone
|
||||
$self->{_use_cache}=0; # Signal slow operation to any in-flight operations that may fail with empty cache
|
||||
$self->{_cached_attriblist} = undef;
|
||||
undef $self->{_tablecache};
|
||||
undef $self->{_nodecache};
|
||||
}
|
||||
@@ -2096,13 +2123,32 @@ sub _build_cache { #PRIVATE FUNCTION, PLEASE DON'T CALL DIRECTLY
|
||||
}
|
||||
my $attriblist = shift;
|
||||
my $refresh = not ref $attriblist; #if attriblist is not a reference, it is a refresh request
|
||||
if (not ref $attriblist) {
|
||||
$attriblist = $self->{_cached_attriblist}; #need attriblist to mean something, don't know how this didn't break horribly already
|
||||
}
|
||||
|
||||
if (not $refresh and $self->{_cache_ref}) { #we have active cache reference, increment counter and return
|
||||
#TODO: ensure that the cache isn't somehow still ludirously old
|
||||
$self->{_cache_ref} += 1;
|
||||
return;
|
||||
my $currattr;
|
||||
my $cachesufficient=1;
|
||||
foreach $currattr (@$attriblist) { #if any of the requested attributes are not cached, we must rebuild
|
||||
unless (grep { $currattr eq $_ } @{$self->{_cached_attriblist}}) {
|
||||
$cachesufficient=0;
|
||||
last;
|
||||
}
|
||||
}
|
||||
if ($cachesufficient) { return; }
|
||||
#cache is insufficient, now we must do the converse of above
|
||||
#must add any currently cached columns to new list if not requested
|
||||
foreach $currattr (@{$self->{_cached_attriblist}}) {
|
||||
unless (grep { $currattr eq $_ } @$attriblist) {
|
||||
push @$attriblist,$currattr;
|
||||
}
|
||||
}
|
||||
}
|
||||
#If here, _cache_ref indicates no cache
|
||||
if (not $refresh) {
|
||||
if (not $refresh and not $self->{_cache_ref}) { #we have active cache reference, increment counter and return
|
||||
$self->{_cache_ref} = 1;
|
||||
}
|
||||
my $oldusecache = $self->{_use_cache}; #save previous 'use_cache' setting
|
||||
@@ -2123,7 +2169,7 @@ sub _build_cache { #PRIVATE FUNCTION, PLEASE DON'T CALL DIRECTLY
|
||||
push @{$self->{_nodecache}->{$_->{$nodekey}}},$_;
|
||||
}
|
||||
}
|
||||
|
||||
$self->{_cached_attriblist} = $attriblist;
|
||||
$self->{_use_cache} = $oldusecache; #Restore setting to previous value
|
||||
$self->{_cachestamp} = time;
|
||||
}
|
||||
@@ -3689,5 +3735,198 @@ sub buildWhereClause {
|
||||
return $whereclause;
|
||||
|
||||
}
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
=head3 writeAllEntries
|
||||
|
||||
Description: Read entire table and writes all entries to file
|
||||
This routine was written specifically for the tabdump
|
||||
command.
|
||||
|
||||
Arguments:
|
||||
filename or path
|
||||
|
||||
Returns:
|
||||
0=good
|
||||
1=bad
|
||||
Globals:
|
||||
|
||||
Error:
|
||||
|
||||
Example:
|
||||
|
||||
my $tabh = xCAT::Table->new($table);
|
||||
my $recs=$tabh->writeAllEntries($filename);
|
||||
|
||||
Comments:
|
||||
none
|
||||
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
sub writeAllEntries
|
||||
{
|
||||
my $self = shift;
|
||||
if ($dbworkerpid) {
|
||||
return dbc_call($self,'writeAllEntries',@_);
|
||||
}
|
||||
my $filename = shift;
|
||||
my $fh;
|
||||
my $rc;
|
||||
# open the file for write
|
||||
unless (open($fh," > $filename")) {
|
||||
my $msg="Unable to open $filename for write \n.";
|
||||
`logger -t xcat $msg`;
|
||||
return 1;
|
||||
}
|
||||
my $query;
|
||||
my $header;
|
||||
my $tabdump_header = sub {
|
||||
$header = "#" . join(",", @_);
|
||||
};
|
||||
$tabdump_header->(@{$self->{colnames}});
|
||||
# write the header to the file
|
||||
print $fh $header; # write line to file
|
||||
print $fh "\n";
|
||||
|
||||
# delimit the disable column based on the DB
|
||||
my $disable= &delimitcol("disable");
|
||||
$query = $self->{dbh}->prepare('SELECT * FROM ' . $self->{tabname});
|
||||
|
||||
$query->execute();
|
||||
while (my $data = $query->fetchrow_hashref())
|
||||
{
|
||||
foreach (keys %$data)
|
||||
{
|
||||
if ($data->{$_} =~ /^$/)
|
||||
{
|
||||
$data->{$_} = undef;
|
||||
}
|
||||
}
|
||||
$rc=output_table($self->{tabname},$fh,$self,$data);
|
||||
}
|
||||
$query->finish();
|
||||
close $fh;
|
||||
return $rc;
|
||||
}
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
=head3 writeAllAttribsWhere
|
||||
|
||||
Description: writes all attributes to file using the "where" clause
|
||||
written for the tabdump command
|
||||
|
||||
|
||||
Arguments:
|
||||
array of attr<operator>val strings to be build into a Where clause
|
||||
filename or path
|
||||
Returns:
|
||||
Outputs to filename the table header and rows
|
||||
Globals:
|
||||
|
||||
Error:
|
||||
|
||||
Example:
|
||||
|
||||
$nodelist->getAllAttribsWhere(array of attr<operator>val,$filename);
|
||||
where operator can be
|
||||
(==,!=,=~,!~, >, <, >=,<=)
|
||||
|
||||
|
||||
|
||||
Comments:
|
||||
none
|
||||
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
sub writeAllAttribsWhere
|
||||
{
|
||||
|
||||
#Takes a list of attributes, returns all records in the table.
|
||||
my $self = shift;
|
||||
if ($dbworkerpid) {
|
||||
return dbc_call($self,'writeAllAttribsWhere',@_);
|
||||
}
|
||||
my $clause = shift;
|
||||
my $filename = shift;
|
||||
my $whereclause;
|
||||
my @attribs = @_;
|
||||
my @results = ();
|
||||
my $query;
|
||||
my $query2;
|
||||
my $fh;
|
||||
my $rc;
|
||||
# open the file for write
|
||||
unless (open($fh," > $filename")) {
|
||||
my $msg="Unable to open $filename for write \n.";
|
||||
`logger -t xcat $msg`;
|
||||
return 1;
|
||||
}
|
||||
my $header;
|
||||
my $tabdump_header = sub {
|
||||
$header = "#" . join(",", @_);
|
||||
};
|
||||
$tabdump_header->(@{$self->{colnames}});
|
||||
# write the header to the file
|
||||
print $fh $header; # write line to file
|
||||
print $fh "\n";
|
||||
$whereclause = &buildWhereClause($clause);
|
||||
|
||||
|
||||
# delimit the disable column based on the DB
|
||||
my $disable= &delimitcol("disable");
|
||||
$query2='SELECT * FROM ' . $self->{tabname} . ' WHERE (' . $whereclause . ") and ($disable is NULL or $disable in ('0','no','NO','No','nO'))";
|
||||
$query = $self->{dbh}->prepare($query2);
|
||||
$query->execute();
|
||||
while (my $data = $query->fetchrow_hashref())
|
||||
{
|
||||
foreach (keys %$data){
|
||||
|
||||
if ($data->{$_} =~ /^$/)
|
||||
{
|
||||
$data->{$_} = undef;
|
||||
}
|
||||
}
|
||||
$rc=output_table($self->{tabname},$fh,$self,$data);
|
||||
}
|
||||
$query->finish();
|
||||
close $fh;
|
||||
return $rc ;
|
||||
}
|
||||
#--------------------------------------------------------------------------
|
||||
|
||||
=head3 output_table
|
||||
|
||||
Description: writes table rows to file
|
||||
written for the tabdump command
|
||||
|
||||
=cut
|
||||
|
||||
#--------------------------------------------------------------------------------
|
||||
sub output_table {
|
||||
my $table = shift;
|
||||
my $fh = shift;
|
||||
my $tabh=shift;
|
||||
my $rec=shift;
|
||||
my $line = '';
|
||||
foreach (@{$tabh->{colnames}})
|
||||
{
|
||||
if (defined $rec->{$_})
|
||||
{
|
||||
$rec->{$_} =~ s/"/""/g;
|
||||
$line = $line . '"' . $rec->{$_} . '",';
|
||||
}
|
||||
else
|
||||
{
|
||||
$line .= ',';
|
||||
}
|
||||
}
|
||||
$line =~ s/,$//; # remove the extra comma at the end
|
||||
print $fh $line; # write line to file
|
||||
print $fh "\n";
|
||||
return 0;
|
||||
}
|
||||
1;
|
||||
|
||||
|
||||
+51
-17
@@ -28,10 +28,12 @@ my %usage = (
|
||||
rpower <noderange> [--nodeps] [of] [-V|--verbose]
|
||||
PPC (HMC) specific:
|
||||
rpower <noderange> [onstandby] [-V|--verbose]
|
||||
CEC/FSP(using Direct FSP Management) specific:
|
||||
rpower <noderange> [on|onstandby|off|stat|state|lowpower]
|
||||
Frame/BPA(using Direct FSP Management) specific:
|
||||
rpower <noderange> [stat|state|rackstandby|exit_rackstandby]
|
||||
CEC(using Direct FSP Management) specific:
|
||||
rpower <noderange> [on|onstandby|off|stat|state|lowpower|resetsp]
|
||||
Frame(using Direct FSP Management) specific:
|
||||
rpower <noderange> [stat|state|rackstandby|exit_rackstandby|resetsp]
|
||||
LPAR(using Direct FSP Management) specific:
|
||||
rpower <noderange> [on|off|reset|stat|state|boot|of|sms]
|
||||
Blade specific:
|
||||
rpower <noderange> [cycle|softoff] [-V|--verbose]
|
||||
",
|
||||
@@ -44,8 +46,8 @@ my %usage = (
|
||||
rvitals [-h|--help|-v|--version]
|
||||
FSP/LPAR (with HMC) specific:
|
||||
rvitals noderange {temp|voltage|lcds|all}
|
||||
FSP/LPAR (using Direct FSP Management)specific:
|
||||
rvitals noderange {lcds|rackenv|all}
|
||||
CEC/LPAR/Frame (using Direct FSP Management)specific:
|
||||
rvitals noderange {rackenv|lcds|all}
|
||||
MPA specific:
|
||||
rvitals noderange {temp|voltage|wattage|fanspeed|power|leds|summary|all}
|
||||
Blade specific:
|
||||
@@ -127,12 +129,36 @@ my %usage = (
|
||||
general_passwd=<currentpasswd,newpasswd>|
|
||||
*_passwd=<currentpasswd,newpasswd>|
|
||||
hostname=<*|hostname>
|
||||
BPA specific:
|
||||
FSP/CEC (using Direct FSP Management) Specific:
|
||||
rspconfig noderange HMC_passwd={currentpasswd,newpasswd}
|
||||
rspconfig noderange admin_passwd={currentpasswd,newpasswd}
|
||||
rspconfig noderange general_passwd={currentpasswd,newpasswd}
|
||||
rspconfig noderange *_passwd={currentpasswd,newpasswd}
|
||||
rspconfig <noderange> [sysname]
|
||||
rspconfig <noderange> [sysname=<*|name>]
|
||||
rspconfig <noderange> [pending_power_on_side]
|
||||
rspconfig <noderange> [pending_power_on_side=<temp|perm>]
|
||||
rspconfig <noderange> [cec_off_policy]
|
||||
rspconfig <noderange> [cec_off_policy=<poweroff|stayon>]
|
||||
BPA/Frame (using Direct FSP Management)specific:
|
||||
rspconfig noderange HMC_passwd={currentpasswd,newpasswd}
|
||||
rspconfig noderange admin_passwd={currentpasswd,newpasswd}
|
||||
rspconfig noderange general_passwd={currentpasswd,newpasswd}
|
||||
rspconfig noderange *_passwd={currentpasswd,newpasswd}
|
||||
rspconfig <noderange> [frame]
|
||||
rspconfig <noderange> frame=<*|frame>
|
||||
rspconfig <noderange> [sysname]
|
||||
rspconfig <noderange> [sysname=<*|name>]
|
||||
rspconfig <noderange> [pending_power_on_side]
|
||||
rspconfig <noderange> [pending_power_on_side=<temp|perm>]
|
||||
HMC specific:
|
||||
rspconfig <noderange> [sshcfg]
|
||||
rspconfig <noderange> [sshcfg=<enable|disable>]",
|
||||
rspconfig <noderange> [sshcfg=<enable|disable>]
|
||||
CEC|Frame(using ASM)Specific:
|
||||
rspconfig <noderange> [dev|celogin1]
|
||||
rspconfig <noderange> [dev=<enable|disable>]|
|
||||
rspconfig <noderange> [celogin1=<enable|disable>]
|
||||
",
|
||||
"getmacs" =>
|
||||
"Usage:
|
||||
Common:
|
||||
@@ -161,7 +187,7 @@ my %usage = (
|
||||
PPC (with HMC) specific:
|
||||
lsvm <noderange> [-a|--all]
|
||||
PPC (using Direct FSP Management) specific:
|
||||
lsvm <noderange> ",
|
||||
lsvm <noderange> [-l|--long]",
|
||||
"chvm" =>
|
||||
"Usage:
|
||||
Common:
|
||||
@@ -171,15 +197,17 @@ my %usage = (
|
||||
chvm <noderange> <attr>=<val> [<attr>=<val>...]
|
||||
PPC (using Direct FSP Management) specific:
|
||||
chvm <noderange> [-p <profile>]
|
||||
chvm <noderange> [lparname=<*|name>]
|
||||
chvm <noderange> -i <id> [-m <memory_interleaving>] -r <partition_rule>
|
||||
VMware specific:
|
||||
chvm <noderange> [-a size][-d disk][-p disk][--resize disk=size][--cpus count][--mem memory]",
|
||||
"rmvm" =>
|
||||
"Usage: rmvm <noderange> [--service][-V|--verbose]
|
||||
rmvm [-h|--help|-v|--version]",
|
||||
rmvm [-h|--help|-v|--version],
|
||||
rmvm [-p] [-f]",
|
||||
"lsslp" =>
|
||||
"Usage: lsslp [-h|--help|-v|--version]
|
||||
lsslp [<noderange>][-V|--verbose][-i ip[,ip..]][-w][-r|-x|-z][-n][-I][-s BPA|MM|IVM|RSA|FSP|HMC][-C counts][-T timeout]
|
||||
lsslp [<noderange>][-V|--verbose][-i ip[,ip..]][-w][-r|-x|-z][-n][-I][-s FRAME|CEC|MM|IVM|RSA|HMC][-C counts][-T timeout]
|
||||
[-t tries][-m][-e cmd][-c [timeinterval[interval,..]]][--vpdtable]
|
||||
[-M vpd|switchport][--makedhcp][--updatehost][--resetnet]",
|
||||
"rflash" =>
|
||||
@@ -200,7 +228,8 @@ my %usage = (
|
||||
mkhwconn noderange -p single_hmc [-P HMC passwd] [-V|--verbose]
|
||||
|
||||
PPC (using Direct FSP Management) specific:
|
||||
mkhwconn noderange -t [-T tooltype] [--port port_value]",
|
||||
mkhwconn noderange -t [-T tooltype] [--port port_value]
|
||||
mkhwconn noderange -s [hmcnode] [-P HMC passwd] [-V|--verbose]",
|
||||
"rmhwconn" =>
|
||||
"Usage:
|
||||
rmhwconn [-h|--help]
|
||||
@@ -209,7 +238,8 @@ my %usage = (
|
||||
rmhwconn noderange [-V|--verbose]
|
||||
|
||||
PPC (using Direct FSP Management) specific:
|
||||
rmhwconn noderange [-T tooltype]",
|
||||
rmhwconn noderange [-T tooltype]
|
||||
rmhwconn noderange -s",
|
||||
"lshwconn" =>
|
||||
"Usage:
|
||||
lshwconn [-h|--help]
|
||||
@@ -218,7 +248,8 @@ my %usage = (
|
||||
lshwconn noderange [-V|--verbose]
|
||||
|
||||
PPC (using Direct FSP Management) specific:
|
||||
lshwconn noderange [-T tooltype]",
|
||||
lshwconn noderange [-T tooltype]
|
||||
lshwconn noderange -s",
|
||||
"renergy" =>
|
||||
"Usage:
|
||||
renergy [-h | --help]
|
||||
@@ -229,8 +260,8 @@ my %usage = (
|
||||
renergy noderange [-V] { {savingstatus}={on | off} | {cappingstatus}={on | off} | {cappingwatt}=watt | {cappingperc}=percentage }
|
||||
|
||||
Power 7 server specific :
|
||||
renergy noderange [-V] { all | { [savingstatus] [dsavingstatus] [cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin] [averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed] [syssbpower] [sysIPLtime] } }
|
||||
renergy noderange [-V] { {savingstatus}={on | off} | {dsavingstatus}={on-norm | on-maxp | off} | {cappingstatus}={on | off} | {cappingwatt}=watt | {cappingperc}=percentage }
|
||||
renergy noderange [-V] { all | { [savingstatus] [dsavingstatus] [cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin] [averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed] [syssbpower] [sysIPLtime] [fsavingstatus] [ffoMin] [ffoVmin] [ffoTurbo] [ffoNorm] [ffovalue] } }
|
||||
renergy noderange [-V] { {savingstatus}={on | off} | {dsavingstatus}={on-norm | on-maxp | off} | {fsavingstatus}={on | off} | {ffovalue}=MHZ | {cappingstatus}={on | off} | {cappingwatt}=watt | {cappingperc}=percentage }
|
||||
|
||||
Blade specific :
|
||||
renergy noderange [-V] { all | pd1all | pd2all | { [pd1status] [pd2status] [pd1policy] [pd2policy] [pd1powermodule1] [pd1powermodule2] [pd2powermodule1] [pd2powermodule2] [pd1avaiablepower] [pd2avaiablepower] [pd1reservedpower] [pd2reservedpower] [pd1remainpower] [pd2remainpower] [pd1inusedpower] [pd2inusedpower] [availableDC] [averageAC] [thermaloutput] [ambienttemp] [mmtemp] } }
|
||||
@@ -245,7 +276,7 @@ my %usage = (
|
||||
updatenode <noderange> [-V|--verbose] [-k|--security] [--user]
|
||||
[--devicetype]
|
||||
or
|
||||
updatenode <noderange> [-V|--verbose] [-F|--sync] [-S|--sw]
|
||||
updatenode <noderange> [-V|--verbose] [-F|--sync | -f|--snsync] [-S|--sw]
|
||||
[-P|--scripts [script1,script2,...]] [-s|--sn]
|
||||
[-A|--updateallsw] [-c|--cmdlineonly] [-d alt_source_dir]
|
||||
[attr=val [attr=val...]]
|
||||
@@ -263,6 +294,9 @@ Options:
|
||||
|
||||
[-F|--sync] Perform File Syncing.
|
||||
|
||||
[-f|--snsync] Performs File Syncing to the service nodes that service
|
||||
the nodes in the noderange.
|
||||
|
||||
[-S|--sw] Perform Software Maintenance.
|
||||
|
||||
[-P|--scripts] Execute postscripts listed in the postscripts table or
|
||||
|
||||
+275
-95
@@ -32,6 +32,7 @@ require xCAT::NetworkUtils;
|
||||
require xCAT::Schema;
|
||||
#require Data::Dumper;
|
||||
require xCAT::NodeRange;
|
||||
require xCAT::Version;
|
||||
require DBI;
|
||||
|
||||
our @ISA = qw(Exporter);
|
||||
@@ -464,14 +465,7 @@ sub Version
|
||||
|
||||
#The following tag tells the build script where to append build info
|
||||
my $version = shift;
|
||||
if ($version eq 'short')
|
||||
{
|
||||
$version = '' #XCATVERSIONSUBHERE ;
|
||||
}
|
||||
else
|
||||
{
|
||||
$version = 'Version ' #XCATVERSIONSUBHERE #XCATSVNBUILDSUBHERE ;
|
||||
}
|
||||
$version = xCAT::Version->Version();
|
||||
return $version;
|
||||
|
||||
}
|
||||
@@ -2839,96 +2833,93 @@ sub getNodeIPaddress
|
||||
my $c1;
|
||||
my $ips;
|
||||
unless ( $nodeip ) {
|
||||
my $nttab = xCAT::Table->new('ppc');
|
||||
if ( $nttab ) {
|
||||
my $type = $nttab->getNodeAttribs($nodetocheck, ['nodetype']);
|
||||
if ($type) {
|
||||
if ($type->{nodetype} eq "frame" or $type->{nodetype} eq "cec") {
|
||||
$c1 = xCAT::DBobjUtils->getchildren($nodetocheck);
|
||||
my $type = xCAT::DBobjUtils->getnodetype($nodetocheck);
|
||||
if ($type) {
|
||||
if ($type eq "frame" or $type eq "cec") {
|
||||
$c1 = xCAT::DBobjUtils->getchildren($nodetocheck);
|
||||
|
||||
#if $port exists, only for mkhwconn ... CEC/Frame
|
||||
if ( defined($port) ) {
|
||||
my @fsp_bpa = @$c1;
|
||||
undef ($c1);
|
||||
# mkhwconn only creates the connections for the FSPs/BPAs whoes port is $port.
|
||||
my $vpd_tab = xCAT::Table->new('vpd');
|
||||
unless($vpd_tab) {
|
||||
return "-1"; # Cannot open vpd table
|
||||
}
|
||||
foreach ( @fsp_bpa ) {
|
||||
my $vpd_hash = $vpd_tab->getNodeAttribs( $_, [qw(side)]);
|
||||
my $side = $vpd_hash->{side};
|
||||
if (!defined($side)) {
|
||||
#return -2; # $_: No side in vpd table for $_
|
||||
next;
|
||||
}
|
||||
#print $side;
|
||||
if ( $side =~ /[A|a|B|b]-$port/) {
|
||||
push (@$c1, $_);
|
||||
}
|
||||
}
|
||||
$vpd_tab->close();
|
||||
|
||||
if(!defined($c1) || @$c1 == 0) {
|
||||
return "-3"; # the FSP/BPA's side is not $port.
|
||||
}
|
||||
#if $port exists, only for mkhwconn ... CEC/Frame
|
||||
if ( defined($port) ) {
|
||||
my @fsp_bpa = @$c1;
|
||||
undef ($c1);
|
||||
# mkhwconn only creates the connections for the FSPs/BPAs whoes port is $port.
|
||||
my $vpd_tab = xCAT::Table->new('vpd');
|
||||
unless($vpd_tab) {
|
||||
return "-1"; # Cannot open vpd table
|
||||
}
|
||||
|
||||
#my $hstab = xCAT::Table->new('hosts');
|
||||
#if ( $hstab ) {
|
||||
# my @myip = ();
|
||||
# foreach ( @$c1 )
|
||||
# {
|
||||
# my $point= $hstab->getNodeAttribs($_, ['ip']);
|
||||
# my $value = $point->{ip};
|
||||
# push (@myip, $value);
|
||||
# }
|
||||
# $ips = join ",", @myip;
|
||||
# return $ips;
|
||||
#}
|
||||
|
||||
#modify the way of finding IP address.
|
||||
my @myip = ();
|
||||
my @nonip =();
|
||||
foreach ( @$c1 )
|
||||
{
|
||||
my $ifip = isIpaddr($_);
|
||||
if ($ifip) {
|
||||
push (@myip, $_);
|
||||
} else {
|
||||
push (@nonip, $_);
|
||||
}
|
||||
}
|
||||
#if (scalar(@nonip)){
|
||||
# my $hstab = xCAT::Table->new('hosts');
|
||||
# if ( $hstab ) {
|
||||
# my $ent = $hstab->getNodesAttribs(\@nonip,['ip']);
|
||||
# if ($ent){
|
||||
# foreach (@nonip) {
|
||||
# my $i = $ent->{$_}->[0]->{ip};
|
||||
# push (@myip, $i);
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
#}
|
||||
foreach my $t (@nonip) {
|
||||
$nodeip = xCAT::NetworkUtils->getipaddr($t);
|
||||
if (!$nodeip) {
|
||||
my $hoststab = xCAT::Table->new( 'hosts');
|
||||
my $ent = $hoststab->getNodeAttribs( $t, ['ip'] );
|
||||
if ( $ent->{'ip'} ) {
|
||||
$nodeip = $ent->{'ip'};
|
||||
}
|
||||
}
|
||||
if($nodeip) {
|
||||
push (@myip, $nodeip);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$ips = join ",", @myip;
|
||||
return $ips;
|
||||
foreach ( @fsp_bpa ) {
|
||||
my $vpd_hash = $vpd_tab->getNodeAttribs( $_, [qw(side)]);
|
||||
my $side = $vpd_hash->{side};
|
||||
if (!defined($side)) {
|
||||
#return -2; # $_: No side in vpd table for $_
|
||||
next;
|
||||
}
|
||||
#print $side;
|
||||
if ( $side =~ /[A|a|B|b]-$port/) {
|
||||
push (@$c1, $_);
|
||||
}
|
||||
}
|
||||
$vpd_tab->close();
|
||||
|
||||
if(!defined($c1) || @$c1 == 0) {
|
||||
return "-3"; # the FSP/BPA's side is not $port.
|
||||
}
|
||||
}
|
||||
|
||||
#my $hstab = xCAT::Table->new('hosts');
|
||||
#if ( $hstab ) {
|
||||
# my @myip = ();
|
||||
# foreach ( @$c1 )
|
||||
# {
|
||||
# my $point= $hstab->getNodeAttribs($_, ['ip']);
|
||||
# my $value = $point->{ip};
|
||||
# push (@myip, $value);
|
||||
# }
|
||||
# $ips = join ",", @myip;
|
||||
# return $ips;
|
||||
#}
|
||||
|
||||
#modify the way of finding IP address.
|
||||
my @myip = ();
|
||||
my @nonip =();
|
||||
foreach ( @$c1 )
|
||||
{
|
||||
my $ifip = isIpaddr($_);
|
||||
if ($ifip) {
|
||||
push (@myip, $_);
|
||||
} else {
|
||||
push (@nonip, $_);
|
||||
}
|
||||
}
|
||||
#if (scalar(@nonip)){
|
||||
# my $hstab = xCAT::Table->new('hosts');
|
||||
# if ( $hstab ) {
|
||||
# my $ent = $hstab->getNodesAttribs(\@nonip,['ip']);
|
||||
# if ($ent){
|
||||
# foreach (@nonip) {
|
||||
# my $i = $ent->{$_}->[0]->{ip};
|
||||
# push (@myip, $i);
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
#}
|
||||
foreach my $t (@nonip) {
|
||||
$nodeip = xCAT::NetworkUtils->getipaddr($t);
|
||||
if (!$nodeip) {
|
||||
my $hoststab = xCAT::Table->new( 'hosts');
|
||||
my $ent = $hoststab->getNodeAttribs( $t, ['ip'] );
|
||||
if ( $ent->{'ip'} ) {
|
||||
$nodeip = $ent->{'ip'};
|
||||
}
|
||||
}
|
||||
if($nodeip) {
|
||||
push (@myip, $nodeip);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$ips = join ",", @myip;
|
||||
return $ips;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3518,6 +3509,9 @@ sub create_postscripts_tar
|
||||
|
||||
sub get_site_Master
|
||||
{
|
||||
if ($::XCATSITEVALS{master}) {
|
||||
return $::XCATSITEVALS{master};
|
||||
}
|
||||
require xCAT::Table;
|
||||
my $Master;
|
||||
my $sitetab = xCAT::Table->new('site');
|
||||
@@ -5735,6 +5729,10 @@ sub isIpaddr
|
||||
$addr = shift;
|
||||
}
|
||||
|
||||
unless ( $addr )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#print "addr=$addr\n";
|
||||
if ($addr !~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/)
|
||||
{
|
||||
@@ -6410,6 +6408,188 @@ sub enablessh
|
||||
return $enablessh;
|
||||
|
||||
}
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
=head3 runcmd_S
|
||||
Note this routine is being used solely by genimage to steam output. It
|
||||
will be merged with runcmd in a later release. Not all paths have been
|
||||
tested.
|
||||
Right now requires $cmd and $::CALLBACK set
|
||||
Run the given cmd and return the output in an array (already chopped).
|
||||
This routine in addition streams the output to the $::CALLBACK which is
|
||||
required input.
|
||||
Alternately, if this function is used in a scalar context, the output
|
||||
is joined into a single string with the newlines separating the lines.
|
||||
|
||||
Arguments:
|
||||
command, exitcode and reference to output
|
||||
Returns:
|
||||
see below
|
||||
Globals:
|
||||
$::RUNCMD_RC , $::CALLBACK
|
||||
Error:
|
||||
Normally, if there is an error running the cmd,it will display the
|
||||
error and exit with the cmds exit code, unless exitcode
|
||||
is given one of the following values:
|
||||
0: display error msg, DO NOT exit on error, but set
|
||||
$::RUNCMD_RC to the exit code.
|
||||
-1: DO NOT display error msg and DO NOT exit on error, but set
|
||||
$::RUNCMD_RC to the exit code.
|
||||
-2: DO the default behavior (display error msg and exit with cmds
|
||||
exit code.
|
||||
number > 0: Display error msg and exit with the given code
|
||||
|
||||
Example:
|
||||
my $outref = xCAT::Utils->runcmd($cmd, -2, 1);
|
||||
|
||||
Comments:
|
||||
If refoutput is true, then the output will be returned as a
|
||||
reference to an array for efficiency.
|
||||
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
sub runcmd_S
|
||||
|
||||
{
|
||||
|
||||
my ($class, $cmd, $exitcode, $refoutput) = @_;
|
||||
$::RUNCMD_RC = 0;
|
||||
# redirect stderr to stdout
|
||||
if (!($cmd =~ /2>&1$/)) { $cmd .= ' 2>&1'; }
|
||||
|
||||
if ($::VERBOSE)
|
||||
{
|
||||
# get this systems name as known by xCAT management node
|
||||
my $Sname = xCAT::InstUtils->myxCATname();
|
||||
my $msg;
|
||||
if ($Sname) {
|
||||
$msg = "Running command on $Sname: $cmd";
|
||||
} else {
|
||||
$msg="Running command: $cmd";
|
||||
}
|
||||
|
||||
if ($::CALLBACK){
|
||||
my $rsp = {};
|
||||
$rsp->{data}->[0] = "$msg\n";
|
||||
xCAT::MsgUtils->message("I", $rsp, $::CALLBACK);
|
||||
} else {
|
||||
xCAT::MsgUtils->message("I", "$msg\n");
|
||||
}
|
||||
}
|
||||
# steam output to $::CALLBACK and return the buffer
|
||||
my @cmd;
|
||||
push @cmd,$cmd;
|
||||
my $outref = [];
|
||||
my $outreferr = [];
|
||||
my $cmdin;
|
||||
my $cmdout;
|
||||
my $cmderr = gensym;
|
||||
my $cmdpid = open3($cmdin,$cmdout,$cmderr,@cmd);
|
||||
my $cmdsel = IO::Select->new($cmdout,$cmderr);
|
||||
#foreach (@indata) {
|
||||
# print $cmdin $_;
|
||||
#}
|
||||
close($cmdin);
|
||||
my @handles;
|
||||
my $rsp = {};
|
||||
my $output;
|
||||
my $errout;
|
||||
while ($cmdsel->count()) {
|
||||
@handles = $cmdsel->can_read();
|
||||
foreach (@handles) {
|
||||
my $line;
|
||||
my $done = sysread $_,$line,180;
|
||||
if ($done) {
|
||||
if ($_ eq $cmdout) {
|
||||
$rsp->{data}->[0] = $line;
|
||||
xCAT::MsgUtils->message("I", $rsp, $::CALLBACK, 0);
|
||||
#push @$outref,$line;
|
||||
$output .= $line;
|
||||
} else {
|
||||
$rsp->{data}->[0] = $line;
|
||||
xCAT::MsgUtils->message("I", $rsp, $::CALLBACK, 0);
|
||||
#push @$outreferr,$line;
|
||||
$errout .= $line;
|
||||
}
|
||||
} else {
|
||||
$cmdsel->remove($_);
|
||||
close($_);
|
||||
}
|
||||
}
|
||||
}
|
||||
waitpid($cmdpid,0);
|
||||
# store the return string
|
||||
push @$outref,$output;
|
||||
if ($?)
|
||||
{
|
||||
$::RUNCMD_RC = $? >> 8;
|
||||
my $displayerror = 1;
|
||||
my $rc;
|
||||
if (defined($exitcode) && length($exitcode) && $exitcode != -2)
|
||||
{
|
||||
if ($exitcode > 0)
|
||||
{
|
||||
$rc = $exitcode;
|
||||
} # if not zero, exit with specified code
|
||||
elsif ($exitcode <= 0)
|
||||
{
|
||||
$rc = ''; # if zero or negative, do not exit
|
||||
if ($exitcode < 0) { $displayerror = 0; }
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$rc = $::RUNCMD_RC;
|
||||
} # if exitcode not specified, use cmd exit code
|
||||
if ($displayerror)
|
||||
{
|
||||
my $rsp = {};
|
||||
my $errmsg = '';
|
||||
if (xCAT::Utils->isLinux() && $::RUNCMD_RC == 139)
|
||||
{
|
||||
$errmsg = "Segmentation fault $errmsg";
|
||||
}
|
||||
else
|
||||
{
|
||||
$errmsg = join('', @$outref);
|
||||
chomp $errmsg;
|
||||
|
||||
}
|
||||
if ($::CALLBACK)
|
||||
{
|
||||
$rsp->{data}->[0] =
|
||||
"Command failed: $cmd. Error message: $errmsg.\n";
|
||||
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
xCAT::MsgUtils->message("E",
|
||||
"Command failed: $cmd. Error message: $errmsg.\n");
|
||||
}
|
||||
$xCAT::Utils::errno = 29;
|
||||
}
|
||||
}
|
||||
if ($refoutput)
|
||||
{
|
||||
chomp(@$outref);
|
||||
return $outref;
|
||||
}
|
||||
elsif (wantarray)
|
||||
{
|
||||
chomp(@$outref);
|
||||
return @$outref;
|
||||
}
|
||||
else
|
||||
{
|
||||
my $line = join('', @$outref);
|
||||
chomp $line;
|
||||
return $line;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
||||
@@ -10,8 +10,8 @@ sub grab_table_data{ #grab table data relevent to VM guest nodes
|
||||
my $vpdtab = xCAT::Table->new("vpd");
|
||||
my $hmtab = xCAT::Table->new("nodehm");
|
||||
my $nttab = xCAT::Table->new("nodetype");
|
||||
my $sitetab = xCAT::Table->new("site");
|
||||
$cfghash->{site}->{genmacprefix} = xCAT::Utils->get_site_attribute('genmacprefix');
|
||||
#my $sitetab = xCAT::Table->new("site");
|
||||
$cfghash->{site}->{genmacprefix} = $::XCATSITEVALS{genmacprefix}; #xCAT::Utils->get_site_attribute('genmacprefix');
|
||||
if ($hmtab) {
|
||||
$cfghash->{nodehm} = $hmtab->getNodesAttribs($noderange,['serialspeed']);
|
||||
}
|
||||
@@ -26,7 +26,7 @@ sub grab_table_data{ #grab table data relevent to VM guest nodes
|
||||
if ($vpdtab) {
|
||||
$cfghash->{vpd} = $vpdtab->getNodesAttribs($noderange,['uuid']);
|
||||
}
|
||||
$cfghash->{vm} = $vmtab->getNodesAttribs($noderange,['node','host','migrationdest','cfgstore','storage','storagemodel','memory','cpus','nics','nicmodel','bootorder','virtflags','datacenter','guestostype','othersettings','master']);
|
||||
$cfghash->{vm} = $vmtab->getNodesAttribs($noderange,['node','host','migrationdest','cfgstore','storage','vidmodel','vidproto','storagemodel','memory','cpus','nics','nicmodel','bootorder','virtflags','datacenter','guestostype','othersettings','master']);
|
||||
my $mactab = xCAT::Table->new("mac",-create=>1);
|
||||
my $nrtab= xCAT::Table->new("noderes",-create=>1);
|
||||
$cfghash->{mac} = $mactab->getAllNodeAttribs(['mac'],1);
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env perl
|
||||
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
||||
package xCAT::Version;
|
||||
|
||||
BEGIN
|
||||
{
|
||||
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
|
||||
}
|
||||
|
||||
# if AIX - make sure we include perl 5.8.2 in INC path.
|
||||
# Needed to find perl dependencies shipped in deps tarball.
|
||||
if ($^O =~ /^aix/i) {
|
||||
use lib "/usr/opt/perl5/lib/5.8.2/aix-thread-multi";
|
||||
use lib "/usr/opt/perl5/lib/5.8.2";
|
||||
use lib "/usr/opt/perl5/lib/site_perl/5.8.2/aix-thread-multi";
|
||||
use lib "/usr/opt/perl5/lib/site_perl/5.8.2";
|
||||
}
|
||||
|
||||
use lib "$::XCATROOT/lib/perl";
|
||||
# do not put a use or require for xCAT::Table here. Add to each new routine
|
||||
# needing it to avoid reprocessing of user tables ( ExtTab.pm) for each command call
|
||||
use strict;
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
=head3 Version
|
||||
Arguments:
|
||||
Optional 'short' string to request only the version;
|
||||
Returns:
|
||||
xcat Version number
|
||||
Globals:
|
||||
none
|
||||
Error:
|
||||
none
|
||||
Example:
|
||||
$version=xCAT::Version->Version();
|
||||
Comments:
|
||||
none
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
sub Version
|
||||
{
|
||||
|
||||
#The following tag tells the build script where to append build info
|
||||
my $version = shift;
|
||||
if ($version eq 'short')
|
||||
{
|
||||
$version = '' #XCATVERSIONSUBHERE ;
|
||||
}
|
||||
else
|
||||
{
|
||||
$version = 'Version ' #XCATVERSIONSUBHERE #XCATSVNBUILDSUBHERE ;
|
||||
}
|
||||
return $version;
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
+159
-89
@@ -3,106 +3,176 @@ use DBI;
|
||||
use File::Find;
|
||||
use File::Spec;
|
||||
use File::Path;
|
||||
|
||||
my $yumrepofile;
|
||||
my $distname;
|
||||
my $arch;
|
||||
my $installpfx;
|
||||
|
||||
sub localize_yumrepo {
|
||||
my $self = shift;
|
||||
my $installroot = shift;
|
||||
$distname = shift;
|
||||
$arch = shift;
|
||||
my $dosqlite = 0;
|
||||
my $repomdfile;
|
||||
my $primaryxml;
|
||||
$installpfx = "$installroot/$distname/$arch";
|
||||
mkpath("$installroot/postscripts/repos/$distname/$arch/");
|
||||
open($yumrepofile,">","$installroot/postscripts/repos/$distname/$arch/local-repository.tmpl");
|
||||
find(\&check_tofix,$installpfx);
|
||||
close($yumrepofile);
|
||||
my $self = shift;
|
||||
my $installroot = shift;
|
||||
$distname = shift;
|
||||
$arch = shift;
|
||||
|
||||
$installpfx = "$installroot/$distname/$arch";
|
||||
mkpath("$installroot/postscripts/repos/$distname/$arch/");
|
||||
open($yumrepofile,">","$installroot/postscripts/repos/$distname/$arch/local-repository.tmpl");
|
||||
find(\&check_tofix,$installpfx);
|
||||
close($yumrepofile);
|
||||
}
|
||||
sub check_tofix {
|
||||
if (-d $File::Find::name and $File::Find::name =~ /\/repodata$/) {
|
||||
fix_directory($File::Find::name);
|
||||
if($distname =~ /rhels5/)
|
||||
{
|
||||
fix_directory($File::Find::name);
|
||||
}
|
||||
generate_repo($File::Find::name);
|
||||
}
|
||||
}
|
||||
sub generate_repo
|
||||
{
|
||||
#write local-repository.tmpl
|
||||
my $dirlocation = shift;
|
||||
my @dircomps = File::Spec->splitdir($dirlocation);
|
||||
pop(@dircomps);
|
||||
my $yumurl = File::Spec->catdir(@dircomps);
|
||||
$yumurl =~ s!$installpfx!http://#INSTSERVER#/install/$distname/$arch/!;
|
||||
my $reponame = $dircomps[$#dircomps];
|
||||
print $yumrepofile "[local-$distname-$arch-$reponame]\n";
|
||||
print $yumrepofile "name=xCAT configured yum repository for $distname/$arch/$reponame\n";
|
||||
print $yumrepofile "baseurl=$yumurl\n";
|
||||
print $yumrepofile "enabled=1\n";
|
||||
print $yumrepofile "gpgcheck=0\n\n";
|
||||
}
|
||||
sub fix_directory {
|
||||
my $dirlocation = shift;
|
||||
my @dircomps = File::Spec->splitdir($dirlocation);
|
||||
pop(@dircomps);
|
||||
my $yumurl = File::Spec->catdir(@dircomps);
|
||||
$yumurl =~ s!$installpfx!http://#INSTSERVER#/install/$distname/$arch/!;
|
||||
my $reponame = $dircomps[$#dircomps];
|
||||
print $yumrepofile "[local-$distname-$arch-$reponame]\n";
|
||||
print $yumrepofile "name=xCAT configured yum repository for $distname/$arch/$reponame\n";
|
||||
print $yumrepofile "baseurl=$yumurl\n";
|
||||
print $yumrepofile "enabled=1\n";
|
||||
print $yumrepofile "gpgcheck=0\n\n";
|
||||
my $oldsha=`/usr/bin/sha1sum $dirlocation/primary.xml.gz`;
|
||||
my $olddbsha;
|
||||
my @xmlines;
|
||||
@xmlines = ();
|
||||
$oldsha =~ s/\s.*//;
|
||||
chomp($oldsha);
|
||||
unlink("$dirlocation/primary.xml");
|
||||
system("/bin/gunzip $dirlocation/primary.xml.gz");
|
||||
my $oldopensha=`/usr/bin/sha1sum $dirlocation/primary.xml`;
|
||||
$oldopensha =~ s/\s+.*//;
|
||||
chomp($oldopensha);
|
||||
open($primaryxml,"+<$dirlocation/primary.xml");
|
||||
while (<$primaryxml>) {
|
||||
s!xml:base="media://[^"]*"!!g;
|
||||
push @xmlines,$_;
|
||||
}
|
||||
seek($primaryxml,0,0);
|
||||
print $primaryxml (@xmlines);
|
||||
truncate($primaryxml,tell($primaryxml));
|
||||
@xmlines=();
|
||||
close($primaryxml);
|
||||
my $newopensha=`/usr/bin/sha1sum $dirlocation/primary.xml`;
|
||||
system("/bin/gzip $dirlocation/primary.xml");
|
||||
my $newsha=`/usr/bin/sha1sum $dirlocation/primary.xml.gz`;
|
||||
$newopensha =~ s/\s.*//;
|
||||
$newsha =~ s/\s.*//;
|
||||
chomp($newopensha);
|
||||
chomp($newsha);
|
||||
my $newdbsha;
|
||||
my $newdbopensha;
|
||||
my $olddbopensha;
|
||||
if (-r "$dirlocation/primary.sqlite.bz2") {
|
||||
$olddbsha =`/usr/bin/sha1sum $dirlocation/primary.sqlite.bz2`;
|
||||
$olddbsha =~ s/\s.*//;
|
||||
chomp($olddbsha);
|
||||
unlink("$dirlocation/primary.sqlite");
|
||||
system("/usr/bin/bunzip2 $dirlocation/primary.sqlite.bz2");
|
||||
$olddbopensha=`/usr/bin/sha1sum $dirlocation/primary.sqlite`;
|
||||
$olddbopensha =~ s/\s+.*//;
|
||||
chomp($olddbopensha);
|
||||
my $pdbh = DBI->connect("dbi:SQLite:$dirlocation/primary.sqlite","","",{AutoCommit=>1});
|
||||
$pdbh->do('UPDATE "packages" SET "location_base" = NULL');
|
||||
$pdbh->disconnect;
|
||||
$newdbopensha=`/usr/bin/sha1sum $dirlocation/primary.sqlite`;
|
||||
system("/usr/bin/bzip2 $dirlocation/primary.sqlite");
|
||||
$newdbsha=`/usr/bin/sha1sum $dirlocation/primary.sqlite.bz2`;
|
||||
$newdbopensha =~ s/\s.*//;
|
||||
$newdbsha =~ s/\s.*//;
|
||||
chomp($newdbopensha);
|
||||
chomp($newdbsha);
|
||||
}
|
||||
open($primaryxml,"+<$dirlocation/repomd.xml");
|
||||
while (<$primaryxml>) {
|
||||
s!xml:base="media://[^"]*"!!g;
|
||||
s!$oldsha!$newsha!g;
|
||||
s!$oldopensha!$newopensha!g;
|
||||
if ($olddbsha) { s!$olddbsha!$newdbsha!g; }
|
||||
if ($olddbsha) { s!$olddbopensha!$newdbopensha!g; }
|
||||
push @xmlines,$_;
|
||||
}
|
||||
seek($primaryxml,0,0);
|
||||
print $primaryxml (@xmlines);
|
||||
truncate($primaryxml,tell($primaryxml));
|
||||
close($primaryxml);
|
||||
@xmlines=();
|
||||
|
||||
my @xmlines=();
|
||||
my $primaryxml;
|
||||
|
||||
$grep_result = system("grep sha256 $dirlocation/repomd.xml|grep \\<checksum");
|
||||
if( $grep_result == 0 )
|
||||
{
|
||||
$sha_command = "sha256sum";
|
||||
}
|
||||
else
|
||||
{
|
||||
$sha_command = "sha1sum";
|
||||
}
|
||||
#-----------------------------------------------------------------------
|
||||
my $oldsha;
|
||||
my $newsha;
|
||||
my $oldopensha;
|
||||
my $newopensha;
|
||||
|
||||
if( -r "$dirlocation/primary.xml.gz")
|
||||
{
|
||||
$oldsha=`/usr/bin/$sha_command $dirlocation/primary.xml.gz`;
|
||||
$oldsha =~ s/\s.*//;
|
||||
chomp($oldsha);
|
||||
|
||||
#update primary.xml.gz & primary.xml
|
||||
if( -r "$dirlocation/primary.xml")
|
||||
{
|
||||
unlink("$dirlocation/primary.xml");
|
||||
}
|
||||
system("/bin/gunzip $dirlocation/primary.xml.gz");
|
||||
|
||||
$oldopensha=`/usr/bin/$sha_command $dirlocation/primary.xml`;
|
||||
$oldopensha =~ s/\s+.*//;
|
||||
chomp($oldopensha);
|
||||
|
||||
open($primaryxml,"+<$dirlocation/primary.xml");
|
||||
while (<$primaryxml>) {
|
||||
s!xml:base="media://[^"]*"!!g;
|
||||
push @xmlines,$_;
|
||||
}
|
||||
seek($primaryxml,0,0);
|
||||
print $primaryxml (@xmlines);
|
||||
truncate($primaryxml,tell($primaryxml));
|
||||
@xmlines=();
|
||||
close($primaryxml);
|
||||
|
||||
$newopensha=`/usr/bin/$sha_command $dirlocation/primary.xml`;
|
||||
$newopensha =~ s/\s.*//;
|
||||
chomp($newopensha);
|
||||
|
||||
system("/bin/gzip $dirlocation/primary.xml");
|
||||
$newsha=`/usr/bin/$sha_command $dirlocation/primary.xml.gz`;
|
||||
$newsha =~ s/\s.*//;
|
||||
chomp($newsha);
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
my $newdbsha;
|
||||
my $olddbsha;
|
||||
my $newdbopensha;
|
||||
my $olddbopensha;
|
||||
|
||||
if (-r "$dirlocation/primary.sqlite.bz2") {
|
||||
|
||||
$olddbsha =`/usr/bin/$sha_command $dirlocation/primary.sqlite.bz2`;
|
||||
$olddbsha =~ s/\s.*//;
|
||||
chomp($olddbsha);
|
||||
|
||||
#update primary.sqlite.bz2 & primary.sqlite
|
||||
if ( -r "$dirlocation/primary.sqlite")
|
||||
{
|
||||
unlink("$dirlocation/primary.sqlite");
|
||||
}
|
||||
|
||||
system("/usr/bin/bunzip2 $dirlocation/primary.sqlite.bz2");
|
||||
$olddbopensha=`/usr/bin/$sha_command $dirlocation/primary.sqlite`;
|
||||
$olddbopensha =~ s/\s+.*//;
|
||||
chomp($olddbopensha);
|
||||
|
||||
my $pdbh = DBI->connect("dbi:SQLite:$dirlocation/primary.sqlite","","",{AutoCommit=>1});
|
||||
$pdbh->do('UPDATE "packages" SET "location_base" = NULL');
|
||||
$pdbh->disconnect;
|
||||
$newdbopensha=`/usr/bin/$sha_command $dirlocation/primary.sqlite`;
|
||||
$newdbopensha =~ s/\s.*//;
|
||||
chomp($newdbopensha);
|
||||
|
||||
system("/usr/bin/bzip2 $dirlocation/primary.sqlite");
|
||||
$newdbsha=`/usr/bin/$sha_command $dirlocation/primary.sqlite.bz2`;
|
||||
$newdbsha =~ s/\s.*//;
|
||||
chomp($newdbsha);
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
#update repomd.xml
|
||||
open($primaryxml,"+<$dirlocation/repomd.xml");
|
||||
while (<$primaryxml>) {
|
||||
if($_ =~ m/\<size\>/)
|
||||
{
|
||||
next;
|
||||
}
|
||||
if($_ =~ m/\<open-size\>/)
|
||||
{
|
||||
next;
|
||||
}
|
||||
s!xml:base="media://[^"]*"!!g;
|
||||
if(defined($oldsha)){
|
||||
s!$oldsha!$newsha!g;
|
||||
}
|
||||
if(defined($oldopensha)){
|
||||
s!$oldopensha!$newopensha!g;
|
||||
}
|
||||
if(defined($olddbsha)){
|
||||
s!$olddbsha!$newdbsha!g;
|
||||
}
|
||||
if(defined($olddbopensha)){
|
||||
s!$olddbopensha!$newdbopensha!g;
|
||||
}
|
||||
push @xmlines,$_;
|
||||
}
|
||||
seek($primaryxml,0,0);
|
||||
print $primaryxml (@xmlines);
|
||||
truncate($primaryxml,tell($primaryxml));
|
||||
close($primaryxml);
|
||||
@xmlines=();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -130,6 +130,37 @@ sub setNodeProp {
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 setNodeProps
|
||||
|
||||
Description : Set node properties in a given table
|
||||
Arguments : Table name
|
||||
Node
|
||||
Reference to property name/value hash
|
||||
Returns : Nothing
|
||||
Example : xCAT::zvmUtils->setNodeProps($tabName, $node, \%propHash);
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
sub setNodeProps {
|
||||
|
||||
# Get inputs
|
||||
my ( $class, $tabName, $node, $propHash ) = @_;
|
||||
|
||||
# Get table
|
||||
my $tab = xCAT::Table->new( $tabName, -create => 1, -autocommit => 0 );
|
||||
|
||||
# Set property
|
||||
$tab->setAttribs( { 'node' => $node }, $propHash );
|
||||
|
||||
# Save table
|
||||
$tab->commit;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 delTabEntry
|
||||
|
||||
Description : Delete a table entry
|
||||
@@ -1053,4 +1084,70 @@ sub getUserProfile {
|
||||
# Return the file contents
|
||||
$out = `ssh $hcp "cat $file"`;
|
||||
return $out;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 inArray
|
||||
|
||||
Description : Checks if a value exists in an array
|
||||
Arguments : Value to search for
|
||||
Array to search in
|
||||
Returns : The searched expression
|
||||
Example : my $rtn = xCAT::zvmUtils->inArray($needle, @haystack);
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
sub inArray {
|
||||
|
||||
# Get inputs
|
||||
my ( $class, $needle, @haystack ) = @_;
|
||||
return grep{ $_ eq $needle } @haystack;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 getOsVersion
|
||||
|
||||
Description : Get the operating system of a given node
|
||||
Arguments : Node
|
||||
Returns : Operating system name
|
||||
Example : my $os = xCAT::zvmUtils->getOsVersion($node);
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
sub getOsVersion {
|
||||
|
||||
# Get inputs
|
||||
my ( $class, $node ) = @_;
|
||||
|
||||
my $os = '';
|
||||
my $version = '';
|
||||
|
||||
# Get operating system
|
||||
my $release = `ssh -o ConnectTimeout=2 $node "cat /etc/*release"`;
|
||||
my @lines = split('\n', $release);
|
||||
if (grep(/SLES|Enterprise Server/, @lines)) {
|
||||
$os = 'sles';
|
||||
$version = $lines[0];
|
||||
$version =~ tr/\.//;
|
||||
$version =~ s/[^0-9]*([0-9]+).*/$1/;
|
||||
$os = $os . $version;
|
||||
|
||||
# Append service level
|
||||
$version = `echo "$release" | grep "LEVEL"`;
|
||||
$version =~ tr/\.//;
|
||||
$version =~ s/[^0-9]*([0-9]+).*/$1/;
|
||||
$os = $os . 'sp' . $version;
|
||||
} elsif (grep(/Red Hat Enterprise Linux Server/, @lines)) {
|
||||
$os = 'rhel';
|
||||
$version = $lines[0];
|
||||
$version =~ tr/\.//;
|
||||
$version =~ s/([A-Za-z\s\(\)]+)//g;
|
||||
$os = $os . $version;
|
||||
}
|
||||
|
||||
return xCAT::zvmUtils->trimStr($os);
|
||||
}
|
||||
@@ -27,3 +27,5 @@ libstdc++-devel.ppc
|
||||
libstdc++-devel.ppc64
|
||||
glibc-devel.ppc
|
||||
glibc-devel.ppc64
|
||||
|
||||
redhat-lsb.ppc64
|
||||
|
||||
@@ -44,3 +44,4 @@ xorg-x11-libs-32bit
|
||||
xorg-x11-libX11
|
||||
xorg-x11-libXext
|
||||
|
||||
insserv
|
||||
|
||||
@@ -14,6 +14,7 @@ I:pessl.rte.up
|
||||
I:pessl.rte.smp
|
||||
I:pessl.rte.rs1
|
||||
I:pessl.rte.mp
|
||||
# If you are using PESSL 4.1.0 or beyond, comment pessl.rte.hv out, it's not needed.
|
||||
I:pessl.rte.hv
|
||||
I:pessl.rte.common
|
||||
I:pessl.rte
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Sample script to accept licenses and install ESSL and PESSL packages
|
||||
# For AIX:
|
||||
# TBD
|
||||
# For Linux:
|
||||
# Assumes all prerequisite software has been installed (e.g. compilers)
|
||||
|
||||
|
||||
OS=`uname`
|
||||
INSTALL_DIR='/install'
|
||||
ESSL_DIR=$essldir
|
||||
|
||||
if [ -z "$ESSL_DIR" ]; then
|
||||
# try to default
|
||||
ESSL_DIR=$INSTALL_DIR/post/otherpkgs/$OSVER/$ARCH/essl
|
||||
fi
|
||||
|
||||
|
||||
|
||||
if [ $OS != "AIX" ]; then
|
||||
if [ $NODESETSTATE == "install" ] || [ $NODESETSTATE == "boot" ]; then
|
||||
# Being run from a stateful install postscript
|
||||
# Copy rpms directly from the xCAT management node and install
|
||||
mkdir -p /tmp/essl
|
||||
rm -f -R /tmp/essl/*
|
||||
cd /tmp/essl
|
||||
download_dir=`echo $ESSL_DIR | cut -d '/' -f3-`
|
||||
wget -l inf -N -r --waitretry=10 --random-wait --retry-connrefused -t 10 -T 60 -nH --cut-dirs=5 ftp://$SITEMASTER/$download_dir/*.rpm 2> /tmp/wget.log
|
||||
#rpm -Uvh essl.license*.rpm
|
||||
IBM_ESSL_LICENSE_ACCEPT=yes rpm -Uvh essl*.rpm
|
||||
#install_essl=`find /opt/ibmmath/essl -name install_essl -print`
|
||||
#if [ -n "$install_essl" ] ; then
|
||||
# $install_essl -y -d . -nodocs
|
||||
#fi
|
||||
#rpm -Uvh pessl.license*.rpm
|
||||
IBM_PESSL_LICENSE_ACCEPT=yes rpm -Uvh pessl*.rpm
|
||||
#install_pessl=`find /opt/ibmmath/pessl -name install_pessl -print`
|
||||
#if [ -n "$install_pessl" ] ; then
|
||||
# $install_pessl -y -d . -nodocs
|
||||
#fi
|
||||
rm -Rf /tmp/essl
|
||||
fi
|
||||
|
||||
if [ $NODESETSTATE == "genimage" ]; then
|
||||
# Being called from <image>.postinstall script
|
||||
# Assume we are on the same machine
|
||||
tmpdir=tmpessl
|
||||
mkdir $installroot/$tmpdir
|
||||
cp -p $ESSL_DIR/* $installroot/$tmpdir
|
||||
#rpm --root $installroot -Uvh $installroot/$tmpdir/essl.license*.rpm
|
||||
IBM_ESSL_LICENSE_ACCEPT=yes rpm --root $installroot -Uvh $installroot/$tmpdir/essl*.rpm
|
||||
cd $installroot
|
||||
#install_essl=`find opt/ibmmath/essl -name install_essl -print`
|
||||
#if [ -n "$install_essl" ] ; then
|
||||
# chroot $installroot /$install_essl -y -nodocs -d /$tmpdir
|
||||
#fi
|
||||
#rpm --root $installroot -Uvh $installroot/$tmpdir/pessl.license*.rpm
|
||||
IBM_PESSL_LICENSE_ACCEPT=yes rpm --root $installroot -Uvh $installroot/$tmpdir/pessl*.rpm
|
||||
#install_pessl=`find opt/ibmmath/pessl -name install_pessl -print`
|
||||
#if [ -n "$install_pessl" ] ; then
|
||||
# chroot $installroot /$install_pessl -y -nodocs -d /$tmpdir
|
||||
#fi
|
||||
rm -rf $installroot/$tmpdir
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#image,file,options,comments,disable
|
||||
"ALL","/home/",,"for user management, PE,LL use non-root user",
|
||||
"ALL","/var/loadl/","persistent","used by LL log, spool and exec",
|
||||
|
||||
"ALL","/etc/LoadL.cfg","tmpfs","used by LL llcompute.sh",
|
||||
|
@@ -140,9 +140,10 @@ chmod 777 $installroot$logdir/core
|
||||
# Owner set to 'loadl' userid, change if using a different userid
|
||||
chown -R $loadl_admin:$loadl_group $installroot$logdir/
|
||||
|
||||
if [ "$NODESETSTATE" == "genimage" ] && [ -f /etc/LoadL.cfg ] ; then
|
||||
cp /etc/LoadL.cfg $installroot/etc/LoadL.cfg
|
||||
fi
|
||||
# UNCOMMENT to let llcompute.sh/llserver.sh to create /etc/LoadL.cfg
|
||||
#if [ "$NODESETSTATE" == "genimage" ] && [ -f /etc/LoadL.cfg ] ; then
|
||||
# cp /etc/LoadL.cfg $installroot/etc/LoadL.cfg
|
||||
#fi
|
||||
|
||||
|
||||
# UNCOMMENT to Start loadleveler during postscripts
|
||||
|
||||
@@ -3,3 +3,6 @@
|
||||
#INCLUDE:/opt/xcat/share/xcat/IBMhpc/pe/pe.otherpkgs.pkglist#
|
||||
#INCLUDE:/opt/xcat/share/xcat/IBMhpc/essl/essl.otherpkgs.pkglist#
|
||||
#INCLUDE:/opt/xcat/share/xcat/IBMhpc/loadl/login-loadl.otherpkgs.pkglist#
|
||||
|
||||
xcat/xcat-core/perl-xCAT
|
||||
xcat/xcat-core/xCAT-client
|
||||
@@ -7,3 +7,6 @@
|
||||
#INCLUDE:/opt/xcat/share/xcat/IBMhpc/pe/pe.otherpkgs.pkglist#
|
||||
#INCLUDE:/opt/xcat/share/xcat/IBMhpc/essl/essl.otherpkgs.pkglist#
|
||||
#INCLUDE:/opt/xcat/share/xcat/IBMhpc/loadl/login-loadl.otherpkgs.pkglist#
|
||||
|
||||
xcat/xcat-core/perl-xCAT
|
||||
xcat/xcat-core/xCAT-client
|
||||
@@ -28,3 +28,5 @@ libstdc++-devel.ppc
|
||||
libstdc++-devel.ppc64
|
||||
glibc-devel.ppc
|
||||
glibc-devel.ppc64
|
||||
|
||||
redhat-lsb.ppc64
|
||||
|
||||
@@ -53,3 +53,4 @@ libstdc++33
|
||||
#xorg-x11-libX11
|
||||
#xorg-x11-libXext
|
||||
|
||||
insserv
|
||||
|
||||
@@ -8,11 +8,8 @@ I:ppe.openshmem
|
||||
I:ppe.rte
|
||||
I:ppe.loc.license
|
||||
|
||||
# PE HPC toolkit, needed on login node, it will be merged into ppe.rte, need to verify before GA.
|
||||
#I:ppe.hpct
|
||||
|
||||
# LAPI
|
||||
I:rsct.lapi
|
||||
# PE HPC toolkit, needed on login node
|
||||
#I:ppedev.hpct
|
||||
|
||||
# MetaCluster (checkpoint/restore)
|
||||
I:mcr.rte
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
pe/src
|
||||
pe/ibm_openshmem_*
|
||||
pe/ppe_rte_*
|
||||
|
||||
# PE HPC toolkit, needed on login node
|
||||
#pe/ppedev_hpct_*
|
||||
@@ -5,16 +5,6 @@
|
||||
# For AIX:
|
||||
# TBD
|
||||
# For Linux:
|
||||
# - For full-disk installs:
|
||||
# - Copy rpms to node
|
||||
# - Install and accept PE license rpm
|
||||
# - Install PE rpms
|
||||
# - For diskless images:
|
||||
# - Install PE license on MN if not already installed
|
||||
# - Install PE license rpm into image, but DO NOT ACCEPT
|
||||
# (java accept program will hang)
|
||||
# - Copy PE license files from MN into image
|
||||
# - Install PE rpms
|
||||
# - Create a smaller PNSD log file in /tmp
|
||||
# - Configure poe.limits file
|
||||
|
||||
@@ -33,87 +23,6 @@ if [ $NODESETSTATE != "genimage" ]; then
|
||||
installroot=""
|
||||
fi
|
||||
|
||||
|
||||
|
||||
if [ $OS != "AIX" ]; then
|
||||
if [ $NODESETSTATE == "install" ] || [ $NODESETSTATE == "boot" ]; then
|
||||
# Being run from a stateful install postscript
|
||||
# Copy rpms directly from the xCAT management node and install
|
||||
mkdir -p /tmp/pe
|
||||
rm -f -R /tmp/pe/*
|
||||
cd /tmp/pe
|
||||
download_dir=`echo $PE_DIR | cut -d '/' -f3-`
|
||||
wget -l inf -N -r --waitretry=10 --random-wait --retry-connrefused -t 10 -T 60 -nH --cut-dirs=5 ftp://$SITEMASTER/$download_dir/*.rpm 2> /tmp/wget.log
|
||||
if [ ! -f /opt/ibmhpc/install/sbin/accept_ppe_license.sh ] ; then
|
||||
rpm -Uvh IBM_pe_license*.rpm
|
||||
fi
|
||||
IBM_PE_LICENSE_PROMPT=N /opt/ibmhpc/install/sbin/accept_ppe_license.sh
|
||||
##############
|
||||
### TEMPORARY FOR xCAT 2.6 Beta:
|
||||
#rpm -Uvh --force ibm_pami*.rpm ibm_pe*.rpm ppe_*.rpm
|
||||
rpm -Uvh --force ibm_openshmem*.rpm ppe_rte*.rpm --nodeps
|
||||
##############
|
||||
cd /
|
||||
rm -Rf /tmp/pe
|
||||
fi
|
||||
|
||||
if [ $NODESETSTATE == "genimage" ]; then
|
||||
# Being called from <image>.postinstall script
|
||||
# Assume we are on the same machine
|
||||
if [[ $OS = sles* ]] || [[ $OS = suse* ]] || [[ -f /etc/SuSE-release ]]; then
|
||||
# For SLES, assume zypper is available on the system running genimage
|
||||
if [ ! -d /etc/opt/ibmhpc/license ] ; then
|
||||
# Install and accept PE license on the MN
|
||||
IBM_PE_LICENSE_PROMPT=N zypper install $PE_DIR/IBM_pe_license*.rpm
|
||||
fi
|
||||
# Install PE license rpm into image, BUT DO NOT ACCEPT
|
||||
# The java process fails when you try to run in chroot
|
||||
#zypper -R $installroot install $PE_DIR/IBM_pe_license*.rpm
|
||||
# Copy license files from MN into the image
|
||||
mkdir -p $installroot/etc/opt/ibmhpc/license
|
||||
cp -pR /etc/opt/ibmhpc/license/* $installroot/etc/opt/ibmhpc/license
|
||||
# Install PE product rpms
|
||||
INUCLIENTS=1 INUBOSTYPE=1 zypper -R $installroot install $PE_DIR/ibm_lapi*.rpm $PE_DIR/ibm_pe*.rpm $PE_DIR/ppe_*.rpm
|
||||
else
|
||||
# For Redhat, etc., assume yum is available on the system running genimage
|
||||
if [ ! -d /etc/opt/ibmhpc/license ] ; then
|
||||
# Install and accept PE license on the MN
|
||||
IBM_PE_LICENSE_PROMPT=N yum --nogpgcheck localupdate $PE_DIR/IBM_pe_license*.rpm
|
||||
#IBM_PE_LICENSE_PROMPT=N yum --nogpgcheck install $PE_DIR/IBM_pe_license*.rpm
|
||||
fi
|
||||
# Install PE license rpm into image, BUT DO NOT ACCEPT
|
||||
# The java process fails when you try to run in chroot
|
||||
##############
|
||||
### TEMPORARY FOR xCAT 2.6 Beta:
|
||||
#yum --installroot $installroot --nogpgcheck install $PE_DIR/IBM_pe_license*.rpm
|
||||
yum --installroot $installroot --nogpgcheck install $PE_DIR/IBM_pe_license*.rpm
|
||||
##############
|
||||
# Copy license files from MN into the image
|
||||
mkdir -p $installroot/etc/opt/ibmhpc/license
|
||||
cp -pR /etc/opt/ibmhpc/license/* $installroot/etc/opt/ibmhpc/license
|
||||
##############
|
||||
### TEMPORARY FOR xCAT 2.6 Beta:
|
||||
#chroot $installroot /opt/ibmhpc/install/sbin/accept_ppe_license.sh
|
||||
chroot $installroot /opt/ibmhpc/install/sbin/accept_ppe_license.sh
|
||||
# Install PE product rpms
|
||||
#INUCLIENTS=1 INUBOSTYPE=1 yum --installroot $installroot --nogpgcheck install $PE_DIR/ibm_lapi*.rpm $PE_DIR/ibm_pe*.rpm $PE_DIR/ppe_*.rpm
|
||||
chroot $installroot mkdir -p /tmp/pe
|
||||
chroot $installroot rm -f -R /tmp/pe/*
|
||||
|
||||
download_dir=`echo $PE_DIR | cut -d '/' -f3-`
|
||||
echo $download_dir
|
||||
### we had to set SITEMASTER to MN IP explicitly in our test cluster
|
||||
#SITEMASTER=10.0.0.1
|
||||
chroot $installroot wget -l inf -N -r --waitretry=10 --random-wait --retry-connrefused -t 10 -T 60 -nH --cut-dirs=5 ftp://$SITEMASTER/$download_dir/*.rpm --directory-prefix=/tmp/pe
|
||||
chroot $installroot /bin/rpm -ivh /tmp/pe/s*.rpm /tmp/pe/p*.rpm /tmp/pe/ibm_*.rpm --nodeps
|
||||
chroot $installroot /bin/rm -r /tmp/pe
|
||||
##############
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Configure the PNSD.cfg to use a smaller log so it doesn't use so much memory
|
||||
# for a stateless image. Normally, pnsd creates this file if it does not
|
||||
# exist, but it will not fill it in if it does exist.
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#image,file,options,comments,disable
|
||||
"ALL","/var/ct/","bind","for rsct",
|
||||
"ALL","/etc/objrepos/","bind","for rsct",
|
||||
"ALL","/var/ct/","","for rsct",
|
||||
"ALL","/etc/objrepos/","","for rsct",
|
||||
|
||||
|
@@ -35,12 +35,12 @@ if [ $OS != "AIX" ]; then
|
||||
# rsct don't need license. So not install and accept the rsct license on the MN
|
||||
|
||||
# Install RSCT product rpms
|
||||
INUCLIENTS=1 INUBOSTYPE=1 zypper -R $installroot install $RSCT_DIR/src-*.rpm $RSCT_DIR/rsct.core-*.rpm $RSCT_DIR/rsct.core.utils-*.rpm
|
||||
INUCLIENTS=1 INUBOSTYPE=1 zypper -n -R $installroot install $RSCT_DIR/src-*.rpm $RSCT_DIR/rsct.core-*.rpm $RSCT_DIR/rsct.core.utils-*.rpm
|
||||
else
|
||||
# For Redhat, etc., assume yum is available on the system running genimage
|
||||
# rsct don't need license. So not install and accept the rsct license on the MN
|
||||
# Install RSCT product rpms
|
||||
INUCLIENTS=1 INUBOSTYPE=1 yum --installroot $installroot --nogpgcheck install $RSCT_DIR/src-*.rpm $RSCT_DIR/rsct.core-*.rpm $RSCT_DIR/rsct.core.utils-*.rpm
|
||||
INUCLIENTS=1 INUBOSTYPE=1 yum -y --installroot $installroot --nogpgcheck install $RSCT_DIR/src-*.rpm $RSCT_DIR/rsct.core-*.rpm $RSCT_DIR/rsct.core.utils-*.rpm
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
# For TEAL GPFS collector service node
|
||||
I:teal.gpfs-sn
|
||||
@@ -0,0 +1,2 @@
|
||||
# For TEAL GPFS collector service node
|
||||
gpfs/teal-gpfs-sn
|
||||
@@ -683,42 +683,42 @@ table a:hover {
|
||||
}
|
||||
|
||||
/*--------------- Provision and monitor forms ---------------*/
|
||||
.rmcnormal {
|
||||
.monitornormal {
|
||||
border: 2px outset #7FFFD4;
|
||||
background: #66CD00;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.rmcwarning {
|
||||
.mornitorwarning {
|
||||
background: #FFD700;
|
||||
border: 2px outset #EEEE00;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.rmcerror {
|
||||
.monitorerror {
|
||||
background: #FF3030;
|
||||
border: 2px outset #FF4040;
|
||||
}
|
||||
|
||||
.rmcunknown {
|
||||
.monitorunknown {
|
||||
background: #8B8B7A;
|
||||
border: 2px outset #858585;
|
||||
}
|
||||
|
||||
.rmcnodeli {
|
||||
.monitornodeli {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.rmcsumdiv {
|
||||
.monitorsumdiv {
|
||||
width: 300px;
|
||||
height: 150px;
|
||||
float: left;
|
||||
margin: 0px 0px 10px 0px;
|
||||
}
|
||||
|
||||
.rmcnodediv {
|
||||
.monitornodediv {
|
||||
width: 240px;
|
||||
height: 120px;
|
||||
margin: 0px 0px 15px 0px;
|
||||
|
||||
@@ -31,7 +31,25 @@ function loadGangliaMon() {
|
||||
gangliaTab.append(nodes);
|
||||
|
||||
// Create info bar
|
||||
var info = createInfoBar('Select a group to view the nodes summary');
|
||||
var gangliaLnk = $('<a href="#">Click here</a>');
|
||||
gangliaLnk.css( {
|
||||
'color' : 'blue',
|
||||
'text-decoration' : 'none'
|
||||
});
|
||||
gangliaLnk.click(function() {
|
||||
// Open a new window for Ganglia
|
||||
window.open('../ganglia/');
|
||||
});
|
||||
|
||||
// Create info bar
|
||||
var info = $('<div class="ui-state-highlight ui-corner-all"></div>');
|
||||
info.append('<span class="ui-icon ui-icon-info" style="display: inline-block; margin: 10px 5px;"></span>');
|
||||
var msg = $('<p style="display: inline-block; width: 95%;"></p>');
|
||||
msg.append('Select a group to view the nodes summary. ');
|
||||
msg.append(gangliaLnk);
|
||||
msg.append(' to open the Ganglia page.');
|
||||
info.append(msg);
|
||||
info.css('margin-bottom', '10px');
|
||||
nodes.append(info);
|
||||
|
||||
// Get groups
|
||||
|
||||
@@ -277,7 +277,7 @@ function showRmcSummary(returnData) {
|
||||
summaryTable.append(summaryRow);
|
||||
}
|
||||
summaryRow.append(tempTd);
|
||||
attrDiv = $('<div id="monitorsumdiv' + attr + '" class="rmcsumdiv"></div>');
|
||||
attrDiv = $('<div id="monitorsumdiv' + attr + '" class="monitorsumdiv"></div>');
|
||||
tempTd.append(attrDiv);
|
||||
for ( var i in attrValues) {
|
||||
tempArray.push( [ globalTimeStamp[i], Number(attrValues[i]) ]);
|
||||
@@ -352,13 +352,13 @@ function parseRmcData(returnData){
|
||||
}
|
||||
|
||||
function createUnkownNode(nodeName){
|
||||
var tempLi = '<li class="rmcunknown ui-corner-all rmcnodeli" id="' + nodeName + '" ' +
|
||||
var tempLi = '<li class="monitorunknown ui-corner-all monitornodeli" id="' + nodeName + '" ' +
|
||||
'title="Name:' + nodeName + '<br/>Unknown"></li>';
|
||||
return tempLi;
|
||||
}
|
||||
|
||||
function createErrorNode(nodeName){
|
||||
var tempLi = '<li class="rmcerror ui-corner-all rmcnodeli id="' + nodeName + '" ' +
|
||||
var tempLi = '<li class="monitorerror ui-corner-all monitornodeli id="' + nodeName + '" ' +
|
||||
'title="Name:' + nodeName + '<br/>Error"></li>';
|
||||
}
|
||||
|
||||
@@ -407,13 +407,13 @@ function showRmcNodes(data, nodename) {
|
||||
memAvg = parseInt(tempSum / index);
|
||||
|
||||
if (cpuAvg >= 10 && memAvg <= 90){
|
||||
classname = 'rmcnormal';
|
||||
classname = 'monitornormal';
|
||||
}
|
||||
else{
|
||||
classname = 'rmcwarning';
|
||||
classname = 'mornitorwarning';
|
||||
}
|
||||
|
||||
var normalLi = $('<li class="' + classname + ' ui-corner-all rmcnodeli" id="' + nodename + '" title="' +
|
||||
var normalLi = $('<li class="' + classname + ' ui-corner-all monitornodeli" id="' + nodename + '" title="' +
|
||||
'Name:' + nodename + '<br/> CpuIdle: ' + cpuAvg + '%<br/> MemFree: ' + memAvg + '%"></li>');
|
||||
|
||||
$('#rmcmonDetail ul').append(normalLi);
|
||||
@@ -446,7 +446,7 @@ function showNode(nodeName) {
|
||||
for ( var attr in globalNodesDetail[nodeName]) {
|
||||
var tempTd = $('<td style="border:0px;padding:1px 1px;"></td>');
|
||||
var attrChat = $('<div id="monitornodediv' + nodeName + attr
|
||||
+ '" class="rmcnodediv"></div>');
|
||||
+ '" class="monitornodediv"></div>');
|
||||
if (0 == parseNum % 4) {
|
||||
nodeRow = $('<tr></tr>');
|
||||
nodeTable.append(nodeRow);
|
||||
|
||||
@@ -94,6 +94,8 @@ function submit_request($req, $skipVerify, $opts_array){
|
||||
set_time_limit(900); // Set 15 minutes timeout (for long running requests)
|
||||
// The default is 30 seconds which is too short for some requests
|
||||
|
||||
// Turn on output buffering
|
||||
ob_start();
|
||||
while(!feof($fp)) { // Read until there is no more
|
||||
// Remove newlines and add it to the response
|
||||
$str = fread($fp, 8192);
|
||||
@@ -109,12 +111,12 @@ function submit_request($req, $skipVerify, $opts_array){
|
||||
format_TBD($tmp);
|
||||
} else {
|
||||
// Print out output by default
|
||||
echo $tmp . '<br/>';
|
||||
echo '<pre>' . $tmp . '</pre>';
|
||||
ob_flush();
|
||||
flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Look for serverdone response
|
||||
@@ -144,6 +146,9 @@ function submit_request($req, $skipVerify, $opts_array){
|
||||
} else {
|
||||
echo "<p>xCAT submit request socket error: $errno - $errstr</p>";
|
||||
}
|
||||
|
||||
// Flush (send) the output buffer and turn off output buffering
|
||||
ob_end_flush();
|
||||
|
||||
// Close syslog
|
||||
closelog();
|
||||
|
||||
+293
-16
@@ -90,6 +90,7 @@ if (
|
||||
'h|help' => \$::HELP,
|
||||
'v|version' => \$::VERSION,
|
||||
'V|verbose' => \$::VERBOSE,
|
||||
'p|passwd' => \$::PASSWD,
|
||||
'r|rm' => \$::RM,
|
||||
)
|
||||
)
|
||||
@@ -154,15 +155,21 @@ if ($::RM)
|
||||
}
|
||||
|
||||
|
||||
if ((!($::INIT)) && (!($::SETUPODBC)))
|
||||
if ((!($::INIT)) && (!($::SETUPODBC)) && (!($::PASSWD)))
|
||||
{
|
||||
xCAT::MsgUtils->message("I", "Either -i or -o flag must be chosen");
|
||||
xCAT::MsgUtils->message("I", "Either -i,-o or -p flag must be chosen");
|
||||
&usage;
|
||||
exit(1);
|
||||
}
|
||||
if ((!($::SERVER)) && (!($::CLIENT)))
|
||||
if (($::PASSWD) && ($::VERBOSE))
|
||||
{
|
||||
xCAT::MsgUtils->message("I", "Either -S or -C flag must be chosen");
|
||||
xCAT::MsgUtils->message("I", "Change password cannot be used with Verbose mode. ");
|
||||
&usage;
|
||||
exit(1);
|
||||
}
|
||||
if ((!($::SERVER)) && (!($::CLIENT))&& (!($::PASSWD)))
|
||||
{
|
||||
xCAT::MsgUtils->message("I", "Either -S, -C, or -p flag must be chosen");
|
||||
&usage;
|
||||
exit(1);
|
||||
}
|
||||
@@ -176,7 +183,7 @@ if (($::SERVER) && ($::CLIENT))
|
||||
if ((!($::SERVER)) && (!($::CLIENT)) && ($::SETUPODBC))
|
||||
{
|
||||
xCAT::MsgUtils->message("I",
|
||||
"Either -S or -C flag must be chosen with the -o flag");
|
||||
"Either -S or -C flag must be chosen with the -o flag.");
|
||||
&usage;
|
||||
exit(1);
|
||||
}
|
||||
@@ -220,10 +227,12 @@ $::xcatrunningdb2 = 0;
|
||||
# determine the location of the xcatdb instance
|
||||
#
|
||||
$::databaseloc = "/var/lib/db2"; # database location default
|
||||
$::databaselocdir = "/var/lib"; # database path
|
||||
# if database location environment variable is set, use it
|
||||
if ($ENV{'DATABASELOC'}) # input where xcatdb is located
|
||||
{
|
||||
$::databaseloc = $ENV{'DATABASELOC'};
|
||||
$::databaselocdir = $ENV{'DATABASELOC'};
|
||||
$::databaseloc .="\/db2";
|
||||
} else { # use site.databaseloc if set
|
||||
my $cmd = " XCATBYPASS=1 tabdump site | grep databaseloc";
|
||||
@@ -232,12 +241,20 @@ if ($ENV{'DATABASELOC'}) # input where xcatdb is located
|
||||
{
|
||||
(my $attr, my $db) = split(",", $output[0]);
|
||||
(my $q, $::databaseloc) = split("\"", $db);
|
||||
$::databaselocdir = $::databaseloc;
|
||||
$::databaseloc .="\/db2";
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!(-e $::databaselocdir)){ # if it does not exist, create it
|
||||
my $cmd = "mkdir -p $::databaselocdir";
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
xCAT::MsgUtils->message("E", " $cmd failed.");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
# if we are on the MN ( db2 server)
|
||||
if ($::SERVER)
|
||||
{
|
||||
@@ -277,9 +294,10 @@ if ($::SERVER)
|
||||
|
||||
# if not just odbc update and xcat MN is not already running on DB2
|
||||
# or if we are setting up the Client and not just the ODBC
|
||||
# or change password
|
||||
# then Get instance password
|
||||
#
|
||||
if ((($odbconly == 0) && ($::xcatrunningdb2 == 0)) || (($::CLIENT) && ($odbconly == 0)))
|
||||
if ((($odbconly == 0) && ($::xcatrunningdb2 == 0)) || (($::CLIENT) && ($odbconly == 0)) || ($::PASSWD))
|
||||
{
|
||||
if ($ENV{'XCATDB2PW'}) # passwd supplied
|
||||
{
|
||||
@@ -288,14 +306,32 @@ if ((($odbconly == 0) && ($::xcatrunningdb2 == 0)) || (($::CLIENT) && ($odbconly
|
||||
else
|
||||
{ #prompt for password
|
||||
|
||||
my $msg = "Input the password for xcatdb instance id: ";
|
||||
my $msg = "Enter the password for xcatdb instance id: ";
|
||||
xCAT::MsgUtils->message('I', "$msg");
|
||||
`stty -echo`;
|
||||
chop($::adminpassword = <STDIN>);
|
||||
`stty echo`;
|
||||
$msg = "Retype the password for xcatdb instance id: ";
|
||||
xCAT::MsgUtils->message('I', "$msg");
|
||||
`stty -echo`;
|
||||
chop(my $adminpwd2 = <STDIN>);
|
||||
`stty echo`;
|
||||
if ($::adminpassword ne $adminpwd2) { # no match
|
||||
$msg = "Sorry, passwords do not match. ";
|
||||
xCAT::MsgUtils->message('I', "$msg");
|
||||
exit 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# if we are just changing the password for the instance
|
||||
# do it and exit
|
||||
if ($::PASSWD) {
|
||||
my $rc=0;
|
||||
$rc=&updatepasswd;
|
||||
exit $rc;
|
||||
}
|
||||
|
||||
# initial setup request and not already running db2
|
||||
if (($::INIT) && ($::xcatrunningdb2 == 0))
|
||||
{
|
||||
@@ -433,6 +469,9 @@ if (($::INIT) && ($::xcatrunningdb2 == 0))
|
||||
xCAT::MsgUtils->message("I",
|
||||
"xCAT is running on the DB2 database.\n");
|
||||
|
||||
# add cron entry for table reorg
|
||||
&updatecrontab;
|
||||
|
||||
}
|
||||
else # client
|
||||
{
|
||||
@@ -481,8 +520,8 @@ sub usage
|
||||
'I',
|
||||
"Usage:\ndb2sqlsetup - Performs the setup of IBM DB2 for xCAT to use as its database. See man db2sqlsetup for more information."
|
||||
);
|
||||
my $msg =
|
||||
"db2sqlsetup <-h|--help>\n <-v|--version>\n <-i|--init> <-S|-C> [-o|--setupODBC] [-V|--verbose]\n <-o|--setupODBC> <-S|-C> [-V|--verbose]\n <-r|--rm> <-S|-C> [-V|--verbose]";
|
||||
my $msg=
|
||||
"db2sqlsetup <-h|--help>\n <-v|--version>\n <-i|--init> <-S|-C> [-o|--setupODBC] [-V|--verbose]\n <-o|--setupODBC> <-S|-C> [-V|--verbose]\n <-p|--passwd> [-S|-C]\n ";
|
||||
|
||||
xCAT::MsgUtils->message('I', "$msg");
|
||||
}
|
||||
@@ -502,7 +541,11 @@ sub startxcatd
|
||||
my $xcmd;
|
||||
if ($::osname eq 'AIX')
|
||||
{
|
||||
$xcmd = "$::XCATROOT/sbin/restartxcatd";
|
||||
if ($ENV{'XCATDB2QUIET'} == 1){ # don't show errors
|
||||
$xcmd = "$::XCATROOT/sbin/restartxcatd >/dev/null 2>&1";
|
||||
} else {
|
||||
$xcmd = "$::XCATROOT/sbin/restartxcatd";
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
@@ -674,6 +717,11 @@ sub mkdb2user
|
||||
}
|
||||
|
||||
# set xcatdb id password
|
||||
my $verboseflg=0;
|
||||
if ($::VERBOSE) { # do not show commands with password
|
||||
$verboseflg=1;
|
||||
$::VERBOSE=undef;
|
||||
}
|
||||
$cmd = qq~echo "xcatdb:$::adminpassword" | /bin/chpasswd -c~;
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
@@ -682,6 +730,9 @@ sub mkdb2user
|
||||
xCAT::MsgUtils->message("SE", " $cmd failed.");
|
||||
exit(1);
|
||||
}
|
||||
if ($verboseflg == 1) {
|
||||
$::VERBOSE=1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ # Linux
|
||||
@@ -735,6 +786,11 @@ sub mkdb2user
|
||||
}
|
||||
|
||||
# set xcatdb id password
|
||||
my $verboseflg=0;
|
||||
if ($::VERBOSE) { # do not show commands with password
|
||||
$verboseflg=1;
|
||||
$::VERBOSE=undef;
|
||||
}
|
||||
$cmd = qq~echo $::adminpassword | passwd xcatdb --stdin~;
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
@@ -743,6 +799,9 @@ sub mkdb2user
|
||||
xCAT::MsgUtils->message("SE", " $cmd failed.");
|
||||
exit(1);
|
||||
}
|
||||
if ($verboseflg == 1) {
|
||||
$::VERBOSE=1;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -793,7 +852,7 @@ db2c_xcatdb 50001/tcp # Port for server connection";
|
||||
|
||||
Create the db2 server or client instance
|
||||
For server
|
||||
run <db2installpath>/instance/db2icrt -a server -p db2c_xcatdb -s ese -u xcatdb xcatdb
|
||||
run <db2installpath>/instance/db2icrt -a server -p db2c_xcatdb -u xcatdb xcatdb
|
||||
For Client
|
||||
run <db2installpath>/instance/db2icrt -s client xcatdb
|
||||
|
||||
@@ -820,7 +879,7 @@ sub setupinstance
|
||||
if ($::SERVER)
|
||||
{
|
||||
|
||||
$cmd .= "-a server -p db2c_xcatdb -s ese -u xcatdb xcatdb ";
|
||||
$cmd .= "-a server -p db2c_xcatdb -u xcatdb xcatdb ";
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{ # if error exit
|
||||
@@ -909,6 +968,45 @@ sub setupinstance
|
||||
{
|
||||
xCAT::MsgUtils->message("SI", " $cmd warning.");
|
||||
}
|
||||
# add export of EXTSHM to /etc/rc.db2 on AIX, so env variable will
|
||||
# be exported when db2fmcd starts the database on reboot
|
||||
my $message;
|
||||
if ($::osname eq 'AIX') {
|
||||
my $rcdb2file="/etc/rc.db2";
|
||||
my $entry="EXTSHM=ON\nexport EXTSHM";
|
||||
my $entry2="#!/usr/bin/ksh \nEXTSHM=ON\nexport EXTSHM";
|
||||
if (-e($rcdb2file)) { # add to file
|
||||
$cmd = "fgrep EXTSHM $rcdb2file"; # check to see if there
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
if ($::RUNCMD_RC != 0) # if not there
|
||||
{
|
||||
$cmd = "echo \"$entry\" >> $rcdb2file";
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
$message = "$cmd failed. Could not setup $rcdb2file. This will affect running ISNM on the system.";
|
||||
xCAT::MsgUtils->message("E", "$message");
|
||||
}
|
||||
}
|
||||
} else{ # create the file
|
||||
$cmd = "echo \"$entry2\" >> $rcdb2file";
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
$message = "$cmd failed. Could not setup $rcdb2file. This will affect running ISNM on the system. Please check documentation for manual setup. ";
|
||||
xCAT::MsgUtils->message("E", "$message");
|
||||
} else {
|
||||
$cmd = "chmod 554 $rcdb2file";
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
xCAT::MsgUtils->message("E", " $cmd failed.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1365,10 +1463,81 @@ sub setupODBC
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $message =
|
||||
"\nunixODBC is not installed. If on AIX, it should be first obtained from the xcat dependency tarballs and installed before we can setup the ODBC. If on Linux, install from the OS CDs. If RHEL6 and ppc is being used then both unixODBC.*.ppc64 and unixODBC.*.ppc should be installed. ";
|
||||
"\nunixODBC is not installed. If on AIX, it should be first obtained from the xcat dependency tarballs and installed before we can setup the ODBC. If on Linux, install from the OS CDs. If Redhat and ppc is being used then both unixODBC.*.ppc64 and unixODBC.*.ppc should be installed. ";
|
||||
xCAT::MsgUtils->message("E", " $cmd failed. $message");
|
||||
exit(1);
|
||||
}
|
||||
# For CNM you must have the 32 bit version on Unix ODBC, Pam,
|
||||
# and openssl installed on Redhat. Put out a warning.
|
||||
if ($::linuxos =~ /rh.*/) {
|
||||
$cmd = "rpm -qa | grep unixODBC";
|
||||
my @output=xCAT::Utils->runcmd($cmd, 0);
|
||||
# check for two lines one ppc and one ppc64
|
||||
my $foundppc64 =0;
|
||||
my $foundppc =0;
|
||||
foreach my $line (@output) {
|
||||
if ($line =~ /\.ppc$/i) {
|
||||
$foundppc=1;
|
||||
}
|
||||
if ($line =~ /\.ppc64$/i) {
|
||||
$foundppc64=1;
|
||||
}
|
||||
}
|
||||
if (($foundppc64 !=1) || ($foundppc != 1))
|
||||
{
|
||||
my $message =
|
||||
"If Redhat on power is being used then both unixODBC.*.ppc64 and unixODBC.*.ppc rpms must be installed. ";
|
||||
xCAT::MsgUtils->message("I", "$message");
|
||||
|
||||
}
|
||||
# check pam 32 and 64 bit installed
|
||||
@output=();
|
||||
$cmd = "rpm -qa | grep \^pam-";
|
||||
@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
# check for two lines one ppc and one ppc64
|
||||
$foundppc64 =0;
|
||||
$foundppc =0;
|
||||
foreach my $line (@output) {
|
||||
if ($line =~ /\.ppc$/i) {
|
||||
$foundppc=1;
|
||||
}
|
||||
if ($line =~ /\.ppc64$/i) {
|
||||
$foundppc64=1;
|
||||
}
|
||||
}
|
||||
if (($foundppc64 !=1) || ($foundppc != 1))
|
||||
{
|
||||
my $message =
|
||||
"If Redhat on power is being used then both pam-*.ppc64 and pam-*.ppc rpms must be installed. ";
|
||||
xCAT::MsgUtils->message("I", "$message");
|
||||
|
||||
}
|
||||
# check openssl 32 and 64 bit installed
|
||||
@output=();
|
||||
$cmd = "rpm -qa | grep \^openssl-";
|
||||
@output=xCAT::Utils->runcmd($cmd, 0);
|
||||
# check for two lines one ppc and one ppc64
|
||||
$foundppc64 =0;
|
||||
$foundppc =0;
|
||||
foreach my $line (@output) {
|
||||
if ($line =~ /\.ppc$/i) {
|
||||
$foundppc=1;
|
||||
}
|
||||
if ($line =~ /\.ppc64$/i) {
|
||||
$foundppc64=1;
|
||||
}
|
||||
}
|
||||
if (($foundppc64 !=1) || ($foundppc != 1))
|
||||
{
|
||||
my $message =
|
||||
"If Redhat on power is being used then both openssl*.ppc64 and openssl*.ppc rpms must be installed. ";
|
||||
xCAT::MsgUtils->message("I", "$message");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
my @rpmoutput;
|
||||
my $odbcinstfile;
|
||||
@@ -1460,7 +1629,7 @@ sub setupODBC
|
||||
$sharedlibaix = "$::databaseloc/sqllib/lib/libdb2.so";
|
||||
} else {
|
||||
$sharedlib32="$::databaseloc/sqllib/lib32/libdb2.so";
|
||||
$sharedlib64="/var/lib/db2/sqllib/lib/libdb2o.so";
|
||||
$sharedlib64="$::databaseloc/sqllib/lib/libdb2o.so";
|
||||
}
|
||||
$cmd = "fgrep -i DB2 $odbcinstfile ";
|
||||
xCAT::Utils->runcmd($cmd, -1);
|
||||
@@ -1620,6 +1789,11 @@ sub createcfgloc
|
||||
xCAT::MsgUtils->message("E", " $cmd failed.");
|
||||
}
|
||||
}
|
||||
my $verboseflg=0;
|
||||
if ($::VERBOSE) { # do not show commands with password
|
||||
$verboseflg=1;
|
||||
$::VERBOSE=undef;
|
||||
}
|
||||
my $db2entry = "DB2:xcatdb|xcatdb|$::adminpassword";
|
||||
$cmd = "echo \"$db2entry\" > $cfgloc";
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
@@ -1630,6 +1804,9 @@ sub createcfgloc
|
||||
exit(1);
|
||||
|
||||
}
|
||||
if ($verboseflg == 1) {
|
||||
$::VERBOSE=1;
|
||||
}
|
||||
|
||||
# allow readonly by root
|
||||
chmod 0600, $cfgloc;
|
||||
@@ -1685,6 +1862,28 @@ sub restorexcatdb
|
||||
}
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
=head3 updatecrontab
|
||||
|
||||
Sets up a crontab entry to reorg the database, once a week on Sunday
|
||||
night midnight
|
||||
|
||||
=cut
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
sub updatecrontab
|
||||
{
|
||||
my $cmd="/opt/xcat/share/xcat/tools/reorgtbls";
|
||||
my $entry="0 0 * * 0 $cmd";
|
||||
my ($code, $msg)=xCAT::Utils::add_cron_job($entry);
|
||||
if ($code==0) {
|
||||
xCAT::MsgUtils->message("I", "A crontab entry has been added to run DB2 table reorg once a week on Sunday 12am.\nIf you would like to change this time, use crontab -e to modify the entry for reorgtbls execution.\nYou may also limit the tables to reorg by using the -t parameter on reorgtbls.\nRun reorgtbls -h.");
|
||||
} else {
|
||||
xCAT::MsgUtils->message("W", " Failed to add crontab entry for Table reorg.");
|
||||
}
|
||||
}
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
=head3 adddb2paths
|
||||
|
||||
Add paths to db2 commands to /etc/profile and ~.profile
|
||||
@@ -2190,6 +2389,84 @@ sub remove
|
||||
xCAT::MsgUtils->message("I", "Cleanup completely finished. $error errors have got. \n");
|
||||
|
||||
}
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
=head3 updatepasswd
|
||||
|
||||
if -S , then update the xcatdb instance password on the MN
|
||||
-C , then update the xcatdb instance password on the clients (SN)
|
||||
if just -p , then update the xcatdb intance password on both
|
||||
|
||||
=cut
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
sub updatepasswd
|
||||
|
||||
{
|
||||
my $rc=0;
|
||||
$ENV{'XCATDB2QUIET'} = 1;
|
||||
my $updateclient=0;
|
||||
my $updateserver=0;
|
||||
if ($::SERVER) { # going to update the server MN
|
||||
$updateserver=1;
|
||||
}
|
||||
|
||||
if ($::CLIENT) { # going to update the clients (SNs)
|
||||
$updateclient=1;
|
||||
}
|
||||
if ((!($::CLIENT)) && (!($::SERVER))) { # update both MN and SNs
|
||||
$updateserver=1;
|
||||
$updateclient=1;
|
||||
}
|
||||
my $snlist;
|
||||
# must read the database before we change the password on the MN
|
||||
# to get the list of Service Nodes
|
||||
if ($updateclient==1) {
|
||||
if (xCAT::Utils->isMN()) { # if on Management Node
|
||||
my @allSN=xCAT::Utils->getAllSN;
|
||||
foreach my $nodes (@allSN) {
|
||||
$snlist.=$nodes;
|
||||
$snlist.="\,";
|
||||
}
|
||||
chop $snlist;
|
||||
}
|
||||
}
|
||||
# change password on the MN
|
||||
if ($updateserver==1) { # we will change the MN
|
||||
# then shutdown xcatd
|
||||
# First change xcatd password
|
||||
# change /etc/xcat/cfgloc
|
||||
# then restart xcatd
|
||||
# change odbc password, if it exists
|
||||
&shutdownxcatd;
|
||||
&mkdb2user;
|
||||
&createcfgloc;
|
||||
&startxcatd;
|
||||
&setupODBC;
|
||||
}
|
||||
# change password on the Service Nodes
|
||||
# note this routine will be run on the SN's also from xdsh
|
||||
if ($updateclient==1) { # Update the clients
|
||||
if (xCAT::Utils->isMN()) { # if on Management Node
|
||||
# xdsh <servicenodes> -v /opt/xcat/bin/db2sqlsetup -C -p
|
||||
my $cmd="xdsh $snlist -v DATABASELOC=$::databaselocdir XCATDB2PW=$::adminpassword \/opt\/xcat\/bin\/db2sqlsetup -C -p";
|
||||
xCAT::Utils->runcmd($cmd, 0);
|
||||
if ($::RUNCMD_RC != 0)
|
||||
{
|
||||
my $cmd2="xdsh $snlist -v DATABASELOC=$::databaselocdir XCATDB2PW=XXXXXX \/opt\/xcat\/bin\/db2sqlsetup -C -p";
|
||||
my $message =
|
||||
"$cmd2 failed. Could not change password on all the Service Nodes";
|
||||
xCAT::MsgUtils->message("E", "$message");
|
||||
}
|
||||
} else { # on the SN
|
||||
&shutdownxcatd;
|
||||
&mkdb2user;
|
||||
&createcfgloc;
|
||||
&startxcatd;
|
||||
&setupODBC;
|
||||
}
|
||||
}
|
||||
|
||||
return $::RUNCMD_RC;
|
||||
}
|
||||
|
||||
+124
-244
@@ -12,14 +12,11 @@ use strict;
|
||||
use Getopt::Long;
|
||||
require xCAT::MsgUtils;
|
||||
require xCAT::DSHCLI;
|
||||
require xCAT::Client;
|
||||
|
||||
use xCAT::Utils;
|
||||
use Term::ANSIColor;
|
||||
use File::Basename;
|
||||
# genimage is a wrapper to the genimages located in
|
||||
# /opt/xcat/share/xcat/netboot/<os>/
|
||||
# put tab completion
|
||||
# colors
|
||||
# remember the last one done
|
||||
|
||||
$::XCATROOT = "/opt/xcat";
|
||||
my $os = "";
|
||||
my $profile = "";
|
||||
@@ -33,10 +30,14 @@ my @profiles; # available profiles
|
||||
my $profDir; # root where you do ./genimage from
|
||||
my $help;
|
||||
my $match = 0;
|
||||
my $color = 0;
|
||||
my $imagename;
|
||||
my $arch;
|
||||
my $permission;
|
||||
my $rootlimit;
|
||||
my $tmplimit;
|
||||
my $krpmver;
|
||||
my $kerneldir;
|
||||
my $mode;
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
@@ -47,44 +48,51 @@ my $permission;
|
||||
#-----------------------------------------------------------------------------
|
||||
sub print_usage
|
||||
{
|
||||
print "Usage: genimage -h\n";
|
||||
print " genimage -v\n";
|
||||
print " genimage [-i <nodebootif>] [-n <nodenetdrivers>] [-r <additional_nics>]\n [-o <os>] [-p <profile>] [-k <kernal_version>]\n";
|
||||
print " genimage [-i <nodebootif>] [-n <nodenetdrivers>] [-r <additional_nics>]\n [-k <kernal_version>] image_name\n";
|
||||
print "Examples:\n";
|
||||
print " genimage -i eth0 -n igb,e1000e,bnx2 -o centos5.4 -p compute\n";
|
||||
print " genimage -o suse11\n";
|
||||
print " genimage\n";
|
||||
print " genimage -i eth0 -n igb,e1000e,bnx2 myimage\n";
|
||||
print " genimage myimage\n";
|
||||
print "Usage:\n";
|
||||
print ' genimage -o <osver> [-a <arch>] -p <profile> -i <nodebootif> -n <nodenetdrivers> [-r <otherifaces>] [-k <kernelver>] [-g <krpmver>] [-m statelite] [-l rootlimitsize] [-t tmplimitsize] [--permission <permission>]'."\n\n";
|
||||
print ' genimage [-o <osver>] [-a <arch>] [-p <profile>] [-i <nodebootif>] [-n <nodenetdrivers>] [-r <otherifaces>] [-k <kernelver>] [-g <krpmver>] [-m statelite] [-l rootlimitsize] [-t tmplimitsize] [--permission <permission>] <imagename>'."\n\n";
|
||||
print " --permission is used for statelite only\n";
|
||||
print " -g is used for SLES only\n\n";
|
||||
print " -m is used for urbuntu, debian and fedora12 only\n\n";
|
||||
print "Examples:\n";
|
||||
print " genimage -i eth0 -n tg3 -o sles11 -p compute\n";
|
||||
print " genimage -i eth0 -r eth1,eth2 -n tg3,bnx2 -o centos5.1 -p compute\n";
|
||||
print " genimage -i eth0 -n tg3,bnx2 -o sles11 -p compute\n";
|
||||
print " genimage -i eth0 -n igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot --permission 777\n";
|
||||
print " genimage -i eth0 -n tg3 myimagename\n";
|
||||
print " genimage myimagename\n";
|
||||
}
|
||||
|
||||
if (!GetOptions(
|
||||
'o=s' => \$os,
|
||||
'i=s' => \$interface,
|
||||
'a=s' => \$arch,
|
||||
'p=s' => \$profile,
|
||||
'n=s' => \$drivers,
|
||||
'k=s' => \$kernel,
|
||||
'r=s' => \$otherInterfaces,
|
||||
'h|help' => \$help,
|
||||
'v|version' => \$version,
|
||||
'c' => \$color
|
||||
|
||||
'a=s' => \$arch,
|
||||
'p=s' => \$profile,
|
||||
'o=s' => \$os,
|
||||
'n=s' => \$drivers,
|
||||
'i=s' => \$interface,
|
||||
'r=s' => \$otherInterfaces,
|
||||
'l=s' => \$rootlimit,
|
||||
't=s' => \$tmplimit,
|
||||
'k=s' => \$kernel,
|
||||
'g=s' => \$krpmver,
|
||||
'm=s' => \$mode,
|
||||
'permission=s' => \$permission,
|
||||
'kerneldir=s' => \$kerneldir,
|
||||
'h|help' => \$help,
|
||||
'v|version' => \$version,
|
||||
)) {
|
||||
&print_usage;
|
||||
exit 1;
|
||||
}
|
||||
|
||||
if($help){
|
||||
print "genimage is a shell for the genimage located in /opt/xcat/share/xcat/netboot/<osfamily>.\n";
|
||||
&print_usage;
|
||||
exit 0;
|
||||
&print_usage;
|
||||
exit 0;
|
||||
}
|
||||
|
||||
if ($version){
|
||||
my $version = xCAT::Utils->Version();
|
||||
xCAT::MsgUtils->message("N", $version);
|
||||
exit 0;
|
||||
my $version = xCAT::Utils->Version();
|
||||
xCAT::MsgUtils->message("N", $version);
|
||||
exit 0;
|
||||
|
||||
}
|
||||
if (@ARGV > 0) {
|
||||
@@ -96,25 +104,20 @@ if ((!$imagename) && (!$profile) && (!$os) && (!$arch)) {
|
||||
if ($? == 0) {
|
||||
if (($tmpimgs) && ($tmpimgs !~ /^Could/)) { #Could is returned when the osimage table is empty
|
||||
my @images=split('\n', $tmpimgs);
|
||||
print color("reset");
|
||||
print "Do you want to re-genarate an existing image from the osimage table? ";
|
||||
print color("bold"), "[y/n] ",color("reset");
|
||||
print "[y/n] ";
|
||||
my $conf = <stdin>;
|
||||
chomp($conf);
|
||||
if($conf ne "" && $conf !~/N|n|[Nn][Oo]/) {
|
||||
$match = 0;
|
||||
while(1){
|
||||
print color("bold");
|
||||
print "Available images: \n";
|
||||
print color("reset");
|
||||
foreach(sort @images){
|
||||
$color && print color("green" );
|
||||
print " $_\n";
|
||||
$color && print color("reset");
|
||||
}
|
||||
# default is the first image cause in many cases
|
||||
print "Which image do you want to re-generate? [";
|
||||
print color("bold"), $images[0] , color("reset");
|
||||
print $images[0];
|
||||
print "] ";
|
||||
|
||||
my $img = <stdin>;
|
||||
@@ -132,7 +135,7 @@ if ((!$imagename) && (!$profile) && (!$os) && (!$arch)) {
|
||||
if ($match) {
|
||||
last;
|
||||
} else {
|
||||
print color("red bold"), "$img is not found in the osimage table.\n", color("reset");
|
||||
print "$img is not found in the osimage table.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -140,59 +143,6 @@ if ((!$imagename) && (!$profile) && (!$os) && (!$arch)) {
|
||||
}
|
||||
}
|
||||
|
||||
if ($imagename) {
|
||||
if ($os or $profile or $arch) {
|
||||
print "-o, -a and -p options are not allowed when a image name is specified.\n";
|
||||
exit 1;
|
||||
}
|
||||
#load the module in memory
|
||||
eval {require("$::XCATROOT/lib/perl/xCAT/Table.pm")};
|
||||
if ($@) {
|
||||
print $@;
|
||||
exit 1;
|
||||
}
|
||||
|
||||
#get the info from the osimage and linuximage tables
|
||||
my $osimagetab=xCAT::Table->new('osimage', -create=>1);
|
||||
if (!$osimagetab) {
|
||||
print "The osimage table cannot be opened.\n";
|
||||
exit 1;
|
||||
}
|
||||
my $linuximagetab=xCAT::Table->new('linuximage', -create=>1);
|
||||
if (!$linuximagetab) {
|
||||
print "The linuximage table cannot be opened.\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
(my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'provmethod');
|
||||
if (!$ref) {
|
||||
print "Cannot find image \'$imagename\' from the osimage table.\n";
|
||||
exit 1;
|
||||
}
|
||||
(my $ref1) = $linuximagetab->getAttribs({imagename => $imagename}, 'pkglist', 'nodebootif', 'otherifce', 'netdrivers', 'kernelver', 'permission');
|
||||
if (!$ref1) {
|
||||
print "Cannot find $imagename from the linuximage table\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
$os=$ref->{'osvers'};
|
||||
$arch=$ref->{'osarch'};
|
||||
$profile=$ref->{'profile'};
|
||||
my $provmethod=$ref->{'provmethod'};
|
||||
|
||||
unless ($os and $profile) {
|
||||
print"osimage.osvers and osimage.profile must be specified for the image $imagename in the database.\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
$drivers=$ref1->{'netdrivers'};
|
||||
$kernel=$ref1->{'kernelver'};
|
||||
$interface=$ref1->{'nodebootif'};
|
||||
$otherInterfaces=$ref1->{'otherifce'};
|
||||
$permission=$ref1->{'permission'};
|
||||
}
|
||||
|
||||
|
||||
|
||||
# get the install directory
|
||||
my $installdir = `gettab key=installdir site.value`;
|
||||
@@ -225,17 +175,13 @@ if ((!$imagename) && (!$os)){
|
||||
# now they have the OSes, make sure they select one that is available
|
||||
$match = 0;
|
||||
while(1){
|
||||
print color("bold");
|
||||
print "Available OSes: \n";
|
||||
print color("reset");
|
||||
foreach(@oses){
|
||||
$color && print color("green" );
|
||||
print " $_\n";
|
||||
$color && print color("reset");
|
||||
}
|
||||
# default is the first OS cause in many cases, they'll only have 1.
|
||||
print "Which OS do you want to build a image for? [";
|
||||
print color("bold"), $oses[0] , color("reset");
|
||||
print $oses[0] ;
|
||||
print "] ";
|
||||
|
||||
$os = <stdin>;
|
||||
@@ -253,15 +199,13 @@ if ((!$imagename) && (!$os)){
|
||||
if($match){
|
||||
last;
|
||||
}else{
|
||||
print color("red bold"), "$os is not found in '$installdir'\n", color("reset");
|
||||
print "$os is not found in '$installdir'\n";
|
||||
}
|
||||
}
|
||||
|
||||
chomp($os);
|
||||
}
|
||||
$color && print color("cyan");
|
||||
print " OS: $os\n";
|
||||
$color && print color("reset");
|
||||
|
||||
|
||||
|
||||
@@ -282,7 +226,7 @@ if ($osfamily =~ /sles/ && $osfamily =~ /sp/) {
|
||||
#print "OSfamily: $osfamily\n";
|
||||
$profDir = "$::XCATROOT/share/xcat/netboot/$osfamily";
|
||||
unless(-d $profDir){
|
||||
print color("red bold") , "Unable to find genimage script in $profDir\n", color("reset");
|
||||
print "Unable to find genimage script in $profDir\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
@@ -301,20 +245,18 @@ if ((!$imagename) && (!$profile)){
|
||||
}
|
||||
@profiles = sort keys %seen;
|
||||
if($#profiles eq -1){
|
||||
print color("red bold"), "There are no profiles in $::XCATROOT/share/xcat/netboot/$osfamily.\n", color("reset");
|
||||
print "There are no profiles in $::XCATROOT/share/xcat/netboot/$osfamily.\n";
|
||||
exit 1;
|
||||
}
|
||||
$match = 0;
|
||||
while(1){
|
||||
print color("bold"), "Available Profiles for $os: \n", color("reset");
|
||||
print "Available Profiles for $os: \n";
|
||||
foreach(@profiles){
|
||||
$color && print color("green");
|
||||
print " $_\n";
|
||||
$color && print color("reset");
|
||||
}
|
||||
# default is the first OS cause in many cases, they'll only have 1.
|
||||
print "Which profile do you want to use for $os? [";
|
||||
print color("bold"), $profiles[0] , color("reset");
|
||||
print "$profiles[0] ";
|
||||
print "] ";
|
||||
|
||||
$profile = <stdin>;
|
||||
@@ -333,15 +275,13 @@ if ((!$imagename) && (!$profile)){
|
||||
}
|
||||
}
|
||||
}
|
||||
$color && print color("cyan");
|
||||
print " Profile: $profile\n";
|
||||
$color && print color("reset");
|
||||
|
||||
# get the interface
|
||||
if ((!$imagename) && (!$interface)){
|
||||
while(1){
|
||||
print "Which network interface do you want the image to boot from? [";
|
||||
print color("bold"), "eth0" ,color("reset");
|
||||
print "eth0";
|
||||
print "] ";
|
||||
$interface = <stdin>;
|
||||
chomp($interface);
|
||||
@@ -350,11 +290,9 @@ if ((!$imagename) && (!$interface)){
|
||||
last;
|
||||
}else{
|
||||
print "You want your stateless machines to boot off of ";
|
||||
$color && print color("cyan");
|
||||
print "$interface";
|
||||
$color && print color("reset");
|
||||
print "? ";
|
||||
print color("bold"),"[Y/n] ", color("reset");
|
||||
print "[Y/n] ";
|
||||
my $conf = <stdin>;
|
||||
chomp($conf);
|
||||
if($conf eq ""){
|
||||
@@ -366,140 +304,82 @@ if ((!$imagename) && (!$interface)){
|
||||
}
|
||||
}
|
||||
}
|
||||
$color && print color("cyan");
|
||||
print " Interface: $interface\n";
|
||||
$color && print color("reset");
|
||||
|
||||
|
||||
# get drivers
|
||||
if ((!$imagename) && (!$drivers)) {
|
||||
while(1){
|
||||
print "Which network drivers will you need? (press enter if you're not sure) ";
|
||||
print color("bold"), "\n[igb,e1000e,e1000,bnx2,tg3] ", color("reset");
|
||||
|
||||
$drivers = <stdin>;
|
||||
chomp($drivers);
|
||||
if($drivers eq ""){
|
||||
$drivers = "igb,e1000e,e1000,bnx2,tg3";
|
||||
last;
|
||||
}else{
|
||||
print "You want to use the following driver(s): ";
|
||||
$color && print color("cyan");
|
||||
print $drivers;
|
||||
$color && color("reset");
|
||||
print "? ";
|
||||
print color("bold"),"[Y/n] ", color("reset");
|
||||
my $conf = <stdin>;
|
||||
chomp($conf);
|
||||
if($conf eq ""){
|
||||
last;
|
||||
}
|
||||
if($conf =~ /Y|y|[Yy][Ee][Ss]/){
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$color && print color("cyan");
|
||||
print " Network drivers: $drivers\n";
|
||||
$color && print color("reset");
|
||||
|
||||
# get other interfac
|
||||
if ((!$imagename) && (!$otherInterfaces)) {
|
||||
my $first=1;
|
||||
while(1){
|
||||
if ($first) {
|
||||
print "Do you need to set up other interfaces? ";
|
||||
$first = 0;
|
||||
} else {
|
||||
print "Do you need to set up more interfaces besides $otherInterfaces? ";
|
||||
}
|
||||
print color("bold"), "[y/n] ",color("reset");
|
||||
my $conf = <stdin>;
|
||||
chomp($conf);
|
||||
if($conf eq "" || $conf =~/N|n|[Nn][Oo]/){
|
||||
last;
|
||||
}else{
|
||||
print "What other interface do you need? ";
|
||||
my $tmp = <stdin>;
|
||||
chomp($tmp);
|
||||
if($tmp eq ""){
|
||||
last;
|
||||
}else{
|
||||
if ($otherInterfaces) {
|
||||
$otherInterfaces = "$otherInterfaces,$tmp";
|
||||
} else {
|
||||
$otherInterfaces=$tmp;
|
||||
}
|
||||
} #end confirmation
|
||||
} # end part where they don't want default
|
||||
} # end question loop
|
||||
} # end getting other interfaces
|
||||
if($otherInterfaces){
|
||||
$color && print color("cyan");
|
||||
print " Other Interfaces: $otherInterfaces\n";
|
||||
$color && color("reset");
|
||||
}
|
||||
|
||||
# get kernel info
|
||||
if ((!$imagename) && (!$kernel)) {
|
||||
while(1){
|
||||
print "Which kernel do you want to use? [";
|
||||
print color("bold"), "default" , color("reset");
|
||||
print "] ";
|
||||
$kernel = <stdin>;
|
||||
chomp($kernel);
|
||||
if($kernel eq ""){
|
||||
# special case of RHEL5.4 where kenrel must be specified or you
|
||||
# get some other one
|
||||
if($os =~ /rhels5.4|centos5.4|rhel5.4|sl5.4/){
|
||||
$kernel = "2.6.18-164.el5";
|
||||
}
|
||||
last;
|
||||
}else{
|
||||
print "You want to use: ";
|
||||
$color && print color("cyan");
|
||||
print $kernel;
|
||||
$color && print color("reset");
|
||||
print "? ";
|
||||
print color("bold"),"[Y/n] ", color("reset");
|
||||
my $conf = <stdin>;
|
||||
chomp($conf);
|
||||
if($conf eq ""){
|
||||
last;
|
||||
}
|
||||
if($conf =~ /Y|y|[Yy][Ee][Ss]/){
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
} # end unless kernel
|
||||
if($kernel){
|
||||
$color && print color("blue");
|
||||
print " Kernel: $kernel\n";
|
||||
$color && print color("reset");
|
||||
}
|
||||
|
||||
|
||||
print "Generating image:\n";
|
||||
my $cmd;
|
||||
print "Generating image: \n";
|
||||
my @arg;
|
||||
if ($imagename) {
|
||||
$cmd = "./genimage $imagename";
|
||||
} else {
|
||||
$cmd = "./genimage -i $interface -n $drivers -o $os -p $profile ";
|
||||
|
||||
if ($kernel) {
|
||||
$cmd .= " -k $kernel";
|
||||
}
|
||||
|
||||
if($otherInterfaces){
|
||||
$cmd .= " -r $otherInterfaces";
|
||||
}
|
||||
push @arg, "$imagename";
|
||||
}
|
||||
|
||||
$color && print color("cyan");
|
||||
print "cd $profDir\n";
|
||||
print "$cmd\n";
|
||||
$color && print color("reset");
|
||||
exec("cd $profDir; $cmd");
|
||||
if ($interface) {
|
||||
push @arg, "-i";
|
||||
push @arg, "$interface";
|
||||
}
|
||||
if ($drivers) {
|
||||
push @arg, "-n";
|
||||
push @arg, "$drivers";
|
||||
}
|
||||
if ($os) {
|
||||
push @arg, "-o";
|
||||
push @arg, "$os";
|
||||
}
|
||||
if ($profile) {
|
||||
push @arg, "-p";
|
||||
push @arg, "$profile";
|
||||
}
|
||||
if ($arch) {
|
||||
push @arg, "-a";
|
||||
push @arg, "$arch";
|
||||
}
|
||||
|
||||
if ($kernel) {
|
||||
push @arg, "-k";
|
||||
push @arg, "$kernel";
|
||||
}
|
||||
|
||||
if($otherInterfaces){
|
||||
push @arg, "-r";
|
||||
push @arg, "$otherInterfaces";
|
||||
}
|
||||
|
||||
if ($permission) {
|
||||
push @arg, "--permission";
|
||||
push @arg, "$permission";
|
||||
}
|
||||
|
||||
if ($rootlimit) {
|
||||
push @arg, "-l";
|
||||
push @arg, "$rootlimit";
|
||||
}
|
||||
|
||||
if($tmplimit) {
|
||||
push @arg, "-t";
|
||||
push @arg, "$tmplimit";
|
||||
}
|
||||
|
||||
if ($krpmver) {
|
||||
push @arg, "-g";
|
||||
push @arg, "$krpmver";
|
||||
}
|
||||
|
||||
if ($mode) {
|
||||
push @arg, "-m";
|
||||
push @arg, "$mode";
|
||||
}
|
||||
|
||||
if ($kerneldir) {
|
||||
push @arg, "--kerneldir";
|
||||
push @arg, "$kerneldir";
|
||||
}
|
||||
|
||||
|
||||
my $cmdref;
|
||||
push (@{$cmdref->{arg}}, @arg);
|
||||
$cmdref->{command}->[0] = "genimage";
|
||||
|
||||
xCAT::Client::submit_request($cmdref, \&xCAT::Client::handle_response);
|
||||
exit $xCAT::Client::EXITCODE;
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ use File::Basename;
|
||||
use xCAT::Client;
|
||||
use xCAT::MsgUtils;
|
||||
use xCAT::Usage;
|
||||
use strict;
|
||||
|
||||
sub updatenode_usage
|
||||
{
|
||||
@@ -35,8 +36,8 @@ Getopt::Long::Configure("bundling");
|
||||
# 'v|version' => \$::VERSION);
|
||||
# display the usage if -h or --help is specified
|
||||
|
||||
my $tmp=join(' ', @ARGV);
|
||||
if (!($tmp =~ /--help|-h|-v|--version/)) {
|
||||
my $tmp=" ".join(' ', @ARGV);
|
||||
if (!($tmp =~ / (--help|-h|-v|--version)/)) {
|
||||
my $arg=shift(@ARGV);
|
||||
# Set the noderange
|
||||
if ($arg !~ /^-/) {
|
||||
@@ -75,6 +76,7 @@ if (
|
||||
'v|version' => \$::VERSION,
|
||||
'V|verbose' => \$::VERBOSE,
|
||||
'F|sync' => \$::FILESYNC,
|
||||
'f|snsync' => \$::SNFILESYNC,
|
||||
'S|sw' => \$::SWMAINTENANCE,
|
||||
's|sn' => \$::SETSERVER,
|
||||
'P|scripts:s' => \$::RERUNPS,
|
||||
@@ -90,7 +92,7 @@ if (
|
||||
|
||||
if ($::HELP)
|
||||
{
|
||||
&updatenode_usage($callback);
|
||||
&updatenode_usage();
|
||||
exit 0;
|
||||
}
|
||||
|
||||
@@ -101,6 +103,11 @@ if ($::VERSION)
|
||||
print "$version\n";
|
||||
exit 0;
|
||||
}
|
||||
if (($::FILESYNC) && ($::SNFILESYNC)){ # only one
|
||||
my $msg = "Choose either -f to sync the service nodes, or -F to sync the nodes not both.";
|
||||
xCAT::MsgUtils->message("E", $msg);
|
||||
exit 1;
|
||||
}
|
||||
|
||||
|
||||
my $current_userid = getpwuid($>);
|
||||
|
||||
@@ -9,8 +9,10 @@ use strict;
|
||||
my %output;
|
||||
|
||||
my $option;
|
||||
my $printcount;
|
||||
|
||||
GetOptions("n"=>\$option);
|
||||
GetOptions("n"=>\$option,
|
||||
"c"=>\$printcount);
|
||||
|
||||
while (<STDIN>) {
|
||||
my $node;
|
||||
@@ -48,6 +50,10 @@ foreach my $output (keys %collated) {
|
||||
print "====================================\n";
|
||||
print "$nodes\n";
|
||||
print "====================================\n";
|
||||
if ($printcount) {
|
||||
print "Node count = ".scalar( keys %{$collated{$output}})." \n";
|
||||
print "====================================\n";
|
||||
}
|
||||
print $output;
|
||||
print "\n";
|
||||
}
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
xcat-client (2.5.0-2) stable; urgency=low
|
||||
|
||||
* Initial Debian build
|
||||
|
||||
-- Mark Hamzy <hamzy@us.ibm.com> Fri, 29 Apr 2011 14:40:34 -0500
|
||||
|
||||
xcat-client (2.5.0-1) stable; urgency=low
|
||||
|
||||
* Initial Release
|
||||
|
||||
-- OCF xCAT <xcat@ocf.co.uk> Mon, 25 Oct 2010 09:00:00 -0000
|
||||
|
||||
xcat-client (2.0-2) testing; urgency=low
|
||||
|
||||
* post-release snap
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
Source: xcat-client
|
||||
Section: admin
|
||||
Priority: extra
|
||||
Maintainer: Isaac Freeman <ifreeman@us.ibm.com>
|
||||
Maintainer: Isaac Freeman <ifreeman@us.ibm.com>, Arif Ali <aali@ocf.co.uk>
|
||||
Build-Depends: debhelper (>= 5)
|
||||
Standards-Version: 3.7.2
|
||||
|
||||
Package: xcat-client
|
||||
Architecture: any
|
||||
Depends: ${perl:Depends}, perl-xcat (>= 2.0-2), libsys-syslog-perl, libio-socket-ssl-perl, libxml-simple-perl, conserver-xcat-client
|
||||
Architecture: all
|
||||
Depends: ${perl:Depends}, nmap
|
||||
Description: Core executables and data of the xCAT management project
|
||||
xCAT-client provides the fundamental xCAT commands (chtab, chnode, rpower, etc) helpful in administrating systems at scale, with particular attention paid to large HPC clusters.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
usr/bin
|
||||
usr/sbin
|
||||
usr/share/man/man1
|
||||
usr/share/man/man3
|
||||
usr/share/man/man5
|
||||
usr/share/man/man8
|
||||
usr/share/doc
|
||||
opt/xcat/bin
|
||||
opt/xcat/sbin
|
||||
opt/xcat/share/man/man1
|
||||
opt/xcat/share/man/man3
|
||||
opt/xcat/share/man/man5
|
||||
opt/xcat/share/man/man8
|
||||
opt/xcat/share/doc
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
LICENSE.html
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
xcat-client_2.5.0-1_all.deb admin extra
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
misc:Depends=
|
||||
perl:Depends=perl
|
||||
|
||||
@@ -42,7 +42,7 @@ If the value of the attribute is a list then this option may be used to remove o
|
||||
|
||||
Change the current object name to the new-name which is specified by the -n option.
|
||||
The object of site, monitoring types cannot be supported.
|
||||
Note: For the B<-n> option, only one node can be handled.
|
||||
Note: For the B<-n> option, only one node can be handled. For some special nodes such as fsp, bpa, frame, cec etc., usually their hcp attributes are their names, if you use B<-n> option, please check if you need to change the hcp attribute to their new names.
|
||||
|
||||
=item I<noderange>
|
||||
|
||||
@@ -148,6 +148,12 @@ To change the node object name from node1 to node2.
|
||||
|
||||
chdef -t node -o node1 -n node2
|
||||
|
||||
=item 10.
|
||||
|
||||
To change the node hwtype, this command will change the value of ppc.nodetype.
|
||||
|
||||
chdef -t node -o node1 hwtype=lpar
|
||||
|
||||
=back
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
=head1 NAME
|
||||
|
||||
B<chvm> - Changes HMC- and IVM-managed partition profiles. For P7 IH, chvm could be used to change the octant configuration values for generating LPARs; change the I/O slots assignment to LPARs within the same CEC.
|
||||
B<chvm> - Changes HMC- and IVM-managed partition profiles. For Power 775, chvm could be used to change the octant configuration values for generating LPARs; change the I/O slots assignment to LPARs within the same CEC.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -18,9 +18,11 @@ B<chvm> [B<-V>| B<--verbose>] I<noderange> I<attr>=I<val> [I<attr>=I<val>...]
|
||||
|
||||
B<chvm> I<noderange> [B<-p> I<profile>]
|
||||
|
||||
B<chvm> I<noderange> B<-i id> B<-m> I<memory_interleaving> B<-r> I<partition_rule>
|
||||
B<chvm> I<noderange> [B<lparname>={B<*>|B<name>}]
|
||||
|
||||
=head2 VMware specific:
|
||||
B<chvm> I<noderange> B<-i id> [B<-m> I<memory_interleaving>] B<-r> I<partition_rule>
|
||||
|
||||
=head2 VMware/KVM specific:
|
||||
|
||||
B<chvm> I<noderange> [B<-a> I<size>] [B<-d> I<disk>] [B<-p> I<disk>] [B<--resize> B<disk>=I<size>] [B<--cpus> I<count>] [B<--mem> I<memory>]
|
||||
|
||||
@@ -40,7 +42,7 @@ chvm is also designed to assign the I/O slots to the new LPAR. Both the current
|
||||
|
||||
The administrator should use lsvm to get the profile content, and then edit the content, and add the node name with ":" manually before the I/O which will be assigned to the node. And then the profile can be piped into the chvm command, or changed with the -p flag.
|
||||
|
||||
=head2 VMware specific:
|
||||
=head2 VMware/KVM specific:
|
||||
|
||||
The chvm command modifes the vm specified in noderange. Calling with deregister or purge options at the same time as the resize option is not recommended.
|
||||
|
||||
@@ -84,11 +86,11 @@ Verbose output.
|
||||
|
||||
=item B<-i>
|
||||
|
||||
Starting numeric id of the newly created partitions. For P7 IH using Direct FSP Management, the id value only could be B<1>, B<5>, B<9>, B<13>, B<17>, B<21>, B<25> and B<29>.
|
||||
Starting numeric id of the newly created partitions. For Power 775 using Direct FSP Management, the id value only could be B<1>, B<5>, B<9>, B<13>, B<17>, B<21>, B<25> and B<29>.
|
||||
|
||||
=item B<-m>
|
||||
|
||||
memory interleaving. The value only could be B<interleaved> or B<non-interleaved>. B<non-interleaved> mode means the memory cannot be shared across the processors in an octant. B<interleaved> means the memory can be shared.
|
||||
memory interleaving. The value only could be B<interleaved> or B<non-interleaved>. B<non-interleaved> mode means the memory cannot be shared across the processors in an octant. B<interleaved> means the memory can be shared. The default value is B<non-interleaved> .
|
||||
|
||||
=item B<-r>
|
||||
|
||||
@@ -110,9 +112,13 @@ The octants configuration value for one Octant could be B<1>, B<2>, B<3>, B<4>,
|
||||
|
||||
Name of I/O slots assignment profile.
|
||||
|
||||
=item B<lparname>={B<*>|B<name>}
|
||||
|
||||
Set LPAR name for the specified lpars. If '*' specified, it means to get names from xCAT database and then set them for the specified lpars. If a string is specified, it only supports single node and the string will be set for the specified lpar. The user can use lsvm to check the lparnames for lpars.
|
||||
|
||||
=back
|
||||
|
||||
=head2 VMware specific:
|
||||
=head2 VMware/KVM specific:
|
||||
|
||||
=over 10
|
||||
|
||||
@@ -178,7 +184,7 @@ Output is similar to:
|
||||
|
||||
=head2 PPC (using Direct FSP Management) specific:
|
||||
|
||||
1. For P7 IH, to create a new partition lpar1 on the first octant of the cec cec01, lpar1 will use all the cpu and memory of the octant 0, enter:
|
||||
1. For Power 775, to create a new partition lpar1 on the first octant of the cec cec01, lpar1 will use all the cpu and memory of the octant 0, enter:
|
||||
|
||||
mkdef -t node -o lpar1 mgt=fsp groups=all parent=cec01 nodetype=lpar hcp=cec01
|
||||
|
||||
@@ -191,7 +197,7 @@ Output is similar to:
|
||||
lpar1: Success
|
||||
cec01: Please reboot the CEC cec1 firstly, and then use chvm to assign the I/O slots to the LPARs
|
||||
|
||||
2. For P7 IH, to create new partitions lpar1-lpar8 on the whole cec cec01, each LPAR will use all the cpu and memory of each octant, enter:
|
||||
2. For Power 775, to create new partitions lpar1-lpar8 on the whole cec cec01, each LPAR will use all the cpu and memory of each octant, enter:
|
||||
|
||||
mkdef -t node -o lpar1-lpar8 nodetype=lpar mgt=fsp groups=all parent=cec01 hcp=cec01
|
||||
|
||||
@@ -211,7 +217,7 @@ Output is similar to:
|
||||
lpar8: Success
|
||||
cec01: Please reboot the CEC cec1 firstly, and then use chvm to assign the I/O slots to the LPARs
|
||||
|
||||
3. For P7 IH cec1, to create new partitions lpar1-lpar9, the lpar1 will use 25% CPU and 25% memory of the first octant, and lpar2 will use the left CPU and memory of the first octant. lpar3-lpar9 will use all the cpu and memory of each octant, enter:
|
||||
3. For Power 775 cec1, to create new partitions lpar1-lpar9, the lpar1 will use 25% CPU and 25% memory of the first octant, and lpar2 will use the left CPU and memory of the first octant. lpar3-lpar9 will use all the cpu and memory of each octant, enter:
|
||||
|
||||
mkdef -t node -o lpar1-lpar9 mgt=fsp groups=all parent=cec1 nodetype=lpar hcp=cec1
|
||||
|
||||
@@ -246,7 +252,15 @@ then run the command:
|
||||
|
||||
chvm lpar1-lpar8 -p /tmp/lparfile
|
||||
|
||||
=head2 VMware specific:
|
||||
6. To change the LPAR name, enter:
|
||||
|
||||
chvm lpar1 lparname=test_lpar01
|
||||
|
||||
Output is similar to:
|
||||
|
||||
lpar1: Success
|
||||
|
||||
=head2 VMware/KVM specific:
|
||||
|
||||
chvm vm1 -a 8,16 --mem 512 --cpus 2
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ B<db2sqlsetup> {B<-i>|B<--init>}{<-S> | <-C>} [-o|--setupODBC] [B<-V>|B<--verbo
|
||||
|
||||
B<db2sqlsetup> {B<-o>|B<--setupODBC>} {<-S> | <-C>} [-V|--verbose]
|
||||
|
||||
B<db2sqlsetup> {B<-r>|B<--removal>}{<-S> | <-C>} [B<-V>|B<--verbose>]
|
||||
B<db2sqlsetup> {B<-p>|B<--passwd>} [<-S> | <-C>]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
@@ -54,9 +54,9 @@ Displays verbose messages.
|
||||
|
||||
The init option is used to setup an installed DB2 database on AIX or Linux (p-Series) so that xCAT can use the database. This must be combined with either the -S or -C flag to indicate whether we are setting up the Server or the Client. With the -S flag, it involves creating the xcatdb database, the xcatdb instance id, allowing access to the xcatdb database by the Management Node. It also backs up the current xCAT database and restores it into the newly setup xcatdb DB2 database. It creates the /etc/xcat/cfgloc file to point the xcatd daemon to the DB2 database and restarts the xcatd daemon using the database.
|
||||
|
||||
=item B<-r|--removal>
|
||||
=item B<-p|--passwd>
|
||||
|
||||
The removal option is used to remove DB2 from xCAT and uninstall DB2 from either management node or service node. This must be combined with either the -S or -C flag. It not only remove the configuration of DB2 but also un-install DB2.
|
||||
The password change option is to change the database access password for the DB2 xcatdb database. If -S is input then it will only change the password on the DB2 Server (MN). If -C is input it will only change on the DB2 clients (SN). If neither -S or -C are input with this flag, then it will change both the DB2 Server and Clients. When changing the password the xcatd daemon will be stopped and restarted. Any other tools accessing the database should also be stopped before changing and restarted after changing.
|
||||
|
||||
=item B<-S|-C>
|
||||
|
||||
@@ -104,8 +104,8 @@ B<db2sqlsetup> I<-r> I<-S>
|
||||
|
||||
=item *
|
||||
|
||||
To remove DB2 from xCAT MN:
|
||||
To change the DB2 xcatdb password on both the Management and Service Nodes:
|
||||
|
||||
B<db2sqlsetup> I<-r> I<-C>
|
||||
B<db2sqlsetup> I<-p>
|
||||
|
||||
=back
|
||||
|
||||
@@ -11,7 +11,7 @@ B<dumpxCATdb> [B<-h>|B<--help>] [B<-v>|B<--version>]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The dumpxCATdb command creates .csv files for all xCAT database tables and puts them in the directory given by the -p flag. These files can be used by the restorexCATdb command to restore the database.
|
||||
The dumpxCATdb command creates .csv files for xCAT database tables and puts them in the directory given by the -p flag. These files can be used by the restorexCATdb command to restore the database. The command will read the list of tables in the site.skiptables attribute and not backup those tables.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
@@ -24,7 +24,7 @@ B<-V> Verbose.
|
||||
|
||||
B<-a> All,without this flag the eventlog and auditlog will be skipped.
|
||||
|
||||
B<-p> Path to the directory to dump the tables.
|
||||
B<-p> Path to the directory to dump the tables. It will be created, if it does not exist.
|
||||
|
||||
|
||||
=head1 RETURN VALUE
|
||||
@@ -43,7 +43,9 @@ B<dumpxCATdb -p /tmp/db>
|
||||
|
||||
B<dumpxCATdb -a -p /tmp/db>
|
||||
|
||||
2. To have dumpxCATdb not backup the hosts or passwd table:
|
||||
|
||||
B<chtab key=skiptables site.value="hosts,passwd">
|
||||
|
||||
=head1 FILES
|
||||
|
||||
|
||||
@@ -4,9 +4,9 @@ B<genimage> - Generates a stateless image to be used for a diskless install.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
B<genimage> [B<-i> I<nodebootif>] [B<-n> I<nodenetdrivers>] B<-o> I<OS> B<-p> I<profile> [B<-l> I<rootlimit>] [B<-r> I<additional_nics>] [B<-k> I<kernel_version>] [B<--permission> I<permission>]
|
||||
B<genimage> B<-o> I<OS> B<-p> I<profile> [B<-i> I<nodebootif>] [B<-n> I<nodenetdrivers>] [B<-l> I<rootlimit>] [B<-r> I<additional_nics>] [B<-k> I<kernel_version>] [B<-g> I<krpm_version>] [B<-m> statelite] [B<--permission> I<permission>]
|
||||
|
||||
B<genimage> [B<-i> I<nodebootif>] [B<-n> I<nodenetdrivers>] [B<-o> I<OS>] [B<-l> I<rootlimit>] [B<-r> I<additional_nics>] [B<-k> I<kernel_version>] imagename
|
||||
B<genimage> [B<-o> I<OS>] [B<-l> I<rootlimit>] [B<-i> I<nodebootif>] [B<-n> I<nodenetdrivers>] [B<-r> I<additional_nics>] [B<-k> I<kernel_version>] [B<-g> I<krpm_version>] [B<-m> statelite] imagename
|
||||
|
||||
B<genimage> [B<-h> | B<--help> | B<-v> | B<--version>]
|
||||
|
||||
@@ -34,7 +34,9 @@ image, install any additional software you would like, or make modifications to
|
||||
B<packimage> to prepare the image for deployment.
|
||||
|
||||
The B<genimage> and B<geninitrd> commands will generate two initial ramdisks for B<statelite> and B<stateless>, one is B<initrd-statelite.gz>, the other one is B<initrd-stateless.gz>.
|
||||
|
||||
|
||||
The B<genimage> command can not be used in interactive mode. If any of the rpms or other scripts prompt, such as to accept a license agreement, you must use the genimage script specific to your OS from the /opt/xcat/share/xcat/netboot/<os> directory.
|
||||
|
||||
=head1 Parameters
|
||||
|
||||
I<imagename> specifies the name of a os image definition to be used. The specification for the image is storted in the I<osimage> table and I<linuximage> table.
|
||||
@@ -88,6 +90,15 @@ Other network interfaces (e.g. eth1) in the image that should be configured via
|
||||
Use this flag if you want to use a specific version of the kernel in the image. Defaults to the first kernel found
|
||||
in the install image.
|
||||
|
||||
=item B<-g> I<krpm_version>
|
||||
|
||||
This flag is for SLES only. Use this flag to specify the rpm version for kernel packages in the image. It must be present if -k flag is specified in the command for SLES.
|
||||
|
||||
=item B<-m> statelite
|
||||
|
||||
This flag is for Ubuntu, Debian and Fedora12 only. Use this flag to specify if you want to generate statelite image. The default is to generate stateless image for these three operating systems. For others, this flag is invalid because both stateless and statelite images will be generated with this command.
|
||||
|
||||
|
||||
=item B<-v|--version>
|
||||
|
||||
Display version.
|
||||
@@ -126,6 +137,8 @@ This would use the profile information from the /opt/xcat/share/xcat/netboot/fed
|
||||
|
||||
=head1 FILES
|
||||
|
||||
/opt/xcat/bin/genimage
|
||||
|
||||
/opt/xcat/share/xcat/netboot/<OS>/genimage
|
||||
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ B<getmacs> [B<-h>| B<--help> | B<-v>| B<--version>]
|
||||
|
||||
B<getmacs> I<noderange> [B<-F> I<filter>]
|
||||
|
||||
B<getmacs> I<noderange> [B<-V>| B<--verbose>] [B<-f>] [B<-d>] [B<--arp>] | [B<-D> [B<-S> I<server>] [B<-G> I<gateway>] [B<-C> I<client>] [B<--hfi>] [B<-o>]]
|
||||
B<getmacs> I<noderange> [B<-V>| B<--verbose>] [B<-f>] [B<-d>] [B<--arp>] | [B<-D> [B<-S> I<server>] [B<-G> I<gateway>] [B<-C> I<client>] [B<-o>]]
|
||||
|
||||
=head2 blade specific:
|
||||
|
||||
@@ -26,8 +26,6 @@ If no ping test performed, getmacs writes the first adapter MAC to the xCAT dat
|
||||
|
||||
For PPC (without HMC, using Direct FSP Management) specific:
|
||||
|
||||
If users run "B<getmacs> I<noderange>" directly for P7 IH LPARs, it will return the HIF MAC addresses which are owned by the LPARs. If run B<getmacs> with ping test by default, it will return the physical mac address. If run getmacs with ping test using B<--hfi>, it will return the HFI MAC address.
|
||||
|
||||
Note: If network adapters are physically assigned to LPARs, getmacs cannot read the MAC addresses unless perform ping test, since there is no HMC command to read them and getmacs has to login to open formware. And if the LPARs has never been activated before, getmacs need to be performed with the option "B<-D>" to get theirs MAC addresses.
|
||||
|
||||
=head1 OPTIONS
|
||||
@@ -64,10 +62,6 @@ B<-h>
|
||||
|
||||
Display usage message.
|
||||
|
||||
B<--hfi>
|
||||
|
||||
Read HFI MAC address. This option mush be used with [B<-D>] option to perform ping test.
|
||||
|
||||
B<-o>
|
||||
|
||||
Read MAC address when the lpar is in openfirmware state. This option mush be used with [B<-D>] option to perform ping test. Before use B<-o>, the lpar must be in openfirmware state.
|
||||
@@ -152,27 +146,16 @@ Output is similar to:
|
||||
#Type Location Code MAC Address Full Path Name Ping Result
|
||||
ent U9133.55A.10B7D1G-V12-C4-T1 8e:e2:24:5c:f0:04 /vdevice/l-lan@30000004 successful virtual
|
||||
|
||||
6. To retrieve the MAC address for P7 IH LPARl using Direct FSP Management without ping test and display the result only, enter:
|
||||
6. To retrieve the MAC address for Power 775 LPAR using Direct FSP Management without ping test and display the result only, enter:
|
||||
|
||||
getmacs c250f07c04ap01 -d
|
||||
getmacs lpar4 -d
|
||||
|
||||
Output is similar to:
|
||||
|
||||
c250f07c04ap01:
|
||||
lpar4:
|
||||
#Type Phys_Port_Loc MAC_Address Adapter Port_Group Phys_Port Logical_Port VLan VSwitch Curr_Conn_Speed
|
||||
HFI N/A 02:00:02:00:00:04:|02:00:02:00:00:05:|02:00:02:00:00:06 N/A N/A N/A N/A N/A N/A N/A
|
||||
|
||||
7. To retrieve the HFI MAC address for P7 IH LPARl using Direct FSP Management ping test and display the result only, enter:
|
||||
|
||||
getmacs c250f07c07ap01 -d -D --hfi
|
||||
|
||||
Output is similar to:
|
||||
|
||||
c250f07c07ap01:
|
||||
# Type Location Code MAC Address Full Path Name Ping Result
|
||||
hfi-ent U78A9.001.0123456-P1 020004200004 /hfi-iohub@300000000000000/hfi-ethernet@0 unsuccessful physical
|
||||
hfi-ent U78A9.001.0123456-P1 020004200004 /hfi-iohub@300000000000000/hfi-ethernet@1 unsuccessful physical
|
||||
|
||||
=head1 FILES
|
||||
|
||||
/opt/xcat/bin/getmacs
|
||||
|
||||
@@ -8,7 +8,7 @@ B<lsdef> [B<-h>|B<--help>] [B<-t> I<object-types>]
|
||||
|
||||
B<lsdef> [B<-V>|B<--verbose>] [B<-l>|B<--long>] [B<-s>|B<--short>] [B<-a>|B<--all>] [B<-S>]
|
||||
[B<-t> I<object-types>] [B<-o> I<object-names>] [B<-z>|B<--stanza>] [B<-i> I<attr-list>]
|
||||
[[B<-w> I<attr>==I<val>] [B<-w> I<attr>=~I<val>] ...] [I<noderange>]
|
||||
[B<-c>|B<--compress>] [B<--osimage>][[B<-w> I<attr>==I<val>] [B<-w> I<attr>=~I<val>] ...] [I<noderange>]
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -25,6 +25,12 @@ in the xCAT database.
|
||||
|
||||
Display all definitions.
|
||||
|
||||
=item B<-c|--compress>
|
||||
|
||||
Display information in compressed mode, each output line has format "<object name>: <data>".
|
||||
The output can be passed to command xcoll or xdshbak for formatted output.
|
||||
The -c flag must be used with -i flag.
|
||||
|
||||
=item B<-h|--help>
|
||||
|
||||
Display usage message.
|
||||
@@ -54,6 +60,10 @@ See the "noderange" man page for details on supported formats.
|
||||
|
||||
A set of comma delimited object names.
|
||||
|
||||
=item B<--osimage>
|
||||
|
||||
Show all the osimage information for the node.
|
||||
|
||||
=item B<-t> I<object-types>
|
||||
|
||||
A set of comma delimited object types. Use the help option to get a list of valid objects.
|
||||
@@ -185,8 +195,14 @@ The hidden nodes are FSP/BPAs.
|
||||
|
||||
lsdef -S
|
||||
|
||||
=back
|
||||
|
||||
=item 15.
|
||||
|
||||
To list the nodes status and use xcoll to format the output.
|
||||
|
||||
lsdef -t node -i status -c | xcoll
|
||||
|
||||
=back
|
||||
|
||||
=head1 FILES
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
=head1 NAME
|
||||
|
||||
B<lshwconn> - Use this command to display the connection status for FSP and BPA nodes.
|
||||
B<lshwconn> - Use this command to display the connection status for CEC and Frame nodes.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -18,7 +18,7 @@ B<lshwconn> I<noderange> B<-T> I<tooltype>
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This command is used to display the connection status for FSP and BPA node.
|
||||
This command is used to display the connection status for CEC and Frame node.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
@@ -34,7 +34,7 @@ Verbose output.
|
||||
|
||||
=item B<-T>
|
||||
|
||||
The tooltype is used to communicate to the FSP/BPA. The value could be lpar or fnm. The tooltype value lpar is for xCAT and fnm is for CNM.
|
||||
The tooltype is used to communicate to the CEC/Frame. The value could be lpar or fnm. The tooltype value lpar is for xCAT and fnm is for CNM.
|
||||
|
||||
=back
|
||||
|
||||
@@ -51,9 +51,9 @@ The tooltype is used to communicate to the FSP/BPA. The value could be lpar or f
|
||||
|
||||
=item 1.
|
||||
|
||||
To display connection status for all FSP nodes in node group fsp:
|
||||
To display connection status for all CEC nodes in node group CEC:
|
||||
|
||||
lshwconn fsp
|
||||
lshwconn cec
|
||||
|
||||
Output is similar to:
|
||||
|
||||
@@ -62,7 +62,7 @@ Output is similar to:
|
||||
|
||||
=item 2.
|
||||
|
||||
To display connection status for BPA node frame1:
|
||||
To display connection status for Frame node frame1:
|
||||
|
||||
lshwconn frame1
|
||||
|
||||
@@ -73,9 +73,9 @@ Output is similar to:
|
||||
|
||||
=item 3.
|
||||
|
||||
To display connection status for all FSP nodes in node group fsp to hardware server, and using lpar tooltype:
|
||||
To display connection status for all CEC nodes in node group CEC to hardware server, and using lpar tooltype:
|
||||
|
||||
lshwconn fsp -T lpar
|
||||
lshwconn cec -T lpar
|
||||
|
||||
Output is similar to:
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ I<lsslp [-h| --help]>
|
||||
I<lsslp [-v| --version]>
|
||||
|
||||
|
||||
I<lsslp [<noderange>] [-V| --verbose] [-i ip[,ip..]][-w][-r|-x|-z][-n][-s CEC|FRAME|MM|IVM|RSA|HMC][-t tries][-m][-I][-e command][-c [timeinterval[timeinterval,..]]][-C counts][-T timeout][--vpdtable][-M vpd|switchport][--updatehosts][-makedhcp][--resetnet]>
|
||||
I<lsslp [<noderange>] [-V| --verbose] [-i ip[,ip..]][-w][-r|-x|-z][-n][-s CEC|FRAME|MM|IVM|RSA|HMC][-t tries][-m][-I][-e command][-c [timeinterval[timeinterval,..]]][-C counts][-T timeout][--vpdtable][-M vpd|switchport][--updatehosts][-makedhcp]>
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
@@ -65,8 +65,6 @@ B<-C> The number of the nodes expected to find, specified by the user.
|
||||
B<-T> The number in seconds to limite the time costing of lsslp. Must be used with the flag -C.
|
||||
See the help of flag -C for more details.
|
||||
|
||||
B<--resetnet> Login to hardwares and reset the network interfaces. This option is only valid
|
||||
for the nodes with different attributes: ip and otherinterfaces in hosts table.
|
||||
|
||||
B<-s> Service type interested in discovering.
|
||||
|
||||
@@ -243,20 +241,9 @@ Output is similar to:
|
||||
ip=50.0.0.1
|
||||
|
||||
|
||||
6. To list all the FSPs and reset their network interfaces to get new IP from dhcp server, enter:
|
||||
6. To list all the CECs, enter:
|
||||
|
||||
lsslp -s CEC --resetnet
|
||||
|
||||
Output is similar to:
|
||||
|
||||
Start to reset network..
|
||||
|
||||
Reset network failed nodes:
|
||||
|
||||
Reset network succeed nodes:
|
||||
Server-8233-E8B-SN1000ECP-A,Server-9119-FHA-SN0275995-B,Server-9119-FHA-SN0275995-A,
|
||||
|
||||
Reset network finished.
|
||||
lsslp -s CEC
|
||||
|
||||
device type-model serial-number side ip-addresses hostname
|
||||
FSP 9117-MMB 105EBEP A-1 20.0.0.138 20.0.0.138
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
=head1 NAME
|
||||
|
||||
B<lsvm> - Lists partition profile information for HMC- and IVM-managed nodes. For P7 IH, it lists the LPARs' I/O slots information and CEC configuration.
|
||||
B<lsvm> - Lists partition profile information for HMC- and IVM-managed nodes. For Power 775, it lists the LPARs' I/O slots information and CEC configuration.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -14,7 +14,7 @@ B<lsvm> [B<-a>| B<--all>] I<noderange>
|
||||
|
||||
=head2 For PPC (using Direct FSP Management):
|
||||
|
||||
B<lsvm> I<noderange>
|
||||
B<lsvm> [B<-l>| B<--long>] I<noderange>
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
@@ -22,7 +22,7 @@ B<lsvm> I<noderange>
|
||||
|
||||
=head2 For PPC (using Direct FSP Management):
|
||||
|
||||
For P7 IH, lsvm lists all partition I/O slots information for the partitions specified in noderange. If noderange is a CEC, it gets the CEC's pump mode value, octant's memory interleaving value, the all the octants configure value, and all the I/O slots information
|
||||
For Power 775, lsvm lists all partition I/O slots information for the partitions specified in noderange. If noderange is a CEC, it gets the CEC's pump mode value, octant's memory interleaving value, the all the octants configure value, and all the I/O slots information
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
@@ -43,6 +43,10 @@ B<-a>
|
||||
|
||||
List all the profiles for one partition
|
||||
|
||||
B<-l>
|
||||
|
||||
Show lparnames for lpars.
|
||||
|
||||
=head1 RETURN VALUE
|
||||
|
||||
0 The command completed successfully.
|
||||
@@ -63,13 +67,13 @@ Output is similar to:
|
||||
|
||||
lsvm cec01
|
||||
|
||||
Output is similar to:
|
||||
g Output is similar to:
|
||||
|
||||
cec01: name=10-B7D1G,lpar_name=10-B7D1G,lpar_id=1,os_type=vioserver,all_resources=0,min_mem=512, desired_mem=2048,max_mem=2048,proc_mode=shared,min_proc_units=0.10,desired_proc_units=0.40, max_proc_units=4.00,min_procs=1,desired_procs=4,max_procs=4,sharing_mode=uncap,uncap_weight=128, "io_slots=21010002/none/0,21010003/none/0,21010004/none/0,21020003/none/0,21020004/none/0,21030003/none/0,21030004/none/0,21040003/none/0,21040004/none/0",lpar_io_pool_ids=none,max_virtual_slots=48, "virtual_serial_adapters=0/server/1/any//any/1,1/server/1/any//any/1,10/client/0/2/lp2/0/0,12/client/0/3/lp3/0/0,14/client/0/4/lp4/0/0","virtual_scsi_adapters=11/server/2/lp2/2/0,13/server/3/lp3/2/0,15/server/4/lp4/2/0","virtual_eth_adapters=3/0/1//1/0,4/0/2//1/0,5/0/3//1/0,6/0/4//1/0",boot_mode=norm,conn_monitoring=0,auto_start=0,power_ctrl_lpar_ids=none
|
||||
name=lp2,lpar_name=lp2,lpar_id=2,os_type=aixlinux,all_resources=0,min_mem=128,desired_mem=1024,max_mem=1024,proc_mode=shared,min_proc_units=0.10,desired_proc_units=0.10,max_proc_units=4.00,min_procs=1,desired_procs=1,max_procs=4,sharing_mode=uncap,uncap_weight=128,io_slots=none,lpar_io_pool_ids=none,max_virtual_slots=6, "virtual_serial_adapters=0/server/1/any//any/1,1/server/1/any//any/1",virtual_scsi_adapters=2/client/1/10-7D1G/11/1,virtual_eth_adapters=4/0/1//0/0,boot_mode=norm,conn_monitoring=0,auto_start=0,power_ctrl_lpar_ids=none
|
||||
name=lp3,lpar_name=lp3,lpar_id=3,os_type=aixlinux,all_resources=0,min_mem=128,desired_mem=128,max_mem=128,proc_mode=shared,min_proc_units=0.10,desired_proc_units=0.10,max_proc_units=4.00,min_procs=1,desired_procs=1,max_procs=4,sharing_mode=uncap,uncap_weight=128,io_slots=none,lpar_io_pool_ids=none,max_virtual_slots=6, "virtual_serial_adapters=0/server/1/any//any/1,1/server/1/any//any/1",virtual_scsi_adapters=2/client/1/10-B7D1G/13/1,virtual_eth_adapters=4/0/1//0/0,boot_mode=of,conn_monitoring=0,auto_start=1, power_ctrl_lpar_ids=none
|
||||
|
||||
3. For P7 IH, to list the I/O slot information of lpar1, enter:
|
||||
3. For Power 775, to list the I/O slot information of lpar1, enter:
|
||||
|
||||
lsvm lpar1
|
||||
|
||||
@@ -79,7 +83,16 @@ Output is similar to:
|
||||
1: 513/U78A9.001.0123456-P1-C15/0x21010201/2/1
|
||||
1: 512/U78A9.001.0123456-P1-C16/0x21010200/2/1
|
||||
|
||||
4. For P7 IH, to list the I/O slot information and octant configuration of cec1, enter:
|
||||
To list the lparname of lpars, enter:
|
||||
|
||||
lsvm lpar1 -l
|
||||
|
||||
Output is similar to:
|
||||
lpar1: 1: 514/U78A9.001.0123456-P1-C17/0x21010202/2/1
|
||||
lpar1: 1: 513/U78A9.001.0123456-P1-C15/0x21010201/2/1
|
||||
lpar1: 1: 512/U78A9.001.0123456-P1-C16/0x21010200/2/1
|
||||
|
||||
4. For Power 775, to list the I/O slot information and octant configuration of cec1, enter:
|
||||
|
||||
lsvm cec1
|
||||
|
||||
@@ -104,6 +117,31 @@ Output is similar to:
|
||||
9: 528/U78A9.001.0123456-P1-C12/0x21010210/2/9
|
||||
cec1: PendingPumpMode=1,CurrentPumpMode=1,OctantCount=8:OctantID=0,PendingOctCfg=5,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=1,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=2,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=3,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=4,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=5,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=6,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=7,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;
|
||||
|
||||
To list the lparname of lpars, enter:
|
||||
|
||||
lsvm cec1 -l
|
||||
|
||||
Output is similar to:
|
||||
|
||||
lpar1: 1: 514/U78A9.001.0123456-P1-C17/0x21010202/2/1
|
||||
lpar1: 1: 513/U78A9.001.0123456-P1-C15/0x21010201/2/1
|
||||
lpar1: 1: 512/U78A9.001.0123456-P1-C16/0x21010200/2/1
|
||||
lpar13: 13: 537/U78A9.001.0123456-P1-C9/0x21010219/2/13
|
||||
lpar13: 13: 536/U78A9.001.0123456-P1-C10/0x21010218/2/13
|
||||
lpar17: 17: 545/U78A9.001.0123456-P1-C7/0x21010221/2/17
|
||||
lpar17: 17: 544/U78A9.001.0123456-P1-C8/0x21010220/2/17
|
||||
lpar21: 21: 553/U78A9.001.0123456-P1-C5/0x21010229/2/21
|
||||
lpar21: 21: 552/U78A9.001.0123456-P1-C6/0x21010228/2/21
|
||||
lpar24: 25: 569/U78A9.001.0123456-P1-C1/0x21010239/2/25
|
||||
lpar25: 25: 561/U78A9.001.0123456-P1-C3/0x21010231/2/25
|
||||
lpar25: 25: 560/U78A9.001.0123456-P1-C4/0x21010230/2/25
|
||||
lpar29: 29: 568/U78A9.001.0123456-P1-C2/0x21010238/2/29
|
||||
lpar5: 5: 521/U78A9.001.0123456-P1-C13/0x21010209/2/5
|
||||
lpar5: 5: 520/U78A9.001.0123456-P1-C14/0x21010208/2/5
|
||||
lpar9: 9: 529/U78A9.001.0123456-P1-C11/0x21010211/2/9
|
||||
lpar9: 9: 528/U78A9.001.0123456-P1-C12/0x21010210/2/9
|
||||
cec1: PendingPumpMode=1,CurrentPumpMode=1,OctantCount=8:OctantID=0,PendingOctCfg=5,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=1,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=2,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=3,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=4,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=5,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=6,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;OctantID=7,PendingOctCfg=1,CurrentOctCfg=1,PendingMemoryInterleaveMode=2,CurrentMemoryInterleaveMode=2;
|
||||
|
||||
=head1 FILES
|
||||
|
||||
/opt/xcat/bin/lsvm
|
||||
|
||||
@@ -6,15 +6,29 @@ B<mkdsklsnode> - Use this xCAT command to define and initialize AIX/NIM diskless
|
||||
|
||||
B<mkdsklsnode [-h|--help ]>
|
||||
|
||||
B<mkdsklsnode [-V|--verbose] [-f|--force] [--hfi] [-n|--newname] [-i osimage_name] [-p|--primarySN] [-b|--backupSN] noderange [attr=val [attr=val ...]]>
|
||||
B<mkdsklsnode [-V|--verbose] [-f|--force] [-n|--newname] [-i osimage_name] [-l location] [-p|--primarySN] [-b|--backupSN] noderange [attr=val [attr=val ...]]>
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This xCAT command can be used to define and/or initialize AIX/NIM diskless machines. Once this step is completed the xCAT rnetboot command may be used to initiate a network boot of the nodes.
|
||||
This xCAT command can be used to define and/or initialize AIX/NIM diskless machines. Once this step is completed the xCAT B<rnetboot> command may be used to initiate a network boot of the nodes.
|
||||
|
||||
The command can be used to define and initialize a new NIM machine object or it may be used to reinitialize an existing machine to use a different operating system image.
|
||||
The command can be used to define and initialize a new NIM machine object or it can be used to reinitialize an existing machine to use a different operating system image.
|
||||
|
||||
Note: The length of a NIM object name must be no longer than 39 characters.
|
||||
This command will also create a NIM resolv_conf resource to be used when installing the node. If a resolv_conf resource is not already included in the xCAT osimage definition and if the "domain" and "nameservers" values are set then a new resolv_conf resource will be created and the name will be added to the osimage definition.
|
||||
|
||||
The "domain" and "nameservers" attributes can be set in either the xCAT "network" definition used by the nodes or in the xCAT cluster "site" definition. The setting in the "network" definition will take priority.
|
||||
|
||||
The "nameservers" value can either be set to a specific IP address or the "<xcatmaster>" key word. The "<xcatmaster>" key word means that the value of the "xcatmaster" attribute of the node definition will be used in the /etc/resolv.conf file. (I.e. The name of the install server as known by the node.)
|
||||
|
||||
You can set the "domain" and "nameservers" attributes by using the B<chdef> command. For example:
|
||||
|
||||
=over 3
|
||||
|
||||
chdef -t network -o clstr_net domain=cluster.com nameservers=<xcatmaster>
|
||||
|
||||
=back
|
||||
|
||||
If the "domain" and "nameservers" attributes are not set in either the nodes "network" definition or the "site" definition then no new NIM resolv_conf resource will be created.
|
||||
|
||||
If you are using xCAT service nodes the B<mkdsklsnode> command will automatically determine the correct server(s) for the node and create the NIM definitions on that server(s).
|
||||
|
||||
@@ -24,9 +38,9 @@ You can use the "-n" option of the mkdsklsnode command to create and initialize
|
||||
|
||||
You can use the force option to reinitialize a node if it already has resources allocated or it is in the wrong NIM state. This option will reset the NIM node and deallocate resources before reinititializing. Use this option with caution since reinitializing a node will stop the node if it is currently running.
|
||||
|
||||
After the mkdsklsnode command completes you can use the lsnim command to check the NIM node definition to see if it is ready for booting the node. ("lsnim -l <nim_node_name>").
|
||||
After the mkdsklsnode command completes you can use the B<lsnim> command to check the NIM node definition to see if it is ready for booting the node. ("lsnim -l <nim_node_name>").
|
||||
|
||||
You can supply your own scripts to be run on the mn or on the service node (if their is hierarchy) for a node during the mkdsklsnode command. Such scripts are called B<prescripts>. They should be copied to /install/prescripts dirctory. A table called I<prescripts> is used to specify the scripts and their associated actions. The scripts to be run at the beginning of the mkdsklsnode command are stored in the 'begin' column of I<prescripts> table. The scripts to be run at the end of the mkdsklsnode command are stored in the 'end' column of I<prescripts> table. Please run 'tabdump prescripts -d' command for details. An example for the 'begin' or the 'end' column is: I<diskless:myscript1,myscript2>. The following two environment variables will be passed to each script: NODES contains all the names of the nodes that need to run the script for and ACTION contains the current current nodeset action, in this case "diskless". If I<#xCAT setting:MAX_INSTANCE=number> is specified in the script, the script will get invoked for each node in parallel, but no more than I<number> of instances will be invoked at at a time. If it is not sepcified, the script will be invoked once for all the nodes.
|
||||
You can supply your own scripts to be run on the management node or on the service node (if their is hierarchy) for a node during the B<mkdsklsnode> command. Such scripts are called B<prescripts>. They should be copied to /install/prescripts dirctory. A table called I<prescripts> is used to specify the scripts and their associated actions. The scripts to be run at the beginning of the B<mkdsklsnode> command are stored in the 'begin' column of I<prescripts> table. The scripts to be run at the end of the B<mkdsklsnode> command are stored in the 'end' column of I<prescripts> table. Please run 'tabdump prescripts -d' command for details. An example for the 'begin' or the 'end' column is: I<diskless:myscript1,myscript2>. The following two environment variables will be passed to each script: NODES contains all the names of the nodes that need to run the script for and ACTION contains the current current nodeset action, in this case "diskless". If I<#xCAT setting:MAX_INSTANCE=number> is specified in the script, the script will get invoked for each node in parallel, but no more than I<number> of instances will be invoked at at a time. If it is not sepcified, the script will be invoked once for all the nodes.
|
||||
|
||||
|
||||
=head1 OPTIONS
|
||||
@@ -80,13 +94,13 @@ Use the force option to reinitialize the NIM machines.
|
||||
|
||||
Display usage message.
|
||||
|
||||
=item B<--hfi>
|
||||
|
||||
Create a new NIM machine booting from HFI interfaces.
|
||||
|
||||
=item B<-i image_name>
|
||||
|
||||
The name of an existing xCAT osimage definition. If this information is not provided on the command line the code checks the node definition for the value of the "profile" attribute. If the "-i" value is provided on the command line then that value will be used to set the "profile" attribute of the node definiions.
|
||||
The name of an existing xCAT osimage definition. If this information is not provided on the command line the code checks the node definition for the value of the "provmethod" attribute. If the "-i" value is provided on the command line then that value will be used to set the "provmethod" attribute of the node definitions.
|
||||
|
||||
=item B<-l|--location>
|
||||
|
||||
The directory location to use when creating new NIM resolv_conf resources. The default location is /install/nim.
|
||||
|
||||
=item B<-n|--newname>
|
||||
|
||||
@@ -132,7 +146,7 @@ B<mkdsklsnode -i 61spot node01>
|
||||
|
||||
=item 2
|
||||
|
||||
Initialize all AIX diskless nodes contained in the xCAT node group called "aixnodes" using the image definitions pointed to by the "profile" attribute of the xCAT node definitions.
|
||||
Initialize all AIX diskless nodes contained in the xCAT node group called "aixnodes" using the image definitions pointed to by the "provmethod" attribute of the xCAT node definitions.
|
||||
|
||||
B<mkdsklsnode aixnodes>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
=head1 NAME
|
||||
|
||||
B<mkhwconn> - Sets up connections for FSP and BPA nodes to HMC nodes or hardware server.
|
||||
B<mkhwconn> - Sets up connections for CEC and Frame nodes to HMC nodes or hardware server.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
@@ -10,13 +10,13 @@ B<mkhwconn> [B<-v>| B<--version>]
|
||||
|
||||
=head2 PPC (with HMC) specific:
|
||||
|
||||
B<mkhwconn> [B<-V>| B<--verbose>] I<noderange> B<-t>
|
||||
B<mkhwconn> [B<-V>| B<--verbose>] I<noderange> B<-t> [B<--port> I<port_value>]
|
||||
|
||||
B<mkhwconn> [B<-V>| B<--verbose>] Inoderange B<-s>
|
||||
B<mkhwconn> [B<-V>| B<--verbose>] I<noderange> B<-s> [I<hmcnode> B<--port> I<port_value>]
|
||||
|
||||
B<mkhwconn> [B<-V>| B<--verbose>] I<noderange> B<-p> I<hmc> [B<-P> I<passwd>]
|
||||
B<mkhwconn> [B<-V>| B<--verbose>] I<noderange> B<-p> I<hmc> [B<-P> I<passwd>] [B<--port> I<port_value>]
|
||||
|
||||
=head2 PPC (without HMC, using Direct FSP Management) specific:
|
||||
=head2 PPC (using Direct FSP Management) specific:
|
||||
|
||||
B<mkhwconn> I<noderange> B<-t> [B<-T tooltype>] [B<--port> I<port_value>]
|
||||
|
||||
@@ -24,26 +24,26 @@ B<mkhwconn> I<noderange> B<-t> [B<-T tooltype>] [B<--port> I<port_value>]
|
||||
|
||||
For PPC (with HMC) specific:
|
||||
|
||||
This command is used to set up connections for FSP and BPA nodes to HMC nodes. (If the connection already exists, it will not break it.)
|
||||
This command is useful when you have multiple HMCs, each of which will manage a subset of the FSPs/BPAs. Use B<mkhwconn> to tell
|
||||
each HMC which FSPs/BPAs it should manage. When using this, you should turn off the self-discovery on each HMC. You also need
|
||||
to put all the HMCs and all the BPAs on a single flat service network.
|
||||
This command is used to set up connections for CEC and Frame nodes to HMC nodes. (If the connection already exists, it will not break it.)
|
||||
This command is useful when you have multiple HMCs, each of which will manage a subset of the CECs/Frames. Use B<mkhwconn> to tell
|
||||
each HMC which CECs/Frames it should manage. When using this, you should turn off the self-discovery on each HMC. You also need
|
||||
to put all the HMCs and all the Frames on a single flat service network.
|
||||
|
||||
When B<-t> is specified, this command reads the connection information from the xCAT ppc table (e.g. the parent attribute), and read the user/password from the ppcdirect table. Then this command will assign FSP nodes and BPA nodes to HMC nodes.
|
||||
When B<-t> is specified, this command reads the connection information from the xCAT ppc table (e.g. the parent attribute), and read the user/password from the ppcdirect table. Then this command will assign CEC nodes and Frame nodes to HMC nodes.
|
||||
|
||||
When B<-p> is specified, this command gets the connection information from command line arguments. If B<-P> is not specified, the default password for FSP and BPA nodes is used.
|
||||
When B<-p> is specified, this command gets the connection information from command line arguments. If B<-P> is not specified, the default password for CEC and Frame nodes is used.
|
||||
|
||||
The flag B<-s> is used to make the connection between the frame and its Service focal point(HMC). The sfp of the frame should be specified in ppc table.
|
||||
The flag B<-s> is used to make the connection between the frame and its Service focal point(HMC). Makehwconn will also set the connections between the CECs within this Frame and the HMC. The sfp of the frame/CEC can either be defined in ppc table beforehand or specified in command line after the flag -s. If the user use mkhwconn noderange -s HMC_name, it will not only make the connections but also set the sfp attributes for these nodes in PPC table.
|
||||
|
||||
In any case, before running this command, the FSP and BPA nodes need be defined with correct nodetype.nodetype value (fsp or bpa) and nodehm.mgt value (hmc).
|
||||
In any case, before running this command, the CEC and Frame nodes need be defined with correct nodetype.nodetype value (cec or frame) and nodehm.mgt value (hmc).
|
||||
|
||||
Note: If a CEC (FSP) belongs to a frame, which has a BPA installed, this CEC should not be assigned to an HMC individually. Instead, the whole frame (BPA) should be assigned to the HMC.
|
||||
Note: If a CEC belongs to a frame, which has a BPA installed, this CEC should not be assigned to an HMC individually. Instead, the whole frame should be assigned to the HMC.
|
||||
|
||||
For PPC (without HMC, using Direct FSP Management) specific:
|
||||
For PPC (using Direct FSP Management) specific:
|
||||
|
||||
It is used to set up connections for FSP and BPA node to Hardware Server on management node (or service node ). It only could be done according to the node definition in xCAT DB. And this command will try to read the user/password from the ppcdirect table firstly. If fails, then read them from passwd table. Commonly , the username is B<HMC>. If using the B<ppcdirect> table, each FSP/BPA and user/password should be stored in B<ppcdirect> table. If using the B<passwd> table, the key should be "B<fsp>" or "B<bpa>", and the related user/password are stored in B<passwd> table.
|
||||
It is used to set up connections for CEC and Frame node to Hardware Server on management node (or service node ). It only could be done according to the node definition in xCAT DB. And this command will try to read the user/password from the ppcdirect table firstly. If fails, then read them from passwd table. Commonly , the username is B<HMC>. If using the B<ppcdirect> table, each CEC/Frame and user/password should be stored in B<ppcdirect> table. If using the B<passwd> table, the key should be "B<cec>" or "B<frame>", and the related user/password are stored in B<passwd> table.
|
||||
|
||||
When B<--port> is specified, this command will create the connections for FSPs/BPAs whose side in B<vpd> table is equal to port value.
|
||||
When B<--port> is specified, this command will create the connections for CECs/Frames whose side in B<vpd> table is equal to port value.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
@@ -55,7 +55,7 @@ Display usage message.
|
||||
|
||||
=item B<-t>
|
||||
|
||||
Read connection information from xCAT DB (ppc and ppcdirect tables). Use this option if you need to connect multiple FSPs/BPAs
|
||||
Read connection information from xCAT DB (ppc and ppcdirect tables). Use this option if you need to connect multiple CECs/Frames
|
||||
to multiple HMCs in a single command.
|
||||
|
||||
=item B<-p>
|
||||
@@ -64,19 +64,19 @@ The HMC node name. Only one HMC nodes can be specified by this flag. To setup co
|
||||
|
||||
=item B<-P>
|
||||
|
||||
The password of HMC based FSP/BPA login user(Default user name is 'HMC'). This flag is optional.
|
||||
The password of HMC based CEC/Frame login user(Default user name is 'HMC'). This flag is optional.
|
||||
|
||||
=item B<-T>
|
||||
|
||||
The tooltype is used to communicate to the FSP/BPA. The value could be B<lpar> or B<fnm>. The tooltype value B<lpar> is for xCAT and B<fnm> is for CNM. The default value is "B<lpar>".
|
||||
The tooltype is used to communicate to the CEC/Frame. The value could be B<lpar> or B<fnm>. The tooltype value B<lpar> is for xCAT and B<fnm> is for CNM. The default value is "B<lpar>".
|
||||
|
||||
=item B<--port>
|
||||
|
||||
The port value specify which side will be used to create the connection to the FSP/BPA. The value could be "B<0>" or "B<1>". If this port value is not specfied in the command, it will use the default value "B<0>". If the port value is "B<0>", in the vpd table, the side column should be B<A-0> and B<B-0>; If the port value is "B<1>", the side column should be B<A-1> and B<B-1>.
|
||||
The port value specify which side will be used to create the connection to the CEC/Frame. The value could be "B<0>" or "B<1>". If this port value is not specfied in the command, it will use the default value "B<0>". If the port value is "B<0>", in the vpd table, the side column should be B<A-0> and B<B-0>; If the port value is "B<1>", the side column should be B<A-1> and B<B-1>. When making hardware connection between CEC/Frame and HMC, the port is used to specify the fsp/bpa port of the cec/frame.
|
||||
|
||||
=item B<-s>
|
||||
|
||||
The flag -s is used to make the connection between the frame and its Service Focal Point(HMC). -s flag is not supposed to work with other functional flags. The noderange should be frame.
|
||||
The flag -s is used to make the connection between the frame and its Service Focal Point(HMC). -s flag is not supposed to work with other functional flags.
|
||||
|
||||
=item B<-V|--verbose>
|
||||
|
||||
@@ -96,21 +96,33 @@ Verbose output.
|
||||
|
||||
=item 1.
|
||||
|
||||
To setup the connection for all FSP nodes in node group fsp to HMC node, according to the definition in xCAT DB:
|
||||
To setup the connection for all CEC nodes in node group cec to HMC node, according to the definition in xCAT DB:
|
||||
|
||||
mkhwconn fsp -t
|
||||
mkhwconn cec -t
|
||||
|
||||
=item 2.
|
||||
|
||||
To setup the connection for BPA nodes in node group frame_grp1 to HMC node hmc1, with password 'abc123':
|
||||
To setup the connection for Frame nodes in node group frame to HMC node hmc1, with password 'abc123':
|
||||
|
||||
mkhwconn frame_grp1 -p hmc1 -P abc123
|
||||
mkhwconn frame -p hmc1 -P abc123
|
||||
|
||||
=item 3.
|
||||
|
||||
To setup the connections for all FSP nodes in node group fsp to hardware server, and the tooltype value is lpar:
|
||||
To setup the connections for all CEC nodes in node group cec to hardware server, and the tooltype value is lpar:
|
||||
|
||||
mkhwconn fsp -t -T lpar
|
||||
mkhwconn cec -t -T lpar
|
||||
|
||||
=item 4.
|
||||
|
||||
To setup the connections for all cecs nodes in node group cec to hardware server, and the tooltype value is lpar, and the port value is 1:
|
||||
|
||||
mkhwconn cec -t -T lpar --port 1
|
||||
|
||||
=item 5.
|
||||
|
||||
To setup the connection between the frame and it's SFP node. This command will also set the connections between the CECs within this frame and their SFP node. User need to define HMC_name in the database in advance, but no need to set the sfp attribute for these node, xCAT will set the HMC_name as ppc.sfp for these nodes. The CECs within this frame should have the same sfp attribute as the frame.
|
||||
|
||||
mkhwconn cec -s HMC_name -P HMC_passwd
|
||||
|
||||
=back
|
||||
|
||||
|
||||
@@ -20,8 +20,7 @@ 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
|
||||
http://xcat.svn.sourceforge.net/viewvc/xcat/xcat-core/trunk/
|
||||
xCAT-client/share/doc/xCAT2.SetupMySQL.pdf.
|
||||
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.
|
||||
|
||||
=head1 OPTIONS
|
||||
@@ -57,15 +56,13 @@ This option runs during update, it will take all the host from the input file (p
|
||||
|
||||
This option sets up the ODBC /etc/../odbcinst.ini, /etc/../odbc.ini and the .odbc.ini file in roots home directory will be created and initialized to run off the xcatdb MySQL database.
|
||||
See "Add ODBC Support" in
|
||||
http://xcat.svn.sourceforge.net/viewvc/xcat/xcat-core/trunk/
|
||||
xCAT-client/share/doc/xCAT2.SetupMySQL.pdf
|
||||
https://sourceforge.net/apps/mediawiki/xcat/index.php?title=Setting_Up_MySQL_as_the_xCAT_DB
|
||||
|
||||
=item B<-L|--LL>
|
||||
|
||||
Additional database configuration specifically for the LoadLeveler product.
|
||||
See "Add ODBC Support" in
|
||||
http://xcat.svn.sourceforge.net/viewvc/xcat/xcat-core/trunk/
|
||||
xCAT-client/share/doc/xCAT2.SetupMySQL.pdf
|
||||
https://sourceforge.net/apps/mediawiki/xcat/index.php?title=Setting_Up_MySQL_as_the_xCAT_DB
|
||||
|
||||
=back
|
||||
|
||||
@@ -95,7 +92,7 @@ B<mysqlsetup> I<-i>
|
||||
|
||||
=item *
|
||||
|
||||
To add hosts from /tmp/xcat/hostlist that can access the xcatdb database in MySQL:
|
||||
Add hosts from /tmp/xcat/hostlist that can access the xcatdb database in MySQL:
|
||||
|
||||
B<mysqlsetup> I<-u> I<-f /tmp/xcat/hostlist>
|
||||
|
||||
|
||||
@@ -6,15 +6,33 @@ B<nimnodeset> - Use this xCAT command to initialize AIX/NIM standalone machines.
|
||||
|
||||
B<nimnodeset [-h|--help ]>
|
||||
|
||||
B<nimnodeset [-V|--verbose] [-f|--force] [-i osimage_name] [-p|--primarySN] [-b|--backupSN] noderange [attr=val [attr=val ...]]>
|
||||
B<nimnodeset [-V|--verbose] [-f|--force] [-i osimage_name] [-l location] [-p|--primarySN] [-b|--backupSN] noderange [attr=val [attr=val ...]]>
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This xCAT command can be used to initialize AIX/NIM standalone machines. Once this step is completed the xCAT rnetboot command may be used to initiate a network boot of the nodes.
|
||||
This xCAT command can be used to initialize AIX/NIM standalone machines. Once this step is completed the xCAT B<rnetboot> command may be used to initiate a network boot of the nodes.
|
||||
|
||||
If you are using xCAT service nodes the B<nimnodeset> command will automatically determine the correct server(s) for the node and do the initialization on that server(s).
|
||||
|
||||
The osimage_name is the name of an xCAT osimage definition that contains the list of NIM resources to use when initializing the nodes. If the osimage_name is not provided on the command line the code checks the node definition for the value of the "profile" attribute (which is the name of an osimage definition). If the osimage_image is provided on the command line then the code will also set the "profile" attribute of the node definiions.
|
||||
The osimage_name is the name of an xCAT osimage definition that contains the list of NIM resources to use when initializing the nodes. If the osimage_name is not provided on the command line the code checks the node definition for the value of the "provmethod" attribute (which is the name of an osimage definition). If the osimage_image is provided on the command line then the code will also set the "provmethod" attribute of the node definiions.
|
||||
|
||||
This command will also create a NIM resolv_conf resource to be used when installing the node. If a resolv_conf resource is not already included in the xCAT osimage definition and if the "domain" and "nameservers" values are set then a new
|
||||
resolv_conf resource will be created and the name will be added to the osimage definition.
|
||||
|
||||
The "domain" and "nameservers" attributes can be set in either the xCAT "network" definition used by the nodes or in the xCAT cluster "site" definition. The setting in the "network" definition will take priority.
|
||||
|
||||
The "nameservers" value can either be set to a specific IP address or the "<xcatmaster>" key word. The "<xcatmaster>" key word means that the value of the "xcatmaster" attribute of the node definition will be used in the /etc/resolv.conf file. (I.e. The name of the install server as known by the node.)
|
||||
|
||||
You can set the "domain" and "nameservers" attributes by using the B<chdef> command. For example:
|
||||
|
||||
=over 3
|
||||
|
||||
chdef -t network -o clstr_net domain=cluster.com nameservers=<xcatmaster>
|
||||
|
||||
=back
|
||||
|
||||
If the "domain" and "nameservers" attributes are not set in either the nodes "network" definition or the "site" definition then no new NIM resolv_conf resource
|
||||
will be created.
|
||||
|
||||
You can specify additional attributes and values using the "attr=val" command line option. This information will be passed on to the underlying call to the NIM "nim -o bos_inst" command. See the NIM documentation for information on valid command line options for the nim command. The "attr" must correspond to a NIM attribute supported for the NIM "bos_inst" operation. Information provided by the "attr=val" option will take precedence over the information provided in the osimage definition.
|
||||
|
||||
@@ -22,9 +40,9 @@ The force option can be used to reinitialize a node if it already has resources
|
||||
|
||||
This command will also create a NIM script resource to enable the xCAT support for user-provided customization scripts.
|
||||
|
||||
After the nimnodeset command completes you can use the lsnim command to check the NIM node definition to see if it is ready for booting the node. ("lsnim -l <nim_node_name>").
|
||||
After the B<nimnodeset> command completes you can use the B<lsnim> command to check the NIM node definition to see if it is ready for booting the node. ("lsnim -l <nim_node_name>").
|
||||
|
||||
You can supply your own scripts to be run on the mn or on the service node (if their is hierarchy) for a node during the nimnodeset command. Such scripts are called B<prescripts>. They should be copied to /install/prescripts dirctory. A table called I<prescripts> is used to specify the scripts and their associated actions. The scripts to be run at the beginning of the nimnodeset command are stored in the 'begin' column of I<prescripts> table. The scripts to be run at the end of the nimnodeset command are stored in the 'end' column of I<prescripts> table. Please run 'tabdump prescripts -d' command for details. An example for the 'begin' or the 'end' column is: I<standalone:myscript1,myscript2>. The following two environment variables will be passed to each script: NODES contains all the names of the nodes that need to run the script for and ACTION contains the current current nodeset action, in this case "standalone". If I<#xCAT setting:MAX_INSTANCE=number> is specified in the script, the script will get invoked for each node in parallel, but no more than I<number> of instances will be invoked at at a time. If it is not sepcified, the script will be invoked once for all the nodes.
|
||||
You can supply your own scripts to be run on the management node or on the service node (if their is hierarchy) for a node during the B<nimnodeset> command. Such scripts are called B<prescripts>. They should be copied to /install/prescripts dirctory. A table called I<prescripts> is used to specify the scripts and their associated actions. The scripts to be run at the beginning of the B<nimnodeset> command are stored in the 'begin' column of I<prescripts> table. The scripts to be run at the end of the B<nimnodeset> command are stored in the 'end' column of I<prescripts> table. Please run 'tabdump prescripts -d' command for details. An example for the 'begin' or the 'end' column is: I<standalone:myscript1,myscript2>. The following two environment variables will be passed to each script: NODES contains all the names of the nodes that need to run the script for and ACTION contains the current nodeset action, in this case "standalone". If I<#xCAT setting:MAX_INSTANCE=number> is specified in the script, the script will get invoked for each node in parallel, but no more than I<number> of instances will be invoked at at a time. If it is not sepcified, the script will be invoked once for all the nodes.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
@@ -51,6 +69,11 @@ Display usage message.
|
||||
|
||||
The name of an existing xCAT osimage definition.
|
||||
|
||||
=item B<-l|--location>
|
||||
|
||||
The directory location to use when creating new NIM resolv_conf resources. The d
|
||||
efault location is /install/nim.
|
||||
|
||||
=item B<-p|--primarySN>
|
||||
|
||||
When using backup service nodes only update the primary. The default is to update both the primary and backup service nodes.
|
||||
@@ -89,7 +112,7 @@ B<nimnodeset -i 61gold node01>
|
||||
|
||||
=back
|
||||
|
||||
2) Initialize all AIX nodes contained in the xCAT node group called "aixnodes" using the image definitions pointed to by the "profile" attribute of the xCAT node definitions.
|
||||
2) Initialize all AIX nodes contained in the xCAT node group called "aixnodes" using the image definitions pointed to by the "provmethod" attribute of the xCAT node definitions.
|
||||
|
||||
=over 5
|
||||
|
||||
|
||||
@@ -29,10 +29,12 @@ B<Power 7 server specific :>
|
||||
B<renergy> I<noderange> [-V] { all | [savingstatus] [dsavingstatus]
|
||||
[cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin]
|
||||
[averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed]
|
||||
[syssbpower] [sysIPLtime] }
|
||||
[syssbpower] [sysIPLtime] [fsavingstatus] [ffoMin] [ffoVmin]
|
||||
[ffoTurbo] [ffoNorm] [ffovalue]}
|
||||
|
||||
B<renergy> I<noderange> [-V] { savingstatus={on | off}
|
||||
| dsavingstatus={on-norm | on-maxp | off}
|
||||
| dsavingstatus={on-norm | on-maxp | off}
|
||||
| fsavingstatus={on | off} | ffovalue=MHZ
|
||||
| cappingstatus={on | off} | cappingwatt=watt
|
||||
| cappingperc=percentage }
|
||||
|
||||
@@ -142,7 +144,7 @@ B<Set>: savingstatus
|
||||
|
||||
=back
|
||||
|
||||
B<8233-E8B>, B<8236-E8C>, B<9125-F2C>
|
||||
B<8233-E8B>, B<8236-E8C>
|
||||
|
||||
=over 4
|
||||
|
||||
@@ -157,6 +159,22 @@ cappingperc
|
||||
|
||||
=back
|
||||
|
||||
B<9125-F2C>
|
||||
|
||||
=over 4
|
||||
|
||||
Supported attributes:
|
||||
|
||||
B<Query>: savingstatus,dsavingstatus,cappingstatus,cappingmin,
|
||||
cappingmax,cappingvalue,cappingsoftmin,averageAC,averageDC,
|
||||
ambienttemp,exhausttemp,CPUspeed,syssbpower,sysIPLtime,
|
||||
fsavingstatus,ffoMin,ffoVmin,ffoTurbo,ffoNorm,ffovalue
|
||||
|
||||
B<Set>: savingstatus,dsavingstatus,cappingstatus,cappingwatt,
|
||||
cappingperc,fsavingstatus,ffovalue
|
||||
|
||||
=back
|
||||
|
||||
=back
|
||||
|
||||
Note:
|
||||
@@ -331,6 +349,62 @@ B<savingstatus> is in turn off status.
|
||||
|
||||
Query the current exhaust temperature. (Unit is centigrade)
|
||||
|
||||
=item B<ffoMin>
|
||||
|
||||
Query the minimum cpu frequency which can be set for FFO. (Fixed
|
||||
Frequency Override)
|
||||
|
||||
=item B<ffoNorm>
|
||||
|
||||
Query the maximum cpu frequency which can be set for FFO.
|
||||
|
||||
=item B<ffoTurbo>
|
||||
|
||||
Query the advertised maximum cpu frequency (selling point).
|
||||
|
||||
=item B<ffoVmin>
|
||||
|
||||
Query the minimum cpu frequency which can be set for dropping down
|
||||
the voltage to save power. That means when you drop the cpu
|
||||
frequency from the ffoVmin to ffoVmin, the voltage won't change,
|
||||
then there's no obvious power to be saved.
|
||||
|
||||
=item B<ffovalue>
|
||||
|
||||
Query the current value of FFO.
|
||||
|
||||
=item B<ffovalue>=B<MHZ>
|
||||
|
||||
Set the current value of FFO. The valid value of ffovalue should
|
||||
be between the ffoMin and ffoNorm.
|
||||
|
||||
Note1: Due to the limitation of firmware, the frequency in the range
|
||||
3501 MHz - 3807 MHz can NOT be set to ffovalue. This range may be
|
||||
changed in future.
|
||||
|
||||
Note2: The setting will take effect only when the fsavingstatus is in
|
||||
'on' status. But you need to set the ffovalue to a valid value before
|
||||
enabling the fsavingstatus. (It's a limitation of the initial firmware
|
||||
and will be fixed in future.)
|
||||
|
||||
The ffovalue setting operation needs about 1 minute to take effect.
|
||||
|
||||
=item B<fsavingstatus>
|
||||
|
||||
Query the status of FFO. The result should be 'on' or 'off'.
|
||||
'on' - enable; 'off' - disable.
|
||||
|
||||
=item B<fsavingstatus>={B<on> │ B<off>}
|
||||
|
||||
Set the status of FFO. The value must be 'on' or 'off'.
|
||||
|
||||
'on' - enable. It will take effect only when the B<ffovalue>
|
||||
has been set to a valid value.
|
||||
|
||||
'off' -disable. It will take effect immediately.
|
||||
|
||||
Note: See the Note2 of ffovalue=MHZ.
|
||||
|
||||
=item B<maxCPUspeed>
|
||||
|
||||
Query the maximum processor frequency. (Unit is MHz)
|
||||
|
||||
@@ -11,7 +11,7 @@ B<restorexCATdb> [B<-h>|B<--help>] [B<-v>|B<--version>]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The restorexCATdb command restores the xCAT database tables from the directory given by the -p flag.
|
||||
The restorexCATdb command restores the xCAT database tables from the directory given by the -p flag. The site table skiptables attribute can be set to a list of tables not to restore. See man dumpxCATdb.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
|
||||
@@ -26,7 +26,9 @@ The command scans the specified directory structure for Firmware update package
|
||||
|
||||
The POWER5 and POWER6 systems contain several components that use Licensed Internal Code. The B<rflash> command supports two of these components: the managed system (also known as the Central Electronics Complex, or CEC) and the power subsystem (also known as the Bulk Power Assembly (BPA) or Bulk Power Controller (BPC)). Some POWER5 managed systems can be attached to a power subsystem. These power subsystems can support multiple managed systems. When the B<rflash> command is invoked, xCAT will determine the managed system or power subsystem associated with that CEC and perform the update.
|
||||
|
||||
The B<noderange> can be an CEC or CEC list, a Lpar or Lpar list and a BPA or BPA list. But CEC (or Lpar) and BPA B<can't> be used at the same time. When the I<noderange> is an CEC or CEC list, B<rflash> will upgrade the firmware of the CEC or CECs in the cec list. If I<noderange> is a Lpar or Lpar list, B<rflash> will update Licensed Internal Code (LIC) on HMC-attached POWER5 and POWER6 pSeries nodes. If I<noderange> is a BPA or BPA list, B<rflash> will update Licensed Internal Code (LIC) of the power subsystem on HMC-attached POWER5 and POWER6 pSeries nodes. The I<noderange> can also be the specified node groups. You can specify a comma or space-separated list of node group ranges. See the I<noderange> man page for detailed usage information.
|
||||
The B<noderange> can be an CEC or CEC list, a Lpar or Lpar list and a Frame or Frame list. But CEC (or Lpar) and Frame B<can't> be used at the same time. When the I<noderange> is an CEC or CEC list, B<rflash> will upgrade the firmware of the CEC or CECs in the cec list. If I<noderange> is a Lpar or Lpar list, B<rflash> will update Licensed Internal Code (LIC) on HMC-attached POWER5 and POWER6 pSeries nodes, and POWER7 systems using Direct FSP management. If I<noderange> is a Frame or Frame list, B<rflash> will update Licensed Internal Code (LIC) of the power subsystem on HMC-attached POWER5 and POWER6 pSeries nodes. The I<noderange> can also be the specified node groups. You can specify a comma or space-separated list of node group ranges. See the I<noderange> man page for detailed usage information.
|
||||
|
||||
=head2 PPC (with HMC) specific:
|
||||
|
||||
The B<rflash> command uses the B<xdsh> command to connect to the HMC controlling the given managed system and perform the updates. Before run B<rflash>, please use B<rspconfig> to check if the related HMC ssh is enabled. If enable a HMC ssh connection, please use B<rspconfig> comamnd.
|
||||
|
||||
@@ -48,6 +50,12 @@ B<IMPORTANT!> If the power subsystem is recycled, all of its attached managed s
|
||||
|
||||
If it outputs B<"Timeout waiting for prompt"> during the upgrade, please set the B<"ppctimeout"> larger in the B<site> table. After the upgrade, remeber to change it back. If run the B<"rflash"> command on an AIX management node, need to make sure the value of B<"useSSHonAIX"> is B<"yes"> in the site table.
|
||||
|
||||
=head2 PPC (using Direct FSP Management) specific:
|
||||
|
||||
In currently Direct FSP/BPA Management, our B<rflash> doesn't support B<concurrent> value of B<--activate> flag, and only support B<disruptive>. The B<disruptive> option will cause any affected systems that are powered on to be powered down before installing and activating the update. So we require that the systems should be powered off before do the firmware update.
|
||||
|
||||
For Power 775, the rflash command takes effect on the primary and secondary FSPs or BPAs almost in parallel.
|
||||
|
||||
=head1 B<Options>
|
||||
|
||||
=over 7
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user